<?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: Daemon Data</title>
    <description>The latest articles on DEV Community by Daemon Data (@datadaemon).</description>
    <link>https://dev.to/datadaemon</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%2F4109982%2F69e40a34-1b05-4c30-bffd-e4ffe06ac6f2.png</url>
      <title>DEV Community: Daemon Data</title>
      <link>https://dev.to/datadaemon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datadaemon"/>
    <language>en</language>
    <item>
      <title>What do homes actually sell for in Abu Dhabi? 27,636 registered sales in 2026, by district and bedrooms</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Thu, 12 Nov 2026 12:38:55 +0000</pubDate>
      <link>https://dev.to/datadaemon/what-do-homes-actually-sell-for-in-abu-dhabi-27636-registered-sales-in-2026-by-district-and-1pne</link>
      <guid>https://dev.to/datadaemon/what-do-homes-actually-sell-for-in-abu-dhabi-27636-registered-sales-in-2026-by-district-and-1pne</guid>
      <description>&lt;p&gt;Property portals in Abu Dhabi show asking prices. The Abu Dhabi Real Estate Centre (ADREC) publishes something better on its market-data page: a table of the sales themselves, one row per sale, with the price, the size, the district, the project, the number of bedrooms, and whether the sale was off-plan or ready, first sale or resale. The table goes back to January 2019. It is a web page with filters, not an API.&lt;/p&gt;

&lt;p&gt;I read &lt;strong&gt;the whole table on 12 November 2026: 127,379 sales from 2 January 2019 to 11 November 2026&lt;/strong&gt;, and then looked at this year: &lt;strong&gt;27,636 sales between 1 January and 11 November 2026.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The median apartment sold for AED 2.01 million&lt;/strong&gt; (about USD 547,000). The middle half of 17,009 apartment sales was AED 1.35-3.13 million; 10% were below AED 888,000 and 10% above AED 4.76 million.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per square metre, the median apartment sold for AED 20,700&lt;/strong&gt; (about AED 1,920 per square foot). The median apartment is 95 sqm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The median villa sold for AED 6.9 million and the median townhouse for AED 2.73 million&lt;/strong&gt; (5,622 and 1,865 sales).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three of every four sales were off-plan&lt;/strong&gt;: 21,406 of 27,636 (77.5%). In 2019 it was 31%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026 passed all of 2025 with seven weeks to go.&lt;/strong&gt; 27,636 sales worth AED 137.5 billion by 11 November, against 25,114 sales and AED 93.4 billion in the whole of 2025. Over the same dates last year there were 20,854 sales worth AED 76.2 billion: +33% by count, +80% by value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where the sales are:&lt;/strong&gt; Al Reem Island (6,199 apartment sales), Yas Island (4,166) and Al Saadiyat Island (1,861) for apartments; Al Hidayriyyat (Hudayriyat Island) for villas, with 2,844 of the year's 7,487 villa and townhouse sales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are sales only. ADREC's own headline totals also count mortgages and other transactions, so they are larger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight years in one table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Sales&lt;/th&gt;
&lt;th&gt;Value (AED bn)&lt;/th&gt;
&lt;th&gt;Off-plan&lt;/th&gt;
&lt;th&gt;Resale share&lt;/th&gt;
&lt;th&gt;Median price (AED)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;9,990&lt;/td&gt;
&lt;td&gt;20.4&lt;/td&gt;
&lt;td&gt;31.0%&lt;/td&gt;
&lt;td&gt;33.0%&lt;/td&gt;
&lt;td&gt;1,200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;16,775&lt;/td&gt;
&lt;td&gt;46.8&lt;/td&gt;
&lt;td&gt;47.6%&lt;/td&gt;
&lt;td&gt;32.8%&lt;/td&gt;
&lt;td&gt;1,228,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;7,270&lt;/td&gt;
&lt;td&gt;18.2&lt;/td&gt;
&lt;td&gt;52.8%&lt;/td&gt;
&lt;td&gt;47.9%&lt;/td&gt;
&lt;td&gt;1,520,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;9,130&lt;/td&gt;
&lt;td&gt;25.5&lt;/td&gt;
&lt;td&gt;57.4%&lt;/td&gt;
&lt;td&gt;43.5%&lt;/td&gt;
&lt;td&gt;1,727,451&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;15,106&lt;/td&gt;
&lt;td&gt;54.7&lt;/td&gt;
&lt;td&gt;69.7%&lt;/td&gt;
&lt;td&gt;29.3%&lt;/td&gt;
&lt;td&gt;1,942,457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;16,358&lt;/td&gt;
&lt;td&gt;52.7&lt;/td&gt;
&lt;td&gt;61.5%&lt;/td&gt;
&lt;td&gt;39.1%&lt;/td&gt;
&lt;td&gt;1,795,419&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;25,114&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;td&gt;66.5%&lt;/td&gt;
&lt;td&gt;30.6%&lt;/td&gt;
&lt;td&gt;2,238,891&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 to 11 Nov&lt;/td&gt;
&lt;td&gt;27,636&lt;/td&gt;
&lt;td&gt;137.5&lt;/td&gt;
&lt;td&gt;77.5%&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;td&gt;2,600,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The median price is the median of what sold that year, across all property types. It moves with the mix (more villas, more new launches) as well as with prices, so it is not a price index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apartments by size
&lt;/h2&gt;

&lt;p&gt;Apartments, duplexes and penthouses sold whole in 2026, 17,009 sales:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layout&lt;/th&gt;
&lt;th&gt;Sales&lt;/th&gt;
&lt;th&gt;Median price (AED)&lt;/th&gt;
&lt;th&gt;Median AED per sqm&lt;/th&gt;
&lt;th&gt;Median size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Studio&lt;/td&gt;
&lt;td&gt;2,994&lt;/td&gt;
&lt;td&gt;932,250&lt;/td&gt;
&lt;td&gt;20,295&lt;/td&gt;
&lt;td&gt;45 sqm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 bed&lt;/td&gt;
&lt;td&gt;5,946&lt;/td&gt;
&lt;td&gt;1,717,000&lt;/td&gt;
&lt;td&gt;21,021&lt;/td&gt;
&lt;td&gt;82 sqm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 beds&lt;/td&gt;
&lt;td&gt;5,998&lt;/td&gt;
&lt;td&gt;2,835,500&lt;/td&gt;
&lt;td&gt;20,668&lt;/td&gt;
&lt;td&gt;132 sqm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 beds&lt;/td&gt;
&lt;td&gt;1,717&lt;/td&gt;
&lt;td&gt;4,287,102&lt;/td&gt;
&lt;td&gt;21,070&lt;/td&gt;
&lt;td&gt;195 sqm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The price per square metre barely changes with size: about AED 20,300-21,100 from studios to three-bedroom flats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Off-plan costs more than ready.&lt;/strong&gt; Off-plan apartments sold at a median of AED 22,149 per sqm (13,860 sales) and ready apartments at AED 16,326 (3,149 sales), a gap of 36%. Most of that is location and age: this year's launches are on Yas, Saadiyat and Hudayriyat, and the ready stock that changes hands is older and more often on the mainland.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apartments by district
&lt;/h2&gt;

&lt;p&gt;Districts with at least 150 apartment sales in 2026. The last column is the same median for 2025 where at least 50 sales existed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;District&lt;/th&gt;
&lt;th&gt;Sales&lt;/th&gt;
&lt;th&gt;Median price (AED)&lt;/th&gt;
&lt;th&gt;Median AED per sqm&lt;/th&gt;
&lt;th&gt;2025 median AED per sqm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Al Reem Island&lt;/td&gt;
&lt;td&gt;6,199&lt;/td&gt;
&lt;td&gt;1,750,000&lt;/td&gt;
&lt;td&gt;18,652&lt;/td&gt;
&lt;td&gt;15,270&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;4,166&lt;/td&gt;
&lt;td&gt;2,024,408&lt;/td&gt;
&lt;td&gt;25,461&lt;/td&gt;
&lt;td&gt;19,230&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Saadiyat Island&lt;/td&gt;
&lt;td&gt;1,861&lt;/td&gt;
&lt;td&gt;3,796,691&lt;/td&gt;
&lt;td&gt;37,946&lt;/td&gt;
&lt;td&gt;27,319&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Rahah&lt;/td&gt;
&lt;td&gt;806&lt;/td&gt;
&lt;td&gt;2,689,855&lt;/td&gt;
&lt;td&gt;20,375&lt;/td&gt;
&lt;td&gt;15,107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;804&lt;/td&gt;
&lt;td&gt;3,540,000&lt;/td&gt;
&lt;td&gt;23,896&lt;/td&gt;
&lt;td&gt;18,927&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Khalifa City&lt;/td&gt;
&lt;td&gt;647&lt;/td&gt;
&lt;td&gt;1,023,809&lt;/td&gt;
&lt;td&gt;13,123&lt;/td&gt;
&lt;td&gt;13,692&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Shamkhah&lt;/td&gt;
&lt;td&gt;560&lt;/td&gt;
&lt;td&gt;735,000&lt;/td&gt;
&lt;td&gt;13,674&lt;/td&gt;
&lt;td&gt;13,347&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fahid Island&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;5,135,242&lt;/td&gt;
&lt;td&gt;40,187&lt;/td&gt;
&lt;td&gt;39,578&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Maryah Island&lt;/td&gt;
&lt;td&gt;449&lt;/td&gt;
&lt;td&gt;2,504,540&lt;/td&gt;
&lt;td&gt;25,952&lt;/td&gt;
&lt;td&gt;17,803&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zayed City&lt;/td&gt;
&lt;td&gt;317&lt;/td&gt;
&lt;td&gt;1,484,733&lt;/td&gt;
&lt;td&gt;18,119&lt;/td&gt;
&lt;td&gt;15,259&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Reef&lt;/td&gt;
&lt;td&gt;151&lt;/td&gt;
&lt;td&gt;1,150,000&lt;/td&gt;
&lt;td&gt;10,579&lt;/td&gt;
&lt;td&gt;7,817&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the year-on-year column with care. On Yas, Saadiyat and Al Maryah the jump of 32-46% is mostly new off-plan releases priced above the older buildings that made up last year's sales. Khalifa City and Al Shamkhah, where the mix changed little, moved by -4% and +2%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Villas and townhouses
&lt;/h2&gt;

&lt;p&gt;7,487 villa and townhouse sales in 2026, median AED 4.98 million (middle half AED 3.5-9.3 million), median size 328 sqm, AED 17,234 per sqm.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;District&lt;/th&gt;
&lt;th&gt;Sales&lt;/th&gt;
&lt;th&gt;Median price (AED)&lt;/th&gt;
&lt;th&gt;Median AED per sqm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;2,844&lt;/td&gt;
&lt;td&gt;7,685,000&lt;/td&gt;
&lt;td&gt;20,279&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zayed City&lt;/td&gt;
&lt;td&gt;596&lt;/td&gt;
&lt;td&gt;3,798,527&lt;/td&gt;
&lt;td&gt;16,102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Layyan&lt;/td&gt;
&lt;td&gt;457&lt;/td&gt;
&lt;td&gt;2,100,000&lt;/td&gt;
&lt;td&gt;15,434&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;392&lt;/td&gt;
&lt;td&gt;4,236,840&lt;/td&gt;
&lt;td&gt;17,396&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ramhan Island&lt;/td&gt;
&lt;td&gt;324&lt;/td&gt;
&lt;td&gt;13,555,388&lt;/td&gt;
&lt;td&gt;40,764&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Saadiyat Island&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;9,236,752&lt;/td&gt;
&lt;td&gt;16,740&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ghantout&lt;/td&gt;
&lt;td&gt;246&lt;/td&gt;
&lt;td&gt;6,593,250&lt;/td&gt;
&lt;td&gt;24,343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Khalifa City&lt;/td&gt;
&lt;td&gt;243&lt;/td&gt;
&lt;td&gt;4,676,000&lt;/td&gt;
&lt;td&gt;14,357&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hudayriyat Island alone is 38% of the year's villa market, almost all of it off-plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The projects that sold most
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;District&lt;/th&gt;
&lt;th&gt;Sales in 2026&lt;/th&gt;
&lt;th&gt;Median price (AED)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yas Riva Residences&lt;/td&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;940&lt;/td&gt;
&lt;td&gt;2,090,344&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hudayriyat Golf Estates - Villas&lt;/td&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;742&lt;/td&gt;
&lt;td&gt;6,600,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hudayriyat Golf Estates - Townhomes&lt;/td&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;720&lt;/td&gt;
&lt;td&gt;4,928,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yas Park Place&lt;/td&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;686&lt;/td&gt;
&lt;td&gt;2,097,178&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tara A&lt;/td&gt;
&lt;td&gt;Al Reem Island&lt;/td&gt;
&lt;td&gt;639&lt;/td&gt;
&lt;td&gt;2,432,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Row Saadiyat&lt;/td&gt;
&lt;td&gt;Al Saadiyat Island&lt;/td&gt;
&lt;td&gt;581&lt;/td&gt;
&lt;td&gt;5,540,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Naseem&lt;/td&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;542&lt;/td&gt;
&lt;td&gt;9,573,237&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wadeem (Plots)&lt;/td&gt;
&lt;td&gt;Al Hidayriyyat&lt;/td&gt;
&lt;td&gt;523&lt;/td&gt;
&lt;td&gt;3,346,700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Canopies at Yas Point&lt;/td&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;514&lt;/td&gt;
&lt;td&gt;2,454,092&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gardenia Bay&lt;/td&gt;
&lt;td&gt;Yas Island&lt;/td&gt;
&lt;td&gt;506&lt;/td&gt;
&lt;td&gt;1,503,868&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All ten were sold entirely off-plan. The table names 370 projects in 118 districts this year; a further 1,642 sales carry the project name "Private" (individual properties outside a named development).&lt;/p&gt;

&lt;p&gt;At the top end, 2,507 sales in 2026 were AED 10 million or more, and 3,253 were under AED 1 million.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: the sales table on ADREC's market-data page (DARI platform), read on 12 November 2026. The newest rows were dated 11 November; a day's sales appear the next day, and the last few days can still grow.&lt;/li&gt;
&lt;li&gt;All 127,379 rows were read month by month and checked against the table's own counts (354 requests, no mismatch).&lt;/li&gt;
&lt;li&gt;One trap: the table pages on a single column, and rows that tie on it change order between requests. A plain page-by-page copy of October 2026 repeated or lost 71 of 3,046 rows. Sorting on every column fixes it.&lt;/li&gt;
&lt;li&gt;"Apartments" are the types apartment, duplex and penthouse; "villas and townhouses" are villa and townhouse / attached villa. Medians use sales of a whole property with a published price per square metre (194 of the year's sales were of a share, 467 had no rate).&lt;/li&gt;
&lt;li&gt;A sale has no transaction number in this table. Units of one release sold on one day at one price appear as identical rows (1,517 of this year's rows are identical to another row); they are separate sales and were all counted.&lt;/li&gt;
&lt;li&gt;Plots, farms, offices and whole buildings are in the yearly totals but not in the apartment and villa tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Abu Dhabi sales as JSON
&lt;/h2&gt;

&lt;p&gt;The table is a web page. To get the rows without building the reader, there is an Apify Actor I maintain, &lt;a href="https://apify.com/data_daemon/abu-dhabi-property-transactions" rel="noopener noreferrer"&gt;Abu Dhabi Property Transactions&lt;/a&gt; ($1 per 1,000 sales, no key or proxy). In 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="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;
&lt;span class="k"&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;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="s2"&gt;"&amp;lt;YOUR_APIFY_TOKEN&amp;gt;"&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="s2"&gt;"data_daemon/abu-dhabi-property-transactions"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"daysBack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"districts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Al Reem Island"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"propertyTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"apartment"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="s2"&gt;"maxItems"&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="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 0 = everything in range&lt;/span&gt;
    &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="s2"&gt;"defaultDatasetId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&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="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"sales,"&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="s2"&gt;"transactionDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"to"&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="s2"&gt;"transactionDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&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="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"layout"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"transactionValueAed"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"median"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"median AED per sqm:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&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="s2"&gt;"pricePerSqmAed"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&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="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"saleSequence"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pricePerSqmAed"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"median"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output of that exact call on 12 November 2026 (the 100 newest of 379 Al Reem Island apartment sales in the 30 days):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 sales, 2026-11-03 to 2026-11-11
        size     median
layout
1 bed     22  1473195.0
2 beds    25  2410000.0
3 beds    11  3350000.0
studio    42  1117000.0
median AED per sqm: 20297
              size   median
saleSequence
primary         72  21050.0
secondary       28  16810.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same thing as one HTTP call, for a daily feed or a spreadsheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -X POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~abu-dhabi-property-transactions/run-sync-get-dataset-items?timeout=300&amp;amp;format=csv"&lt;/span&gt; \
  -H &lt;span class="s2"&gt;"Authorization: Bearer $APIFY_TOKEN"&lt;/span&gt; -H &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; \
  -d &lt;span class="s1"&gt;'{"daysBack": 7, "maxItems": 0}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a daily feed, schedule the Actor with &lt;code&gt;daysBack: 7&lt;/code&gt; and &lt;code&gt;onlyNew: true&lt;/code&gt;: each sale is delivered and charged once, and late registrations are still caught. Ready-made inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/abu-dhabi-property-transactions/examples/abu-dhabi-property-transactions-api-last-7-days-json" rel="noopener noreferrer"&gt;Abu Dhabi property sold prices, last 7 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/abu-dhabi-property-transactions/examples/al-reem-island-apartment-sold-prices-abu-dhabi-json" rel="noopener noreferrer"&gt;Al Reem Island apartment sold prices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole table since 2019 is about 127,000 rows (about $127); one year is about $25. For Dubai there are sibling Actors for &lt;a href="https://apify.com/data_daemon/dubai-property-transactions" rel="noopener noreferrer"&gt;DLD transactions&lt;/a&gt; and &lt;a href="https://apify.com/data_daemon/dubai-rent-contracts" rel="noopener noreferrer"&gt;Ejari rent contracts&lt;/a&gt; with the same field names where the meaning is the same.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Is there an official API for Abu Dhabi property transactions?&lt;/strong&gt;&lt;br&gt;
ADREC's website lists an "ADREC APIs" subscription page for organisations. The sales table on its market-data page is open to every visitor, with filters and an Excel export, but it is not an API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How far back does the data go?&lt;/strong&gt;&lt;br&gt;
To 2 January 2019.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the data include rents?&lt;/strong&gt;&lt;br&gt;
Not as contracts. The same page shows Abu Dhabi rents as averages and indices only. Dubai is different: the Dubai Land Department publishes every Ejari contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are buyer or seller names in the data?&lt;/strong&gt;&lt;br&gt;
No. The table has the property, the date and the price, and nothing about the parties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my count different from ADREC's press releases?&lt;/strong&gt;&lt;br&gt;
The releases add mortgages and other transaction types to sales, and they quote values for all of them together. This table is sales only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the price per square metre comparable to Dubai's?&lt;/strong&gt;&lt;br&gt;
It is price divided by the sold area of the unit, in AED per sqm, the same definition as in the DLD data. Multiply by 0.0929 for AED per square foot.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are from ADREC's market data as read on 12 November 2026 and will shift slightly as late registrations are added. Medians describe what sold, not the value of any one property. Nothing here is investment or legal advice. Data: Abu Dhabi Real Estate Centre market data (DARI).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>realestate</category>
      <category>datascience</category>
      <category>python</category>
      <category>uae</category>
    </item>
    <item>
      <title>Is there an Etimad API? How to get Saudi government tenders and award results as JSON (Python guide)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Tue, 10 Nov 2026 12:20:42 +0000</pubDate>
      <link>https://dev.to/datadaemon/is-there-an-etimad-api-how-to-get-saudi-government-tenders-and-award-results-as-json-python-guide-5dog</link>
      <guid>https://dev.to/datadaemon/is-there-an-etimad-api-how-to-get-saudi-government-tenders-and-award-results-as-json-python-guide-5dog</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer: there is an official Etimad Developer Portal, but it has no tenders API.&lt;/strong&gt; On 10 November 2026 &lt;a href="https://apiportal.etimad.sa/en" rel="noopener noreferrer"&gt;apiportal.etimad.sa&lt;/a&gt; listed six products (contract and salary inquiry services for account holders) and none of them searches or lists tenders. The public tenders site, &lt;a href="https://tenders.etimad.sa/Tender/AllTendersForVisitor" rel="noopener noreferrer"&gt;tenders.etimad.sa&lt;/a&gt;, loads its list from a JSON endpoint that needs no login or key: that afternoon it reported 291,464 tenders in total, 279 of them published in the last 2 days.&lt;/p&gt;

&lt;p&gt;This post documents that endpoint, how to page it safely, where the award results (bidders, prices, winner) are, and the gotchas that cost me time. Every number and output below comes from a request I ran on 10 November 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Etimad officially offers: the Developer Portal
&lt;/h2&gt;

&lt;p&gt;Etimad is the Saudi government platform on which agencies publish their tenders; the footer of its Developer Portal reads "All rights reserved to the Ministry of Finance - Etimad © 2026 - National Center for Governmental Resources - KSA". The portal's front page says "Link your system with the Etimad data" and listed these products on 10 November 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Category shown&lt;/th&gt;
&lt;th&gt;What it is, in the portal's words&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bank Contracts Inquiry&lt;/td&gt;
&lt;td&gt;Financial Products&lt;/td&gt;
&lt;td&gt;"obtain existing and historical contract data related to Government Tenders and Procurements", by contract number and commercial registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contracts Plus&lt;/td&gt;
&lt;td&gt;Financial Products&lt;/td&gt;
&lt;td&gt;contract data inquiry; per the portal's FAQ it "provides all contracts under specific Vendor"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salary Certificate&lt;/td&gt;
&lt;td&gt;Financial Products&lt;/td&gt;
&lt;td&gt;salary certificate of a government employee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detailed Salary Certificate&lt;/td&gt;
&lt;td&gt;Financial Products&lt;/td&gt;
&lt;td&gt;salary details of a government employee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average Salary Inquiry Service&lt;/td&gt;
&lt;td&gt;Financial Products&lt;/td&gt;
&lt;td&gt;three or six-month average salary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government Deduction Inquiry Service&lt;/td&gt;
&lt;td&gt;Government and semi-government&lt;/td&gt;
&lt;td&gt;detailed government deductions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Bank Contracts Inquiry page describes its audience as "Financial and Banking Sector, FinTech" and prices an inquiry at SAR 20 to 45 per contract depending on monthly volume. The portal's FAQ says: "To access the developers portal, you must log in with your account on Etimad platform, according to the entity you belong to", and production use must "comply with the requirements based on your user account (Government, Business)".&lt;/p&gt;

&lt;p&gt;So the official integration services are for registered entities, and they answer "tell me about this contract" or "this employee's salary". None answers "which tenders were published today". For that there is only the public website. The tenders site links a usage and disclaimer policy in its footer; read it before you rely on the data commercially.&lt;/p&gt;

&lt;h2&gt;
  
  
  The public Etimad tenders JSON endpoint
&lt;/h2&gt;

&lt;p&gt;The visitor page calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="no"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//tenders.etimad.sa/Tender/AllSupplierTendersForVisitorAsync&lt;/span&gt;
    &lt;span class="na"&gt;?PageSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;PageNumber&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;PublishDateId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;TenderCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="no"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://tenders.etimad.sa"&lt;/span&gt;
&lt;span class="no"&gt;LISTING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{BASE}/Tender/AllSupplierTendersForVisitorAsync"&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# the default python-requests User-Agent gets HTTP 403; any browser string works&lt;/span&gt;
    &lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "&lt;/span&gt;
                  &lt;span class="s2"&gt;"(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"Accept"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"application/json, text/plain, */*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""window: 1 any time, 2 = 2 days, 3 = 7 days, 4 = 30 days, 5 = 90 days.
    category: 0 all, 2 open for offers, 6 award announced."""&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"PageSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PageNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PublishDateId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"TenderCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;LISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"totalCount"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"tenders published in the last 2 days,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"on page 1"&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;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"referenceNumber"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderTypeId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderTypeName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"agencyName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"| deadline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"lastOfferPresentationDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"| fee SAR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"condetionalBookletPrice"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;279 tenders published in the last 2 days, 24 on page 1
261039008261 | 2 شراء مباشر | الهيئة السعودية للمياه | deadline 2026-11-13 | fee SAR 0.0
261039008267 | 1 منافسة عامة | الهيئة السعودية للمياه | deadline 2026-11-25 | fee SAR 0.0
261139003764 | 1 منافسة عامة | مستشفى القوات المسلحة بالرياض | deadline 2026-11-25 | fee SAR 500.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer looks like &lt;code&gt;{"data": [...], "totalCount": n, "pageSize": 24, "currentPage": 1}&lt;/code&gt;, newest publication first. Parameters I verified:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;th&gt;Checked on 10 Nov 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PublishDateId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; any time, &lt;code&gt;2&lt;/code&gt; last 2 days, &lt;code&gt;3&lt;/code&gt; last week, &lt;code&gt;4&lt;/code&gt; last month, &lt;code&gt;5&lt;/code&gt; last 3 months&lt;/td&gt;
&lt;td&gt;291,464 / 270 / 684 / 2,880 / 7,140 tenders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TenderCategory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; all, &lt;code&gt;2&lt;/code&gt; open for offers, &lt;code&gt;6&lt;/code&gt; award announced&lt;/td&gt;
&lt;td&gt;open: 1,364; award announced: 242,907 (2,033 in the 3-month window)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MultipleSearch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;keyword, Arabic or English&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;صيانة&lt;/code&gt; (maintenance), last week: 123&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TenderTypeId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; public tender, &lt;code&gt;2&lt;/code&gt; direct purchase, &lt;code&gt;11&lt;/code&gt; framework agreement, &lt;code&gt;15&lt;/code&gt; large companies&lt;/td&gt;
&lt;td&gt;public, last month: 1,132&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TenderAreasIdString&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;region id 1-13&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; (Riyadh), last week: 244&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TenderActivityId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;main activity id 1-19&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;9&lt;/code&gt; (telecommunications and IT), last month: 311&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PageSize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;up to 24&lt;/td&gt;
&lt;td&gt;50 and 100 still return 24 rows; 10 returns 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The id lists come from two small JSON lookups on the same host: &lt;code&gt;/Tender/GetAreasAsync&lt;/code&gt; (13 regions) and &lt;code&gt;/Tender/GetMainActivitiesAsync&lt;/code&gt; (19 named activity groups). &lt;code&gt;/Tender/GetAllAgenciesAsync&lt;/code&gt; returns 1,887 agencies with their 12-digit codes (302 KB); only 39 of them carry an English name.&lt;/p&gt;

&lt;p&gt;The row fields, with the portal's own spelling:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tenderId&lt;/code&gt;, &lt;code&gt;referenceNumber&lt;/code&gt;, &lt;code&gt;tenderNumber&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;identifiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenderIdString&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the encoded id used in page and fragment URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tenderName&lt;/code&gt;, &lt;code&gt;agencyName&lt;/code&gt;, &lt;code&gt;branchName&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;name, agency and branch, as published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tenderTypeId&lt;/code&gt;, &lt;code&gt;tenderTypeName&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;type code and Arabic label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tenderActivityId&lt;/code&gt;, &lt;code&gt;tenderActivityName&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;activity code and Arabic label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenderStatusId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;status code (the label is usually empty in the listing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;submitionDate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;publication time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;lastEnqueriesDate&lt;/code&gt;, &lt;code&gt;lastOfferPresentationDate&lt;/code&gt;, &lt;code&gt;offersOpeningDate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;enquiry deadline, submission deadline, opening date; each has a &lt;code&gt;...Hijri&lt;/code&gt; twin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;condetionalBookletPrice&lt;/code&gt;, &lt;code&gt;invitationCost&lt;/code&gt;, &lt;code&gt;financialFees&lt;/code&gt;, &lt;code&gt;buyingCost&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;document fee and other fees, SAR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remainingDays&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;days left to submit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isUGRP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unified government procurement row (see gotcha 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How many tenders does Etimad publish per day?
&lt;/h2&gt;

&lt;p&gt;The 270 tenders in the 2-day window at 14:50 Riyadh time on 10 November were published on 8 November (100), 9 November (89) and 10 November (81 so far). 160 were direct purchases, 103 public tenders, 6 framework agreements and 1 a large-companies tender, from 88 agencies. 179 had free documents; the highest document fee was SAR 5,000. 238 names contained Arabic text and 32 were Latin-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to page through Etimad tenders: 24 rows a page, in order
&lt;/h2&gt;

&lt;p&gt;This is the part that is easy to get wrong. The pages have to be requested one after another, starting at page 1:&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_restarts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""Every tender of a window, read in page order, one request at a time."""&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;                      &lt;span class="c1"&gt;# an error after the last page is just the end&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_restarts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;restarts&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                  &lt;span class="c1"&gt;# the portal lost its place: wait, start again from page 1&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"totalCount"&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;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;        &lt;span class="c1"&gt;# unified-procurement rows repeat on later pages&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt;


&lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tenders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"tenders from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"pages in"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"s,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"restarts"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;by_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tenders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;by_type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderTypeName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;by_type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderTypeName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;by_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;279 tenders from 13 pages in 63 s, 0 restarts
{'شراء مباشر': 165, 'منافسة عامة': 107, 'منافسات الشركات الكبرى': 1, 'منافسة إتفاقية إطارية': 6}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I measured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In order, it works.&lt;/strong&gt; Six in-order walks (74 page requests) had no error. A page took 1.5 to 4.4 seconds in most requests and 10 to 11 seconds in a few.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping ahead does not.&lt;/strong&gt; Of 35 requests that jumped more than one page ahead, 30 answered HTTP 400 with an "unexpected error, try again" message in Arabic. That includes page 50 of the all-time listing, page 20 of the 7-day window and page 5 requested straight after page 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The other 5 answered HTTP 200, and that is worse.&lt;/strong&gt; After reading pages 1 to 5 of a query I asked for page 8 and received 24 rows that were page 7's (at least 20 of the 24 ids matched), under a &lt;code&gt;totalCount&lt;/code&gt; of 170 where the in-order pages said 172 to 174. Two more jumps returned 24 rows for pages that hold 6 and 16 rows when read in order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My requests carried no cookies in most of these tests, so whatever remembers the position is not a cookie. I do not know the mechanism; the practical rule is enough: start at page 1, go one page at a time, never in parallel, and when a 400 appears, go back to page 1 instead of retrying the same page. Stop on a page with fewer than 24 rows. Do not wait for an error to mark the end: read in order, the pages after the last one answered HTTP 200 with a few repeated rows; after a jump they answered 400.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get Etimad award results: winner, bidders and prices
&lt;/h2&gt;

&lt;p&gt;There is no separate awards listing (&lt;code&gt;/Tender/AwardingStepTenderListAsync&lt;/code&gt; answers 404). Awards are two steps: list tenders with &lt;code&gt;TenderCategory=6&lt;/code&gt;, then fetch one small HTML fragment per tender.&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""The &amp;lt;tbody&amp;gt; blocks of an Etimad HTML fragment as lists of rows of cell texts."""&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;tbody.*?&amp;lt;/tbody&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unescape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;[^&amp;gt;]+&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&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;td&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;td.*?&amp;lt;/td&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&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;tr&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;tr.*?&amp;lt;/tr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;


&lt;span class="n"&gt;awarded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# award announced, published in the last 30 days&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;awarded&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"totalCount"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"tenders with announced awards in the 30-day window"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;awarded&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"isUGRP"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# UGRP tenders have no visitor detail page&lt;/span&gt;
&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderIdString"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                   &lt;span class="c1"&gt;# a space must become %20, never "+"&lt;/span&gt;
&lt;span class="n"&gt;frag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{BASE}/Tender/GetAwardingResultsForVisitorViewComponenet?tenderIdStr={tid}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bidders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;winners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"referenceNumber"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"agencyName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bidders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bidders, offers SAR:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&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;b&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bidders&lt;/span&gt;&lt;span class="p"&gt;)&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;supplier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;award&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;winners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"awarded:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;supplier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"| offer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"| award value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;award&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"page:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{BASE}/Tender/DetailsForVisitor?STenderId={tid}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;309 tenders with announced awards in the 30-day window
261139001457 | تجمع الرياض الصحي الأول | إعادة تأهيل أماكن انتظار المرضى بالطوارئ والعيادات لزوم مستش
3 bidders, offers SAR: [32999.99, 88996.2, 96600.0]
awarded: مؤسسة نهضة العاصمة التجارية | offer 32999.99 | award value 32999.99
page: https://tenders.etimad.sa/Tender/DetailsForVisitor?STenderId=VVZu%2A%40%40%2A%2A9nw3CPf2qcHfbz70w%3D%3D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fragment (3.5 KB for this tender) has two tables: every bidder with the financial offer and the technical result, and the awarded suppliers with offer and award value; the heading of the second carries the award type (here "ترسية كاملة", a full award). Three more sources per tender:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/Tender/DetailsForVisitor?STenderId=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;300 KB HTML&lt;/td&gt;
&lt;td&gt;purpose, document price, status, contract duration, insurance, type, agency, submission method, initial guarantee, award number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/Tender/GetTenderDatesViewComponenet?tenderIdStr=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.7 KB&lt;/td&gt;
&lt;td&gt;enquiry dates, offer examination, expected award date, work start date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/Tender/GetRelationsDetailsViewComponenet?tenderIdStr=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.1 KB&lt;/td&gt;
&lt;td&gt;contractor classification, execution region and city, activities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things about awards. The publication window applies to the date the tender was published, not the date it was awarded, so an awards feed needs a wide window (3 months: 2,033 rows) and a memory of what you have already seen. And the award listing contains rows that are not awards; see gotcha 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arabic text and the fields with stable codes
&lt;/h2&gt;

&lt;p&gt;Tender names, agencies, branches, activities and supplier names are published in Arabic (about 1 name in 8 in my sample was Latin-only) and are not translated anywhere on the site. For filtering and grouping, use the coded fields instead of the labels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Stable values seen on 10 Nov 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenderTypeId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; منافسة عامة (public tender), &lt;code&gt;2&lt;/code&gt; شراء مباشر (direct purchase), &lt;code&gt;11&lt;/code&gt; منافسة إتفاقية إطارية (framework agreement), &lt;code&gt;15&lt;/code&gt; منافسات الشركات الكبرى (large companies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenderStatusId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;4&lt;/code&gt; on 269 of 270 newly published tenders (approved, open), &lt;code&gt;15&lt;/code&gt; on tenders with an approved award&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenderActivityId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43 distinct activity ids in the 2-day window; the 19 main groups come from &lt;code&gt;GetMainActivitiesAsync&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;region&lt;/td&gt;
&lt;td&gt;ids 1-13 from &lt;code&gt;GetAreasAsync&lt;/code&gt; (&lt;code&gt;1&lt;/code&gt; منطقة الرياض, &lt;code&gt;2&lt;/code&gt; منطقة مكة المكرمة, ...); the region is a filter and a detail-fragment field, not a listing field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;referenceNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the number people quote, e.g. &lt;code&gt;261139001457&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the listing, &lt;code&gt;agencyCode&lt;/code&gt; was filled on 2 of 270 rows and &lt;code&gt;tenderStatusName&lt;/code&gt; on 2 of 270, so match agencies by &lt;code&gt;agencyName&lt;/code&gt; and statuses by &lt;code&gt;tenderStatusId&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. 24 rows is the maximum page size.&lt;/strong&gt; Larger values are accepted and ignored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pages must be read in order.&lt;/strong&gt; Jumps return HTTP 400 or, sometimes, the wrong rows with HTTP 200. Details above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Unified-procurement (UGRP) rows are mixed into every listing.&lt;/strong&gt; They have &lt;code&gt;isUGRP: true&lt;/code&gt; and ids from 2,000,000,000. They behave differently from everything else: they repeat at the top of later pages (pages 9 to 14 of one walk each started with the same two), they ignore the category and keyword filters (page 1 of "award announced + public tender, last month" held 22 UGRP rows out of 24, all with status &lt;code&gt;4&lt;/code&gt;, none of them awarded), and their detail URL redirects to the login page. &lt;code&gt;totalCount&lt;/code&gt; also changes from page to page inside one walk (174, 173, 172, then 174 again in one of mine). Deduplicate by &lt;code&gt;tenderId&lt;/code&gt; and drop &lt;code&gt;isUGRP&lt;/code&gt; rows when you need awards or detail pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The all-time listing is unpredictable.&lt;/strong&gt; At 09:40 UTC, in a cloud run of mine, page 2 of the unfiltered all-time listing timed out at 90 seconds on each of three attempts; at 11:47 UTC the same request took 3 seconds. And because pages must be read in order, the old end of the list is out of reach in practice: 291,464 tenders are 12,145 pages. Use the windows: the listing is newest first, so the first rows of the 7-day window are the first rows of the all-time listing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Send &lt;code&gt;tenderIdString&lt;/code&gt; back exactly as given.&lt;/strong&gt; 78 of 270 ids contained a space and 82 contained &lt;code&gt;*@@**&lt;/code&gt;. Percent-encode them as they are. If you "repair" the space into a plus sign (&lt;code&gt;%2B&lt;/code&gt;), the detail URL redirects to the login page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Send a browser User-Agent.&lt;/strong&gt; The default &lt;code&gt;python-requests&lt;/code&gt; one gets HTTP 403.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Dates.&lt;/strong&gt; &lt;code&gt;submitionDate&lt;/code&gt; and the deadlines are local Riyadh time without an offset (&lt;code&gt;2026-11-10T14:45:32.049606&lt;/code&gt;); &lt;code&gt;createdAt&lt;/code&gt; is always &lt;code&gt;0001-01-01T00:00:00&lt;/code&gt;; &lt;code&gt;offersOpeningDate&lt;/code&gt; was empty on 161 of 270 rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. No public supplier data without an account.&lt;/strong&gt; Supplier names appear only inside award fragments. The contract APIs on the Developer Portal need a subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Be a polite client.&lt;/strong&gt; One request at a time is not only courtesy here, it is required. Add a pause, cache the detail pages (they are 300 KB each), and prefer the 2-day window on a schedule over re-reading months.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to maintain this yourself
&lt;/h2&gt;

&lt;p&gt;A script like the one above is fine for a look. A daily feed needs the in-order paging with restarts, de-duplication, a memory of delivered tenders, the four detail requests per tender, the Arabic label parsing and English translations of the coded fields, and attention when the portal changes.&lt;/p&gt;

&lt;p&gt;I packaged that as the &lt;a href="https://apify.com/data_daemon/saudi-etimad-tenders?utm_source=devto&amp;amp;utm_campaign=etimad-api" rel="noopener noreferrer"&gt;Saudi Etimad Tenders API on Apify&lt;/a&gt; (disclosure: I built it). It reads the same public pages and returns one row per tender with English field names, English translations for type, status and region, Gregorian and Hijri deadlines, and with &lt;code&gt;includeDetails&lt;/code&gt; the purpose, contract duration, execution city and the award tables. An &lt;code&gt;onlyNew&lt;/code&gt; mode delivers each tender once and again when its status or deadline changes.&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&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="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"APIFY_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;]&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="s2"&gt;"data_daemon/saudi-etimad-tenders"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"publishedWithin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"tenderTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"public"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"regions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Riyadh"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"includeDetails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# purpose, contract duration, city, award results&lt;/span&gt;
        &lt;span class="s2"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_total_charge_usd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"0.05"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&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="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"statusMessage"&lt;/span&gt;&lt;span class="p"&gt;]&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;t&lt;/span&gt; &lt;span class="k"&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="s2"&gt;"defaultDatasetId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"referenceNumber"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tenderTypeEn"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"statusEn"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"regionEn"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"   "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"agency"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"| deadline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"submissionDeadlineDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"| contract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"contractDurationDays"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"days | fee SAR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"documentFeeSar"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"   "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUCCEEDED | Saved 3 tenders (published in the last week; types public; regions Riyadh), newest first. 3 with detail page fields. Capped by maxItems (3); set maxItems to 0 for everything that matches.
261139003764 | Public tender | Approved (open for offers) | Riyadh / الرياض
    مستشفى القوات المسلحة بالرياض | deadline 2026-11-25 | contract 1095 days | fee SAR 500
    إحلال وأستبدال أجهزه معمل الأسنان
261139003061 | Public tender | Approved (open for offers) | Riyadh / الرياض
    صندوق التنمية الزراعية | deadline 2026-11-25 | contract 540 days | fee SAR 1500
    تحسين نظام الخدمات الداخلية
261139003449 | Public tender | Approved (open for offers) | Riyadh / الرياض
    المركز الوطني لتنمية الغطاء النباتي ومكافحة التصحر | deadline 2026-12-10 | contract 1080 days | fee SAR 500
    الخدمات المدارة للمنصة الوطنية للبرنامج الوطني للتشجير
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That run took 7 seconds. The price is $0.003 per tender, plus $0.007 per tender when &lt;code&gt;includeDetails&lt;/code&gt; reads its detail page, so $0.01 per tender with details. No start fee, no subscription. With the counts measured above:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Tenders on 10 Nov 2026&lt;/th&gt;
&lt;th&gt;Listing only&lt;/th&gt;
&lt;th&gt;With details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default run: the 50 newest tenders&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;$0.15&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything published in the last 2 days&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;td&gt;$0.84&lt;/td&gt;
&lt;td&gt;$2.79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last week&lt;/td&gt;
&lt;td&gt;684&lt;/td&gt;
&lt;td&gt;$2.05&lt;/td&gt;
&lt;td&gt;$6.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last month&lt;/td&gt;
&lt;td&gt;2,880&lt;/td&gt;
&lt;td&gt;$8.64&lt;/td&gt;
&lt;td&gt;$28.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last 3 months&lt;/td&gt;
&lt;td&gt;7,140&lt;/td&gt;
&lt;td&gt;$21.42&lt;/td&gt;
&lt;td&gt;$71.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Award-announced rows, 3-month window&lt;/td&gt;
&lt;td&gt;2,033&lt;/td&gt;
&lt;td&gt;$6.10&lt;/td&gt;
&lt;td&gt;$20.33&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "with details" column is an upper bound: unified-procurement rows have no public detail page and are not charged the detail fee. A daily feed of everything is about 90 to 100 tenders a day at the rate of 8 and 9 November, so roughly $0.27 to $0.30 a day without details. The Actor keeps a unified-procurement row only when it fits the run (stage &lt;code&gt;all&lt;/code&gt; or &lt;code&gt;open&lt;/code&gt;, your keyword in its name or agency) and flags it &lt;code&gt;isUnifiedProcurement&lt;/code&gt;, so an awards pull returns awarded tenders only. A ready-made input: &lt;a href="https://apify.com/data_daemon/saudi-etimad-tenders/examples/saudi-government-tenders-last-2-days-etimad-json?utm_source=devto&amp;amp;utm_campaign=etimad-api" rel="noopener noreferrer"&gt;new Saudi government tenders of the last 2 days as JSON&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Is there an official Etimad API for tenders?
&lt;/h3&gt;

&lt;p&gt;No. Etimad's Developer Portal (apiportal.etimad.sa) listed six API products on 10 November 2026: two contract inquiry services, three salary services and a government deduction inquiry. None lists or searches tenders, and all require an Etimad account and a subscription for production use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need an Etimad account to read tenders?
&lt;/h3&gt;

&lt;p&gt;Not for the public listing, the tender detail pages or the published award results; they answer without login. Unified-procurement (UGRP) tenders are the exception: their detail link redirects to the login page.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I get Saudi government tenders as JSON?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GET https://tenders.etimad.sa/Tender/AllSupplierTendersForVisitorAsync?PageSize=24&amp;amp;PageNumber=1&amp;amp;PublishDateId=2&amp;amp;TenderCategory=0&lt;/code&gt; with a browser User-Agent returns the newest tenders of the last 2 days as JSON, 24 per page. Request the pages in order.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I find who won an Etimad tender and at what price?
&lt;/h3&gt;

&lt;p&gt;List tenders with &lt;code&gt;TenderCategory=6&lt;/code&gt;, then fetch &lt;code&gt;/Tender/GetAwardingResultsForVisitorViewComponenet?tenderIdStr=&amp;lt;encoded id&amp;gt;&lt;/code&gt;. It is an HTML fragment with a bidders table (supplier, offer, technical result) and an awarded table (supplier, offer, award value).&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Etimad tender data available in English?
&lt;/h3&gt;

&lt;p&gt;Mostly not. Names, agencies and suppliers are published in Arabic. The type, status, activity and region are codes, so they can be mapped to English once and filtered reliably.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many tenders does Etimad list?
&lt;/h3&gt;

&lt;p&gt;291,464 on 10 November 2026, of which 242,907 had announced awards and 1,364 were open for offers; 2,880 were published in the last month.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>webscraping</category>
      <category>saudiarabia</category>
    </item>
    <item>
      <title>Is there an NSE India API for corporate announcements, corporate actions and bulk deals? JSON endpoints and RSS in Python</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Tue, 10 Nov 2026 12:20:00 +0000</pubDate>
      <link>https://dev.to/datadaemon/is-there-an-nse-india-api-for-corporate-announcements-corporate-actions-and-bulk-deals-json-2d48</link>
      <guid>https://dev.to/datadaemon/is-there-an-nse-india-api-for-corporate-announcements-corporate-actions-and-bulk-deals-json-2d48</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer: not an official free one.&lt;/strong&gt; On its own website the National Stock Exchange of India (NSE) offers 23 RSS feeds and paid, licensed data products; I found no developer portal, API key or API documentation for corporate filings. The filing pages on nseindia.com, however, load their tables from JSON endpoints that answer a plain HTTP GET. On 10 November 2026 one request returned all 6,029 equity announcements filed from 3 to 9 November (4.9 MB of JSON) without a login, a key or a cookie.&lt;/p&gt;

&lt;p&gt;This post covers what NSE offers officially, the endpoints for announcements, corporate actions, board meetings and bulk/block deals, working Python for each, and the gotchas. Every number and every output below comes from a request I ran on 10 November 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NSE officially offers: RSS feeds and licensed data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RSS feeds.&lt;/strong&gt; &lt;a href="https://www.nseindia.com/rss-feed" rel="noopener noreferrer"&gt;nseindia.com/rss-feed&lt;/a&gt; lists 23 XML feeds, among them announcements, corporate actions, board meetings, financial results, insider trading, shareholding patterns and offer documents. They live at &lt;code&gt;https://nsearchives.nseindia.com/content/RSS/&amp;lt;name&amp;gt;.xml&lt;/code&gt;.&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ElementTree&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="no"&gt;ET&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="no"&gt;UA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "&lt;/span&gt;
                    &lt;span class="s2"&gt;"(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://nsearchives.nseindia.com/content/RSS/Online_announcements.xml"&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ET&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;UA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".//item"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"items, from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pubDate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pubDate"&lt;/span&gt;&lt;span class="p"&gt;)&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;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pubDate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;548 items, from 10-Nov-2026 00:06:51 to 10-Nov-2026 17:37:48
10-Nov-2026 17:37:48 | Kalyan Jewellers India Limited | KALYANKJIL_10112026173732_PR.pdf
10-Nov-2026 17:35:58 | Websol Energy System Limited | WEBELSOLAR_10112026173544_Reg_30_Transcript.pdf
10-Nov-2026 17:35:01 | Quadrant Future Tek Limited | QUADRANT_10112026173318_OutcomeOfBMNov2026ocr.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If "what was filed today" is all you need, use the RSS feed: it is the channel NSE publishes for machines, and the feed declares a refresh interval (&lt;code&gt;ttl&lt;/code&gt;) of 5 minutes. Its limits, as observed: the announcements feed held only the current day, an item has four fields (company name, PDF link, one line of text, time) with no symbol, ISIN or category field, and all market segments share one feed. The other feeds were shorter: 59 items in &lt;code&gt;Corporate_action.xml&lt;/code&gt;, 65 in &lt;code&gt;Board_Meetings.xml&lt;/code&gt;, 16 in &lt;code&gt;InsiderTrading.xml&lt;/code&gt; (one hour of filings), 3 in &lt;code&gt;Financial_Results.xml&lt;/code&gt; and none in &lt;code&gt;Shareholding_Pattern.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Licensed data.&lt;/strong&gt; NSE's data business is run by its subsidiary NSE Data &amp;amp; Analytics Limited. Its &lt;a href="https://www.nseindia.com/market-data/corporate-data-subscription" rel="noopener noreferrer"&gt;Paid Corporate Data page&lt;/a&gt; (marked "Updated on: 11/06/2026") lists a Corporate Data product, "company fundamentals, corporate announcements, and shareholding pattern", delivered over a dedicated leased line at INR 1,060,000 (USD 17,500 for international customers), and an End of Day Corporate Announcement product, delivered over SFTP after 8:00 PM IST, at INR 500,000 (USD 8,000) per annum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terms of use.&lt;/strong&gt; NSE publishes &lt;a href="https://www.nseindia.com/nse-terms-of-use" rel="noopener noreferrer"&gt;Terms of Use&lt;/a&gt; for its website; read them before you build on the endpoints below. For a commercial product, NSE Data &amp;amp; Analytics is the licensed route.&lt;/p&gt;

&lt;h2&gt;
  
  
  The NSE corporate announcements JSON endpoint
&lt;/h2&gt;

&lt;p&gt;The page &lt;a href="https://www.nseindia.com/companies-listing/corporate-filings-announcements" rel="noopener noreferrer"&gt;Corporate Filings: Announcements&lt;/a&gt; fills its table from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="no"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//www.nseindia.com/api/corporate-announcements&lt;/span&gt;
    &lt;span class="na"&gt;?index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;equities&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;to_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="no"&gt;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://www.nseindia.com/api"&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# python-requests' default User-Agent gets no answer at all; any browser string works&lt;/span&gt;
    &lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "&lt;/span&gt;
                  &lt;span class="s2"&gt;"(KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"Accept"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"application/json, text/plain, */*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{API}/{path}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# NSE wants DD-MM-YYYY&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%d-%m-%Y"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&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="nf"&gt;nse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"corporate-announcements"&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="s2"&gt;"equities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&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="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"equity announcements on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day&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;a&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"an_dt"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"attchmntFile"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;234 equity announcements on 2026-11-09
09-Nov-2026 23:45:59 | CHALET | Analysts/Institutional Investor Meet/Con. Call Updates | CHALET_09112026234526_Regulation30InvestorConferenceIntimation09112026.pdf
09-Nov-2026 23:31:42 | TORNTPOWER | Analysts/Institutional Investor Meet/Con. Call Updates | TORNTPOWER_09112026233101_Transcript_-_SE_Intimation.pdf
09-Nov-2026 23:22:11 | AASTHA | Copy of Newspaper Publication | 9081535400_09112026232157_Final_Newspaper_Advertisment.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer is a JSON array, newest first, not paged. The fields that matter:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seq_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NSE's id of the filing; use it to deduplicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;sm_name&lt;/code&gt;, &lt;code&gt;sm_isin&lt;/code&gt;, &lt;code&gt;smIndustry&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;company (industry is often empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;desc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NSE's subject, for example &lt;code&gt;Outcome of Board Meeting&lt;/code&gt;, &lt;code&gt;Press Release&lt;/code&gt;, &lt;code&gt;Dividend&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attchmntText&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the summary text shown on the site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;attchmntFile&lt;/code&gt;, &lt;code&gt;attFileSize&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;PDF link on &lt;code&gt;nsearchives.nseindia.com&lt;/code&gt; and its size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;an_dt&lt;/code&gt;, &lt;code&gt;exchdisstime&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;broadcast and dissemination time, India time, as &lt;code&gt;09-Nov-2026 23:45:59&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sort_date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the same moment as &lt;code&gt;2026-11-09 23:45:59&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hasXbrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;whether an XBRL version exists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;index&lt;/code&gt; selects the segment: &lt;code&gt;equities&lt;/code&gt;, &lt;code&gt;sme&lt;/code&gt;, &lt;code&gt;debt&lt;/code&gt;, &lt;code&gt;mf&lt;/code&gt; (mutual funds) or &lt;code&gt;invitsreits&lt;/code&gt;. Add &lt;code&gt;symbol=RELIANCE&lt;/code&gt; for one company.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many announcements does NSE publish per day?
&lt;/h2&gt;

&lt;p&gt;Equity segment, one request per day, 10 November 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Announcements&lt;/th&gt;
&lt;th&gt;Response size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mon 2 Nov&lt;/td&gt;
&lt;td&gt;904&lt;/td&gt;
&lt;td&gt;0.66 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tue 3 Nov&lt;/td&gt;
&lt;td&gt;1,142&lt;/td&gt;
&lt;td&gt;0.84 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wed 4 Nov&lt;/td&gt;
&lt;td&gt;1,419&lt;/td&gt;
&lt;td&gt;1.03 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thu 5 Nov&lt;/td&gt;
&lt;td&gt;1,530&lt;/td&gt;
&lt;td&gt;1.11 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fri 6 Nov&lt;/td&gt;
&lt;td&gt;1,239&lt;/td&gt;
&lt;td&gt;0.90 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sat 7 Nov&lt;/td&gt;
&lt;td&gt;426&lt;/td&gt;
&lt;td&gt;0.66 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sun 8 Nov&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;0.06 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mon 9 Nov&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;0.34 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A range is one answer too: 3 to 9 November returned 6,029 rows (the sum of the seven days, 6,029 distinct &lt;code&gt;seq_id&lt;/code&gt; values, 1,667 companies) and the whole of October returned 14,045 rows in 10.5 MB. In that week the most frequent subjects were analyst and investor-call updates (1,274), board meeting outcomes (895) and newspaper publications (876). The other segments for the same week: SME 776, debt 827, mutual funds 2,258, InvITs and REITs 116.&lt;/p&gt;

&lt;h2&gt;
  
  
  NSE corporate actions API: dividends, bonus issues and splits by ex-date
&lt;/h2&gt;

&lt;p&gt;Corporate actions, board meetings and the event calendar take the same parameters. Here the date range filters the ex-date (or the meeting date), so a range in the future gives you a calendar:&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="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"corporates-corporateActions"&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="s2"&gt;"equities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"corporate actions with an ex-date in the next 30 days"&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;a&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"exDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"corporate-announcements"&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="s2"&gt;"equities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"RELIANCE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"01-01-2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"RELIANCE announcements in 2026, latest:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"an_dt"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;57 corporate actions with an ex-date in the next 30 days
11-Nov-2026 | INDIGRID | Distribution Rs 4.12 Per Unit Consists Of Interest - Rs 3.1878 Per Unit /Capital Repayment - Re 0.9322 Per Unit
11-Nov-2026 | SONATSOFTW | Interim Dividend - Rs 1.25 Per Share
11-Nov-2026 | RITES | Interim Dividend - Rs 1.90 Per Share
11-Nov-2026 | PREMIERENE | Interim Dividend - Re 0.50 Per Share
146 RELIANCE announcements in 2026, latest: 06-Nov-2026 19:10:58 Analysts/Institutional Investor Meet/Con. Call Updates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The action itself is free text in &lt;code&gt;subject&lt;/code&gt; ("Interim Dividend - Rs 1.25 Per Share", "Buy Back", "Rights 5:12 @ Premium Rs 855/-"), so the amount or ratio has to be parsed out; &lt;code&gt;Rs&lt;/code&gt; and &lt;code&gt;Re&lt;/code&gt; both occur. Of the 57 rows, 50 were interim dividends. The other fields are &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;comp&lt;/code&gt;, &lt;code&gt;isin&lt;/code&gt;, &lt;code&gt;series&lt;/code&gt;, &lt;code&gt;faceVal&lt;/code&gt;, &lt;code&gt;exDate&lt;/code&gt;, &lt;code&gt;recDate&lt;/code&gt;, &lt;code&gt;bcStartDate&lt;/code&gt; and &lt;code&gt;bcEndDate&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  NSE bulk deals and block deals API: the JSON stops at 70 rows
&lt;/h2&gt;

&lt;p&gt;Deals use a different endpoint and different parameter names (&lt;code&gt;from&lt;/code&gt; and &lt;code&gt;to&lt;/code&gt;, not &lt;code&gt;from_date&lt;/code&gt;):&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{API}/historicalOR/bulk-block-short-deals"&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"optionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bulk_deals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"03-11-2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"09-11-2026"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;as_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;as_csv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"csv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"utf-8-sig"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;deals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StringIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_csv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rows in the JSON, dated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"BD_DT_DATE"&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;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rows in the CSV, dated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Date"&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;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deals&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;70 rows in the JSON, dated {'03-NOV-2026'}
548 rows in the CSV, dated ['03-NOV-2026', '04-NOV-2026', '05-NOV-2026', '06-NOV-2026', '08-NOV-2026', '09-NOV-2026']
{'Date': '03-NOV-2026', 'Symbol': 'AGIIL', 'Security Name': 'Agi Infra Limited', 'Client Name': 'ARIHANT CAPITAL MARKETS LIMITED', 'Buy / Sell': 'SELL', 'Quantity Traded': '13,30,449', 'Trade Price / Wght. Avg. Price': '266.03', 'Remarks': '-'}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON answer is cut at 70 rows without any flag: for the week it returned the first 70 rows of the first day and nothing else, and for the whole of October it also returned 70 rows where the CSV had 2,771. With &lt;code&gt;csv=true&lt;/code&gt; the same request returns the full range. &lt;code&gt;optionType&lt;/code&gt; is &lt;code&gt;bulk_deals&lt;/code&gt;, &lt;code&gt;block_deals&lt;/code&gt; or &lt;code&gt;short_selling&lt;/code&gt;; for 3 to 9 November the CSVs held 548, 26 and 653 rows. Three things to handle in the CSV: it starts with a byte-order mark, the header names end with a space (&lt;code&gt;"Date "&lt;/code&gt;), and quantities use Indian digit grouping (&lt;code&gt;13,30,449&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;For the latest trading day only, &lt;code&gt;GET /api/snapshot-capital-market-largedeal&lt;/code&gt; returns all three lists in one JSON without a cap (on 10 November: &lt;code&gt;as_on_date&lt;/code&gt; 09-Nov-2026 with 76 bulk deals, 2 block deals and 86 short-selling rows).&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling for new NSE filings without duplicates
&lt;/h2&gt;

&lt;p&gt;For an alert you only need the filings you have not seen. &lt;code&gt;seq_id&lt;/code&gt; is unique per filing (6,029 rows, 6,029 ids in the week above), so a small file of seen ids is enough. Ask for yesterday and today so a late-night filing is not missed:&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;

&lt;span class="n"&gt;seen_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nse_seen.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;set&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;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seen_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kt"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# run it on an India-time clock, or pass yesterday as well&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"corporate-announcements"&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="s2"&gt;"equities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dmy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"seq_id"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&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;a&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"an_dt"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"new of"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&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="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;seen_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&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;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"seq_id"&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;a&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First run, then a second run a few seconds later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10-Nov-2026 17:29:11 PARKHOTELS | Updates
10-Nov-2026 17:26:04 SIGMAADV | Analysts/Institutional Investor Meet/Con. Call Updates
10-Nov-2026 17:22:55 PILANIINVS | Outcome of Board Meeting
10-Nov-2026 17:22:53 SKYWAYS | Analysts/Institutional Investor Meet/Con. Call Updates
10-Nov-2026 17:20:56 PILANIINVS | Outcome of Board Meeting
427 new of 427
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 new of 427
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  NSE filing endpoints at a glance
&lt;/h2&gt;

&lt;p&gt;All under &lt;code&gt;https://www.nseindia.com/api/&lt;/code&gt;, all GET, all checked on 10 November 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;Rows returned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Announcements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporate-announcements&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;index&lt;/code&gt;, &lt;code&gt;from_date&lt;/code&gt;, &lt;code&gt;to_date&lt;/code&gt;, optional &lt;code&gt;symbol&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;6,029 (equities, 3-9 Nov)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporate actions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporates-corporateActions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;same, range on ex-date&lt;/td&gt;
&lt;td&gt;57 (next 30 days); 2,027 (ex-date in 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Board meetings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporate-board-meetings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;same, range on meeting date&lt;/td&gt;
&lt;td&gt;1,446 (10 Nov-10 Dec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event calendar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;event-calendar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;td&gt;671 (10 Nov-10 Dec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk, block, short deals&lt;/td&gt;
&lt;td&gt;&lt;code&gt;historicalOR/bulk-block-short-deals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;optionType&lt;/code&gt;, &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;, &lt;code&gt;csv=true&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;548 / 26 / 653 (3-9 Nov)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latest day's deals&lt;/td&gt;
&lt;td&gt;&lt;code&gt;snapshot-capital-market-largedeal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;76 / 2 / 86 (9 Nov)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credit ratings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporate-credit-rating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;index&lt;/code&gt;, &lt;code&gt;from_date&lt;/code&gt;, &lt;code&gt;to_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;100 (3-9 Nov)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareholding patterns&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporate-share-holdings-master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;index&lt;/code&gt;, &lt;code&gt;from_date&lt;/code&gt;, &lt;code&gt;to_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;2,460 (1 Oct-10 Nov)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Offer documents (IPO)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;corporates/offerdocs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,271 (main board register)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Send a browser User-Agent.&lt;/strong&gt; With the default &lt;code&gt;python-requests&lt;/code&gt; User-Agent the API did not answer at all (I gave up after 90 seconds) and the RSS host closed the connection. With a browser User-Agent the same request took 0.3 seconds. No cookie was needed: all 49 probe requests I sent without any cookie were answered with HTTP 200. The site's home page is stricter than its API: &lt;code&gt;https://www.nseindia.com/&lt;/code&gt; answered HTTP 403 "Access Denied" to the same client that the API and the filings page served with HTTP 200. If the API ever answers 401 or 403, load the filings page first in the same &lt;code&gt;requests.Session&lt;/code&gt; (it sets cookies) and retry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dates are &lt;code&gt;DD-MM-YYYY&lt;/code&gt;, and a wrong format fails silently.&lt;/strong&gt; &lt;code&gt;from_date=2026-11-09&lt;/code&gt; and &lt;code&gt;from_date=09/11/2026&lt;/code&gt; both return HTTP 200 with &lt;code&gt;{"data":[],"msg":"no data found"}&lt;/code&gt;. Note the shape change too: a dict instead of the usual array.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;index&lt;/code&gt; is required.&lt;/strong&gt; Without it the answer is HTTP 200 with the plain text &lt;code&gt;Missing index&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. No dates means "the latest 20", except with a symbol.&lt;/strong&gt; &lt;code&gt;corporate-announcements?index=equities&lt;/code&gt; returns the 20 newest rows. Add &lt;code&gt;symbol=RELIANCE&lt;/code&gt; without dates and you get the company's whole history: 3,375 announcements back to 13 December 2004, 3.0 MB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deals: &lt;code&gt;from&lt;/code&gt;/&lt;code&gt;to&lt;/code&gt;, the 70-row JSON cap, and CSV quirks.&lt;/strong&gt; See above. If your bulk-deal counts look suspiciously round, this is why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Two endpoints are not usable for a date range.&lt;/strong&gt; &lt;code&gt;corporates-financial-results&lt;/code&gt; with 3 to 9 November returned 1 row (a filing for a quarter ended June 2024), in a week when the announcements feed carried 895 board meeting outcomes; without dates it returned 3,816 rows, of which 3,695 were broadcast in January or February 2025. &lt;code&gt;corporates-pit&lt;/code&gt; (insider trading) returned an empty list for every variant I tried, with and without dates and symbol. For results, filter announcements by &lt;code&gt;desc&lt;/code&gt;; for insider trades there is the RSS feed, which only holds the latest items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Times are India time without an offset.&lt;/strong&gt; &lt;code&gt;an_dt&lt;/code&gt; is &lt;code&gt;09-Nov-2026 23:45:59&lt;/code&gt;. Parse it as Asia/Kolkata (UTC+05:30) before comparing with anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Be a polite client.&lt;/strong&gt; The answers are large (10.5 MB for one month of equities) and the data for past days does not change. Download a day once and cache it, poll the current day every few minutes at most, and keep requests sequential.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to maintain this yourself
&lt;/h2&gt;

&lt;p&gt;The snippets above are enough for a script. A product needs more: parsing the free-text corporate actions, the CSV workaround for deals, India-time timestamps, a memory of delivered rows, retries, and someone who notices when NSE changes a field.&lt;/p&gt;

&lt;p&gt;I packaged that as the &lt;a href="https://apify.com/data_daemon/nse-corporate-announcements?utm_source=devto&amp;amp;utm_campaign=nse-api" rel="noopener noreferrer"&gt;NSE Corporate Announcements API on Apify&lt;/a&gt; (disclosure: I built it). One input covers eight reports (announcements, corporate actions, board meetings, event calendar, deals, credit ratings, shareholding patterns, offer documents), with symbol, category and keyword filters and an &lt;code&gt;onlyNew&lt;/code&gt; mode that delivers each row once. It reads the same public endpoints described here.&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="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&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="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"APIFY_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;]&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="s2"&gt;"data_daemon/nse-corporate-announcements"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"reports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"announcements"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"corporateActions"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"categories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Dividend"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# NSE's subject contains this word&lt;/span&gt;
        &lt;span class="s2"&gt;"daysBack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;# filings: the last 7 days&lt;/span&gt;
        &lt;span class="s2"&gt;"daysAhead"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;# ex-dates: the next 30 days&lt;/span&gt;
        &lt;span class="s2"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;# per report&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_total_charge_usd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"0.05"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&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="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"statusMessage"&lt;/span&gt;&lt;span class="p"&gt;]&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;row&lt;/span&gt; &lt;span class="k"&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="s2"&gt;"defaultDatasetId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"reportType"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"announcements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"broadcastAt"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"attachmentUrl"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"exDate"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"actionType"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"amountPerShare"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"purpose"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUCCEEDED | Saved 4 announcements (2026-11-03 to 2026-11-10), capped by maxItems 4; 4 corporate actions (2026-11-10 to 2026-12-10), capped by maxItems 4. Set maxItems to 0 for every row in the dates.
2026-11-10T14:34:06+05:30 COCHINSHIP | Dividend | Aswi4739_10112026143317_SE_Intimation_Sgd.pdf
2026-11-06T20:18:10+05:30 TRANSWORLD | Dividend | TRANSWORLD_06112026201735_Board_Meeting_Outcome-signed.pdf
2026-11-06T20:13:56+05:30 RAIN | Dividend | RAIN_06112026201303_OutcomeOfBoardMeeting.pdf
2026-11-06T19:07:15+05:30 INGERRAND | Dividend | INGERRAND1_06112026190613_FinancialResultsSept2026.pdf
2026-11-11 ADFFOODS | dividend 0.6 | Interim Dividend - Re 0.60 Per Share
2026-11-11 AUROPHARMA | dividend 7 | Interim Dividend - Rs 7 Per Share
2026-11-11 BALKRISIND | dividend 4 | Interim Dividend - Rs 4 Per Share
2026-11-11 BALRAMCHIN | dividend 4 | Interim Dividend - Rs 4 Per Share
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That run took 3 seconds and delivered 8 rows. The price is $0.003 per row, with no start fee and no subscription. What typical jobs cost, using the row counts measured above:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Rows on 10 Nov 2026&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default run: the 50 newest announcements&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;$0.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ex-dates for the next 30 days&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;$0.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One company's announcements in 2026 (RELIANCE)&lt;/td&gt;
&lt;td&gt;146&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk, block and short-selling rows, 3-9 Nov&lt;/td&gt;
&lt;td&gt;1,227&lt;/td&gt;
&lt;td&gt;$3.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One busy day of equity announcements (5 Nov)&lt;/td&gt;
&lt;td&gt;1,530&lt;/td&gt;
&lt;td&gt;$4.59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A week of equity announcements (3-9 Nov)&lt;/td&gt;
&lt;td&gt;6,029&lt;/td&gt;
&lt;td&gt;$18.09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All equity announcements of October 2026&lt;/td&gt;
&lt;td&gt;14,045&lt;/td&gt;
&lt;td&gt;$42.14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ready-made inputs: &lt;a href="https://apify.com/data_daemon/nse-corporate-announcements/examples/nse-corporate-announcements-api-latest-filings-json?utm_source=devto&amp;amp;utm_campaign=nse-api" rel="noopener noreferrer"&gt;latest NSE corporate announcements as JSON&lt;/a&gt; and &lt;a href="https://apify.com/data_daemon/nse-corporate-announcements/examples/nse-bulk-deals-block-deals-api-last-7-days-json?utm_source=devto&amp;amp;utm_campaign=nse-api" rel="noopener noreferrer"&gt;bulk and block deals of the last 7 days&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nothing here is investment advice; it is a description of where public disclosures can be read.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Is there an official NSE API for corporate announcements?
&lt;/h3&gt;

&lt;p&gt;Not a free developer API. NSE's website offers RSS feeds (23 of them, including announcements, corporate actions and board meetings) and NSE Data &amp;amp; Analytics sells licensed Corporate Data products (listed on 10 November 2026 at INR 500,000 a year for the end-of-day file and INR 1,060,000 for the leased-line feed). The JSON endpoints in this post are the ones the public filing pages call; NSE does not document them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the NSE API need an API key or cookies?
&lt;/h3&gt;

&lt;p&gt;No key exists. On 10 November 2026 the endpoints answered 49 of 49 requests that carried only a browser-like &lt;code&gt;User-Agent&lt;/code&gt; header and no cookie. The default &lt;code&gt;python-requests&lt;/code&gt; User-Agent got no answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I get NSE bulk deals and block deals for a date range?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GET /api/historicalOR/bulk-block-short-deals?optionType=bulk_deals&amp;amp;from=DD-MM-YYYY&amp;amp;to=DD-MM-YYYY&amp;amp;csv=true&lt;/code&gt; (or &lt;code&gt;block_deals&lt;/code&gt;, &lt;code&gt;short_selling&lt;/code&gt;). Keep &lt;code&gt;csv=true&lt;/code&gt;: without it the JSON stops at 70 rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  What date format does the NSE API use?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;DD-MM-YYYY&lt;/code&gt; in requests (&lt;code&gt;from_date=09-11-2026&lt;/code&gt;). Responses use &lt;code&gt;09-Nov-2026 23:45:59&lt;/code&gt; for timestamps and &lt;code&gt;11-Nov-2026&lt;/code&gt; for ex-dates, in India time.&lt;/p&gt;

&lt;h3&gt;
  
  
  How far back do NSE announcements go?
&lt;/h3&gt;

&lt;p&gt;For one symbol, a long way: RELIANCE returned 3,375 announcements, the oldest dated 13 December 2004. Whole-market ranges work as well; I pulled the 14,045 equity announcements of October 2026 in one request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this cover BSE?
&lt;/h3&gt;

&lt;p&gt;No. These are NSE's endpoints and NSE's filings only.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>webscraping</category>
      <category>stockmarket</category>
    </item>
    <item>
      <title>What Dubai tenants actually pay: 95,572 Ejari rent contracts registered in October 2026, by area, size and new vs renewed</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Mon, 09 Nov 2026 12:59:55 +0000</pubDate>
      <link>https://dev.to/datadaemon/what-dubai-tenants-actually-pay-95572-ejari-rent-contracts-registered-in-october-2026-by-area-2nkd</link>
      <guid>https://dev.to/datadaemon/what-dubai-tenants-actually-pay-95572-ejari-rent-contracts-registered-in-october-2026-by-area-2nkd</guid>
      <description>&lt;p&gt;Dubai property portals show asking rents. The Dubai Land Department (DLD) publishes something better: every tenancy contract registered through Ejari, with the annual rent the tenant and landlord actually signed, the size, the area and whether the lease is new or a renewal. It is open data, but it comes as a search form with no API.&lt;/p&gt;

&lt;p&gt;I pulled &lt;strong&gt;every rent contract DLD registered from 1 to 31 October 2026: 112,048 rows, which are 95,572 contracts&lt;/strong&gt; once multi-unit contracts are counted once. Then I grouped them by property type, area, size and new vs renewed. Data read on 9 November 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The median registered flat rent in Dubai was AED 65,000 a year&lt;/strong&gt; (about USD 17,700). The middle half of 66,525 single-unit flat contracts was AED 47,000-94,000; 10% were below AED 38,000 and 10% above AED 140,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per square metre, the median flat rents for AED 885 per year&lt;/strong&gt;, about AED 82 per square foot. The median flat is 78 sqm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New leases cost more than renewals, but less than the headline gap suggests.&lt;/strong&gt; Citywide, new flat leases registered at AED 1,023 per sqm against AED 766 for renewals, +34%. Inside the same area the median gap is &lt;strong&gt;+10%&lt;/strong&gt; (61 of 71 areas with at least 50 of each had new above renewed). The rest of the citywide gap is mix: new leases cluster in Dubai Creek Harbour, Downtown, Business Bay and JVC, renewals in Deira, Al Nahda and International City.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Half of October's contracts were renewals&lt;/strong&gt; (51%), 79% residential, 20% commercial. Flats are 70% of all contracts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Villas: median AED 177,300 a year&lt;/strong&gt; (6,406 single-unit villa contracts), from AED 95,000 in Damac Hills 2 to AED 260,000 in Dubai Hills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offices need a caveat.&lt;/strong&gt; A third of the 11,372 office contracts are &lt;strong&gt;Virtual Units&lt;/strong&gt; (registered desks or ejari-only addresses with a nominal 10-20 sqm). In Business Bay they are 66% of office contracts. Physical offices in Business Bay had a median rent of AED 117,600 (AED 1,584 per sqm) and in JLT AED 130,000 (AED 1,250 per sqm).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not sum the rows.&lt;/strong&gt; 1,891 contracts cover more than one unit (a whole building, a labour camp) and DLD repeats the contract rent on each of their 17,928 unit rows. Summing rows gives AED 53.8 billion of annual rent for October; counting each contract once gives AED 10.9 billion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Flats by size
&lt;/h2&gt;

&lt;p&gt;DLD fills the &lt;code&gt;rooms&lt;/code&gt; field on almost no rent rows (3.9% overall, none of the flats), so size is the usable proxy for bedrooms. Single-unit flats with a size of at least 15 sqm, October 2026, medians:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Contracts&lt;/th&gt;
&lt;th&gt;Median annual rent (AED)&lt;/th&gt;
&lt;th&gt;Middle half&lt;/th&gt;
&lt;th&gt;Median AED per sqm&lt;/th&gt;
&lt;th&gt;New leases&lt;/th&gt;
&lt;th&gt;New median&lt;/th&gt;
&lt;th&gt;Renewed median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;15-45 sqm (studios)&lt;/td&gt;
&lt;td&gt;10,777&lt;/td&gt;
&lt;td&gt;41,000&lt;/td&gt;
&lt;td&gt;34,000-48,400&lt;/td&gt;
&lt;td&gt;1,121&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;44,000&lt;/td&gt;
&lt;td&gt;37,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45-75 sqm (most one-beds)&lt;/td&gt;
&lt;td&gt;19,573&lt;/td&gt;
&lt;td&gt;57,500&lt;/td&gt;
&lt;td&gt;45,000-75,000&lt;/td&gt;
&lt;td&gt;931&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;td&gt;63,000&lt;/td&gt;
&lt;td&gt;51,999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75-115 sqm (large one-beds, two-beds)&lt;/td&gt;
&lt;td&gt;20,586&lt;/td&gt;
&lt;td&gt;72,000&lt;/td&gt;
&lt;td&gt;57,000-98,000&lt;/td&gt;
&lt;td&gt;787&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;td&gt;84,765&lt;/td&gt;
&lt;td&gt;64,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;115-170 sqm (two- and three-beds)&lt;/td&gt;
&lt;td&gt;10,797&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;77,000-145,000&lt;/td&gt;
&lt;td&gt;752&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;125,000&lt;/td&gt;
&lt;td&gt;89,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;170 sqm and more&lt;/td&gt;
&lt;td&gt;3,644&lt;/td&gt;
&lt;td&gt;140,000&lt;/td&gt;
&lt;td&gt;84,964-220,000&lt;/td&gt;
&lt;td&gt;658&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;180,000&lt;/td&gt;
&lt;td&gt;115,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two patterns: small units rent for more per square metre (AED 1,121 for a studio-sized unit against AED 658 for 170 sqm and up), and the share of new leases falls with size. Studios turn over, family flats renew. DLD also has a separate &lt;code&gt;Studio&lt;/code&gt; sub-type (843 contracts, median AED 35,000, median 40 sqm); it is not in the Flat figures above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flats by area
&lt;/h2&gt;

&lt;p&gt;The 20 areas with the most single-unit flat contracts. DLD uses official area names; the community name is in brackets. "New vs renewed per sqm" compares the median rent per sqm of new leases with renewals in the same area.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area (DLD name)&lt;/th&gt;
&lt;th&gt;Flat contracts&lt;/th&gt;
&lt;th&gt;Median annual rent (AED)&lt;/th&gt;
&lt;th&gt;Middle half&lt;/th&gt;
&lt;th&gt;Median AED per sqm&lt;/th&gt;
&lt;th&gt;Median size&lt;/th&gt;
&lt;th&gt;New leases&lt;/th&gt;
&lt;th&gt;New vs renewed per sqm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Al Barsha South Fourth (JVC)&lt;/td&gt;
&lt;td&gt;3,959&lt;/td&gt;
&lt;td&gt;62,000&lt;/td&gt;
&lt;td&gt;50,000-78,000&lt;/td&gt;
&lt;td&gt;979&lt;/td&gt;
&lt;td&gt;69 sqm&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;td&gt;+10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Khairan First (Dubai Creek Harbour)&lt;/td&gt;
&lt;td&gt;3,438&lt;/td&gt;
&lt;td&gt;110,000&lt;/td&gt;
&lt;td&gt;91,000-147,000&lt;/td&gt;
&lt;td&gt;1,328&lt;/td&gt;
&lt;td&gt;93 sqm&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;td&gt;-8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Bay&lt;/td&gt;
&lt;td&gt;3,180&lt;/td&gt;
&lt;td&gt;88,403&lt;/td&gt;
&lt;td&gt;69,318-120,000&lt;/td&gt;
&lt;td&gt;1,198&lt;/td&gt;
&lt;td&gt;76 sqm&lt;/td&gt;
&lt;td&gt;66%&lt;/td&gt;
&lt;td&gt;+19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burj Khalifa (Downtown Dubai)&lt;/td&gt;
&lt;td&gt;3,054&lt;/td&gt;
&lt;td&gt;167,000&lt;/td&gt;
&lt;td&gt;120,000-230,000&lt;/td&gt;
&lt;td&gt;1,681&lt;/td&gt;
&lt;td&gt;105 sqm&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;td&gt;-1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jabal Ali First (Discovery Gardens, Al Furjan)&lt;/td&gt;
&lt;td&gt;2,653&lt;/td&gt;
&lt;td&gt;60,000&lt;/td&gt;
&lt;td&gt;44,999-75,762&lt;/td&gt;
&lt;td&gt;833&lt;/td&gt;
&lt;td&gt;77 sqm&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;+16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marsa Dubai (Dubai Marina, JBR)&lt;/td&gt;
&lt;td&gt;2,524&lt;/td&gt;
&lt;td&gt;115,500&lt;/td&gt;
&lt;td&gt;85,000-160,000&lt;/td&gt;
&lt;td&gt;1,137&lt;/td&gt;
&lt;td&gt;103 sqm&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;+7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Warsan First (International City)&lt;/td&gt;
&lt;td&gt;2,353&lt;/td&gt;
&lt;td&gt;38,000&lt;/td&gt;
&lt;td&gt;30,500-44,000&lt;/td&gt;
&lt;td&gt;627&lt;/td&gt;
&lt;td&gt;64 sqm&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;+9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nadd Hessa (Silicon Oasis)&lt;/td&gt;
&lt;td&gt;1,756&lt;/td&gt;
&lt;td&gt;54,000&lt;/td&gt;
&lt;td&gt;45,000-65,000&lt;/td&gt;
&lt;td&gt;761&lt;/td&gt;
&lt;td&gt;74 sqm&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;+12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Me'Aisem First (Dubai Production City)&lt;/td&gt;
&lt;td&gt;1,670&lt;/td&gt;
&lt;td&gt;64,140&lt;/td&gt;
&lt;td&gt;47,000-76,000&lt;/td&gt;
&lt;td&gt;990&lt;/td&gt;
&lt;td&gt;63 sqm&lt;/td&gt;
&lt;td&gt;65%&lt;/td&gt;
&lt;td&gt;+7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Merkadh (Sobha Hartland, MBR City)&lt;/td&gt;
&lt;td&gt;1,628&lt;/td&gt;
&lt;td&gt;72,000&lt;/td&gt;
&lt;td&gt;50,000-95,000&lt;/td&gt;
&lt;td&gt;1,371&lt;/td&gt;
&lt;td&gt;50 sqm&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;-3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Barshaa South Third (Arjan)&lt;/td&gt;
&lt;td&gt;1,608&lt;/td&gt;
&lt;td&gt;60,000&lt;/td&gt;
&lt;td&gt;47,000-75,000&lt;/td&gt;
&lt;td&gt;916&lt;/td&gt;
&lt;td&gt;70 sqm&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;+24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Nahda Second&lt;/td&gt;
&lt;td&gt;1,466&lt;/td&gt;
&lt;td&gt;53,000&lt;/td&gt;
&lt;td&gt;45,000-60,000&lt;/td&gt;
&lt;td&gt;590&lt;/td&gt;
&lt;td&gt;90 sqm&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;+12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Barsha First&lt;/td&gt;
&lt;td&gt;1,308&lt;/td&gt;
&lt;td&gt;75,000&lt;/td&gt;
&lt;td&gt;60,000-90,000&lt;/td&gt;
&lt;td&gt;853&lt;/td&gt;
&lt;td&gt;89 sqm&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;+9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Mararr (Deira)&lt;/td&gt;
&lt;td&gt;1,283&lt;/td&gt;
&lt;td&gt;40,000&lt;/td&gt;
&lt;td&gt;35,400-45,000&lt;/td&gt;
&lt;td&gt;643&lt;/td&gt;
&lt;td&gt;70 sqm&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;td&gt;-34%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Nahda First&lt;/td&gt;
&lt;td&gt;1,133&lt;/td&gt;
&lt;td&gt;58,800&lt;/td&gt;
&lt;td&gt;49,340-70,000&lt;/td&gt;
&lt;td&gt;581&lt;/td&gt;
&lt;td&gt;104 sqm&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;+13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Murqabat (Deira)&lt;/td&gt;
&lt;td&gt;1,126&lt;/td&gt;
&lt;td&gt;70,705&lt;/td&gt;
&lt;td&gt;54,000-95,000&lt;/td&gt;
&lt;td&gt;760&lt;/td&gt;
&lt;td&gt;86 sqm&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;+5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Karama&lt;/td&gt;
&lt;td&gt;1,102&lt;/td&gt;
&lt;td&gt;64,025&lt;/td&gt;
&lt;td&gt;52,800-80,000&lt;/td&gt;
&lt;td&gt;718&lt;/td&gt;
&lt;td&gt;89 sqm&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;+38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Hebiah Fourth (Dubai Sports City)&lt;/td&gt;
&lt;td&gt;1,088&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;40,000-65,000&lt;/td&gt;
&lt;td&gt;815&lt;/td&gt;
&lt;td&gt;69 sqm&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;+14%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Jadaf&lt;/td&gt;
&lt;td&gt;1,085&lt;/td&gt;
&lt;td&gt;73,000&lt;/td&gt;
&lt;td&gt;60,000-90,000&lt;/td&gt;
&lt;td&gt;940&lt;/td&gt;
&lt;td&gt;82 sqm&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;+18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Qusais&lt;/td&gt;
&lt;td&gt;1,075&lt;/td&gt;
&lt;td&gt;47,297&lt;/td&gt;
&lt;td&gt;38,000-60,000&lt;/td&gt;
&lt;td&gt;634&lt;/td&gt;
&lt;td&gt;75 sqm&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;+8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What the table shows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The new-build districts are where leases are signed.&lt;/strong&gt; JVC, Dubai Creek Harbour, Business Bay and Downtown each registered over 3,000 flat contracts, 64-71% of them new leases. In the older districts (Al Nahda, Al Qusais, Al Karama, Al Barsha First) only 19-31% of contracts were new; the rest are tenants renewing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The spread is six to one.&lt;/strong&gt; Among areas with at least 100 flat contracts, the cheapest medians were Al Baraha (AED 26,500), Eyal Nasser (34,250), Hor Al Anz (36,000) and Naif (37,000), all in Deira, and International City (38,000). The dearest were Palm Jumeirah (185,000), Al Wasl (183,000), Downtown (167,000), Zaabeel Second (150,000) and Umm Suqeim Third (135,000).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where new leases are not dearer.&lt;/strong&gt; In Dubai Creek Harbour, Downtown, Sobha Hartland and Dubai Hills, new leases registered at or slightly below renewals per sqm (-8% to -1%). These are areas where many renewals are first renewals of recently handed-over units, so the renewal base is already at market. Al Mararr's -34% is a stock effect: its new leases were mostly 70 sqm flats (median AED 45,000) while its renewals were small 30 sqm units (AED 31,000), which rent for more per sqm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where the gap is widest.&lt;/strong&gt; Trade Centre First (+47%), Jumeirah First (+45%), Al Karama (+38%), Muhaisanah Fourth (+34%) and Warsan Fourth (+30%): older stock where sitting tenants are protected by the RERA rent index and a new tenant pays the current market.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Villas
&lt;/h2&gt;

&lt;p&gt;6,406 single-unit villa contracts, median AED 177,300 a year, middle half AED 130,000-250,000, median size 256 sqm, 47% new leases.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area (DLD name)&lt;/th&gt;
&lt;th&gt;Villa contracts&lt;/th&gt;
&lt;th&gt;Median annual rent (AED)&lt;/th&gt;
&lt;th&gt;Middle half&lt;/th&gt;
&lt;th&gt;New leases&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mirdif&lt;/td&gt;
&lt;td&gt;539&lt;/td&gt;
&lt;td&gt;121,275&lt;/td&gt;
&lt;td&gt;100,000-143,000&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Madinat Hind 4 (Damac Hills 2)&lt;/td&gt;
&lt;td&gt;491&lt;/td&gt;
&lt;td&gt;95,000&lt;/td&gt;
&lt;td&gt;80,000-110,000&lt;/td&gt;
&lt;td&gt;63%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wadi Al Safa 5 (Arabian Ranches III, Villanova)&lt;/td&gt;
&lt;td&gt;435&lt;/td&gt;
&lt;td&gt;165,000&lt;/td&gt;
&lt;td&gt;150,000-205,000&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wadi Al Safa 7 (Rukan, The Sustainable City)&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;147,047&lt;/td&gt;
&lt;td&gt;91,062-227,456&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jabal Ali First (Al Furjan)&lt;/td&gt;
&lt;td&gt;268&lt;/td&gt;
&lt;td&gt;210,000&lt;/td&gt;
&lt;td&gt;185,000-260,000&lt;/td&gt;
&lt;td&gt;66%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Thanayah Fourth (The Springs)&lt;/td&gt;
&lt;td&gt;259&lt;/td&gt;
&lt;td&gt;216,000&lt;/td&gt;
&lt;td&gt;160,000-310,000&lt;/td&gt;
&lt;td&gt;46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hadaeq Sheikh Mohammed Bin Rashid (Dubai Hills)&lt;/td&gt;
&lt;td&gt;251&lt;/td&gt;
&lt;td&gt;260,000&lt;/td&gt;
&lt;td&gt;190,000-382,500&lt;/td&gt;
&lt;td&gt;63%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Yelayiss 2 (Town Square)&lt;/td&gt;
&lt;td&gt;212&lt;/td&gt;
&lt;td&gt;150,000&lt;/td&gt;
&lt;td&gt;140,000-160,000&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Madinat Al Mataar (Dubai South)&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;125,000&lt;/td&gt;
&lt;td&gt;105,000-153,750&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Hebiah Fifth (Damac Lagoons)&lt;/td&gt;
&lt;td&gt;183&lt;/td&gt;
&lt;td&gt;145,000&lt;/td&gt;
&lt;td&gt;136,188-175,000&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Damac Lagoons is a handover story: 98% of its October villa contracts were new leases. Mirdif is the opposite, 71% renewals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offices, shops and warehouses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offices: 11,372 single-unit contracts, 70% new leases.&lt;/strong&gt; 3,796 of them (33%) are &lt;code&gt;propertyType = Virtual Unit&lt;/code&gt;: a registered office address or desk with a nominal size (median 20 sqm, median rent AED 20,000). They sit mostly in Business Bay (1,338), Dubai Investment Park (1,489) and Wadi Al Safa 2 (260). Exclude them before computing office rents per sqm, or every Business Bay office benchmark will be wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical offices&lt;/strong&gt; (7,363 with size and rent): median AED 45,000 a year, median AED 870 per sqm, median size 49 sqm. Business Bay: 675 physical office contracts, median AED 117,600 (middle half 72,000-187,713), AED 1,584 per sqm, median 89 sqm. JLT (Al Thanyah Fifth): 331, median AED 130,000, AED 1,250 per sqm, median 105 sqm. Deira's small offices (Hor Al Anz, Al Khabeesi, Al Muteena, Naif) register at AED 15,000-20,000 for 20-30 sqm, AED 667-714 per sqm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shops:&lt;/strong&gt; 4,981 single-unit contracts, median AED 81,000 a year, AED 1,908 per sqm (the highest of any type), 30% new.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warehouses:&lt;/strong&gt; 789 contracts, median AED 145,692 a year, AED 457 per sqm, 29% new.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labour camps:&lt;/strong&gt; 1,259 contracts, 763 of them multi-unit (the largest covered 549 units).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What a month of Ejari data looks like
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume.&lt;/strong&gt; 112,048 rows in 31 days: 22 working days with a median of 4,677 rows (3,307 to 5,688), Saturdays 1,508-2,091, Sundays 683-988. 89% of rows carry a Monday-to-Friday date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lease terms.&lt;/strong&gt; 92% of flat leases run 12 months; 1.8% are under six months and 1.2% over 400 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration timing.&lt;/strong&gt; The median flat contract was registered one day before its start date; 52% were registered before the lease started, 11.5% more than 30 days after, and 6.8% 60 or more days after. A feed keyed on lease start dates will keep receiving October leases into December.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates.&lt;/strong&gt; 439 of the 94,120 single-unit rows were exact duplicates of another row (same registration second, dates, amounts, size, area) and were dropped. Multi-unit contracts legitimately repeat: 17,928 rows (16%) belong to 1,891 contracts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field coverage.&lt;/strong&gt; Size 100%, area 100%, sub-type 99.7%, usage 99.8%, nearest metro 84%, project 33%, rooms 3.9%, parking 1.9%, master project 0%. Rent per sqm is defined for 84% of rows (single-unit contracts, and multi-unit contracts whose units were all returned).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; DLD's open-data rent contracts service (the register behind Ejari), read with the &lt;a href="https://apify.com/data_daemon/dubai-rent-contracts" rel="noopener noreferrer"&gt;Dubai Rent Contracts API&lt;/a&gt; Actor on Apify, build 0.1.4, input &lt;code&gt;fromDate 2026-10-01&lt;/code&gt;, &lt;code&gt;toDate 2026-10-31&lt;/code&gt;, all areas, all usages, on 9 November 2026. The full month was pulled with the Actor's code; a platform run of the same Actor for 20-26 October (23,389 rows) matched the month pull row for row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contracts, not rows.&lt;/strong&gt; DLD lists a contract that covers several units once per unit, repeating the contract's amounts. Rows were grouped into contracts on the Actor's key (registration second, start and end date, contract and annual amount, unit count, version, area, freehold), never more rows than the contract's &lt;code&gt;unitsInContract&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-unit figures&lt;/strong&gt; (medians by area, size band, per sqm) use single-unit contracts only (&lt;code&gt;unitsInContract = 1&lt;/code&gt;), the &lt;code&gt;Flat&lt;/code&gt; sub-type for flats, a positive annual rent, and a size of at least 15 sqm for anything per sqm. Virtual Units are excluded from office rents per sqm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medians&lt;/strong&gt;, with the middle half (25th to 75th percentile), not averages: one AED 21 million labour-camp contract or a whole-floor Downtown lease moves an average by thousands of dirhams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New vs renewed&lt;/strong&gt; is DLD's own &lt;code&gt;version&lt;/code&gt; field. Renewal increases are capped by the RERA rent index, so renewals lag the market by design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not measured:&lt;/strong&gt; furnished vs unfurnished, cheques, bedroom counts (DLD does not publish them for flats), and anything about the parties: the register has no names or contract numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Ejari rent contracts as JSON
&lt;/h2&gt;

&lt;p&gt;DLD publishes the register on its open-data pages as a search form; there is no documented REST API or key. The &lt;a href="https://apify.com/data_daemon/dubai-rent-contracts" rel="noopener noreferrer"&gt;Dubai Rent Contracts API&lt;/a&gt; Actor reads that service and returns one row per registered contract unit: ISO dates, numeric AED amounts, &lt;code&gt;sizeSqm&lt;/code&gt;, &lt;code&gt;annualRentPerSqmAed&lt;/code&gt;, &lt;code&gt;unitsInContract&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;usage&lt;/code&gt;, &lt;code&gt;freehold&lt;/code&gt;, nearest metro and mall. It needs no login, API key or proxy and costs $1 per 1,000 rows (less on higher Apify plans). The 112,048 rows behind this article cost about $112 at list price, or about $96 with &lt;strong&gt;One row per contract&lt;/strong&gt; on; a week of one area's flats costs under a dollar (Business Bay had 663 flat rows in the week to 9 November).&lt;/p&gt;

&lt;p&gt;Business Bay flats, last 7 days, one row per contract:&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/dubai-rent-contracts&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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daysBack&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;areas&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;Business Bay&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;propertySubTypes&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;Flat&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;oneRowPerContract&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;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;20&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;# 0 = everything in range
&lt;/span&gt;    &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&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="n"&gt;flats&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;unitsInContract&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# per-unit rents only
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&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;contracts,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flats&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;single-unit&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;flats&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;version&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;annualAmountAed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&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;median&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;median AED per sqm per year:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;annualRentPerSqmAed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output of that exact call on 9 November 2026 (the first 20 contracts registered since 2 November; 1,249 Business Bay rows were available):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20 contracts, 20 single-unit
         size    median
version
New        17   72000.0
Renewed     3  159000.0
median AED per sqm per year: 1434.72
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same thing as one HTTP call, for a daily feed or a spreadsheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~dubai-rent-contracts/run-sync-get-dataset-items?timeout=300&amp;amp;format=csv"&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 &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&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;'{"daysBack": 1, "contractVersion": "new", "propertySubTypes": ["Flat"], "maxItems": 0}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a daily feed, schedule the Actor with &lt;code&gt;daysBack: 2&lt;/code&gt; and &lt;code&gt;onlyNew: true&lt;/code&gt;: each contract is delivered and charged once, and late registrations are still caught. Ready-made inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-rent-contracts/examples/dubai-marina-rent-prices-api-ejari-flat-contracts" rel="noopener noreferrer"&gt;Dubai Marina rent prices: Ejari flat contracts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-rent-contracts/examples/business-bay-office-rents-api-ejari-commercial-leases" rel="noopener noreferrer"&gt;Business Bay office rents: commercial leases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/dubai-rent-contracts&lt;/code&gt; in Claude, ChatGPT or Cursor and ask "what did one-bedroom-sized flats in JVC rent for last week?".&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is the average rent in Dubai in 2026?&lt;/strong&gt;&lt;br&gt;
For flats, the median registered rent in October 2026 was AED 65,000 a year across 66,525 single-unit Ejari contracts; the middle half was AED 47,000-94,000. Villas had a median of AED 177,300. Quote the area and size: the median International City flat (64 sqm) registered at AED 38,000 and the median Downtown flat (105 sqm) at AED 167,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much is rent per square foot in Dubai?&lt;/strong&gt;&lt;br&gt;
The median flat registered at AED 885 per sqm per year, about AED 82 per square foot. Downtown (AED 1,681 per sqm), Sobha Hartland (1,371) and Dubai Creek Harbour (1,328) were the dearest busy areas; Muhaisanah Fourth (488), Al Nahda (580-590) and International City (627) the cheapest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much more do new tenants pay than renewing tenants?&lt;/strong&gt;&lt;br&gt;
About 10% per square metre in the same area (median of 71 areas with at least 50 of each; 61 had new above renewed). Citywide the gap is 34% because new leases are concentrated in newer, dearer districts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Ejari data public? Is there an Ejari API?&lt;/strong&gt;&lt;br&gt;
The Dubai Land Department publishes registered rent contracts as open data on its website, without tenant or landlord names. There is no documented public API; the &lt;a href="https://apify.com/data_daemon/dubai-rent-contracts" rel="noopener noreferrer"&gt;Dubai Rent Contracts API&lt;/a&gt; on Apify returns that register as JSON, CSV or Excel for any date range, and can run on a schedule or be called from code, n8n, Make or an AI assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does one contract appear many times in the DLD data?&lt;/strong&gt;&lt;br&gt;
A contract for a whole building or labour camp is listed once per unit with the full contract rent on each row. In October 2026, 1,891 such contracts produced 17,928 rows. Use &lt;code&gt;unitsInContract&lt;/code&gt; to spot them, or the Actor's &lt;strong&gt;One row per contract&lt;/strong&gt; option to merge them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the data say how many bedrooms a flat has?&lt;/strong&gt;&lt;br&gt;
Almost never for rent contracts (the &lt;code&gt;rooms&lt;/code&gt; field is filled on 3.9% of rows and none of the flats). Use &lt;code&gt;sizeSqm&lt;/code&gt;: in October 2026, 15-45 sqm units registered at a median of AED 41,000, 45-75 sqm at 57,500, 75-115 sqm at 72,000 and 115-170 sqm at 100,000.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are from the DLD register as read on 9 November 2026 and will shift slightly as late registrations are added. Nothing here is investment or legal advice. Data: Dubai Land Department open data (Ejari rent contracts).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dubai</category>
      <category>realestate</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>What salary should you offer a data analyst in India? 104 Naukri posts (November 2026)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Fri, 06 Nov 2026 02:00:29 +0000</pubDate>
      <link>https://dev.to/datadaemon/what-salary-should-you-offer-a-data-analyst-in-india-104-naukri-posts-november-2026-98c</link>
      <guid>https://dev.to/datadaemon/what-salary-should-you-offer-a-data-analyst-in-india-104-naukri-posts-november-2026-98c</guid>
      <description>&lt;p&gt;&lt;strong&gt;For a data-analyst vacancy open to candidates with two or three years of experience, the median advertised salary-band midpoint in this sample was ₹8 LPA.&lt;/strong&gt; Across all 104 dated data-analyst posts, 34 disclosed a usable band, with a median midpoint of &lt;strong&gt;₹9.25 LPA&lt;/strong&gt;. The other &lt;strong&gt;70 posts (67.3%) hid salary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These are advertised annual bands from a small, recent Naukri sample, collected on &lt;strong&gt;6 November 2026 at 01:53 UTC (07:23 IST)&lt;/strong&gt;. They give employers a starting point for comparing a vacancy with public offers. They do not establish a market rate: most posts hide pay, and the disclosed group may differ from the rest.&lt;/p&gt;

&lt;p&gt;I built the &lt;a href="https://apify.com/data_daemon/naukri-jobs-scraper" rel="noopener noreferrer"&gt;Naukri Jobs Scraper&lt;/a&gt; used to collect the data. Here is what it returned, how I narrowed the titles, and code to repeat the search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data analyst salary in India: what the public bands say
&lt;/h2&gt;

&lt;p&gt;The 34 disclosed bands had a median lower endpoint of &lt;strong&gt;₹7 LPA&lt;/strong&gt; and a median upper endpoint of &lt;strong&gt;₹13.5 LPA&lt;/strong&gt;. The middle half of individual band midpoints ran from &lt;strong&gt;₹5.78 to ₹14.75 LPA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For each job I calculate &lt;code&gt;(salaryMinInr + salaryMaxInr) / 2&lt;/code&gt;, then take the median across jobs. The lower-endpoint and upper-endpoint medians are calculated separately, so their average need not equal the median midpoint. They are not a single employer's offer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LPA means lakh rupees per annum:&lt;/strong&gt; one lakh is ₹100,000. Dividing the overall median midpoint by twelve gives &lt;strong&gt;₹77,083 per month&lt;/strong&gt; as an arithmetic annual-to-monthly equivalent. It is not take-home pay; this study does not establish deductions, benefits or the fixed-versus-variable split.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data analyst salary for freshers and 2, 3 or 5 years of experience
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu12vkbcch3gs28d0oghe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu12vkbcch3gs28d0oghe.png" alt="Median advertised data-analyst salary-band midpoint by eligible experience: 0, 2, 3 and 5 years. Groups overlap; disclosed bands only." width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This table asks: which posts accept a candidate with exactly this many years of experience? A post advertising 2–5 years appears in the 2-, 3- and 5-year rows. The rows overlap and must not be added together. A fresher-eligible post can also accept experienced candidates; it is not necessarily a dedicated graduate vacancy.&lt;/p&gt;

&lt;p&gt;All salary values below are &lt;strong&gt;LPA&lt;/strong&gt;, and only disclosed bands contribute to the salary columns.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Candidate experience, years&lt;/th&gt;
&lt;th&gt;Eligible posts&lt;/th&gt;
&lt;th&gt;Disclosed bands&lt;/th&gt;
&lt;th&gt;Median floor&lt;/th&gt;
&lt;th&gt;Median ceiling&lt;/th&gt;
&lt;th&gt;Median band midpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 (freshers eligible)&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;4.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9.5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9.5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fresher estimate rests on just &lt;strong&gt;5 disclosed bands&lt;/strong&gt;. The experienced rows are also small. Treat these as observations from this search window, rather than precise salary targets.&lt;/p&gt;

&lt;p&gt;To separate junior and senior requirements without overlapping rows, here is the same sample grouped by the &lt;strong&gt;minimum experience requested&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Minimum requested experience, years&lt;/th&gt;
&lt;th&gt;Posts&lt;/th&gt;
&lt;th&gt;Disclosed bands&lt;/th&gt;
&lt;th&gt;Median band midpoint, LPA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0-1&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4+&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For budgeting, this second table separates posts requiring at least four years from posts that merely allow a five-year candidate to apply. Review the actual responsibilities and band endpoints before choosing a range for your vacancy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about Bangalore and other cities?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City named in the post&lt;/th&gt;
&lt;th&gt;Posts&lt;/th&gt;
&lt;th&gt;Disclosed bands&lt;/th&gt;
&lt;th&gt;Median band midpoint, LPA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bengaluru&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;9.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pune&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Suppressed: fewer than 5 bands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gurugram&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Suppressed: fewer than 5 bands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chennai&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mumbai&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Suppressed: fewer than 5 bands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hyderabad&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Suppressed: fewer than 5 bands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bengaluru is Bangalore. A multi-city post counts once in each city it names, so these rows overlap. I suppress salary medians below five disclosed bands. Chennai is exactly at that threshold. City differences also mix experience levels, employers and responsibilities; this is not a controlled comparison of city pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are so many Naukri salaries “not disclosed”?
&lt;/h2&gt;

&lt;p&gt;In this sample, only &lt;strong&gt;32.7%&lt;/strong&gt; of posts disclosed a usable salary band. Hidden pay stays missing in the calculations; it is never replaced with zero or a salary estimate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.naukri.com/blog/recruiter-job-posting/" rel="noopener noreferrer"&gt;Naukri's recruiter job-posting guide&lt;/a&gt; explains that an employer can enter an annual salary range for matching while choosing to hide it from candidates. The public data cannot tell us why an individual employer chose that option, or what its hidden budget is.&lt;/p&gt;

&lt;p&gt;For an employer using public posts to set a budget, the missing share matters as much as the median. The visible bands describe the employers who disclosed pay, not all employers hiring data analysts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method and limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection:&lt;/strong&gt; one live Actor run, &lt;code&gt;NzgcDAl8gHV8tIzh3&lt;/code&gt;, build &lt;code&gt;0.1.8&lt;/code&gt;. Input: &lt;code&gt;queries: ["data analyst"]&lt;/code&gt;, all cities, &lt;code&gt;postedWithinDays: 3&lt;/code&gt;, newest first, &lt;code&gt;keywordInTitle: true&lt;/code&gt;, descriptions off, and limits of 300 jobs per query and in total. The run returned &lt;strong&gt;160 distinct job IDs&lt;/strong&gt;, below the cap, with no failed searches or cost/timeout/source-outage stop. It finished at &lt;strong&gt;2026-11-06T01:53:48.012Z&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role definition:&lt;/strong&gt; Naukri's keyword match is loose. The Actor rejected &lt;strong&gt;1,704&lt;/strong&gt; returned search-card occurrences whose titles failed its keyword filter. In the retained rows I applied a stricter rule: normalize punctuation to spaces, then require the adjacent phrase &lt;code&gt;data analyst&lt;/code&gt; or &lt;code&gt;data analysts&lt;/code&gt;. That excluded &lt;strong&gt;55&lt;/strong&gt; related titles such as database management analyst and data engineering analyst. These filters improve relevance but can miss equivalent roles with different titles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dated sample:&lt;/strong&gt; one further post lacked &lt;code&gt;postedAt&lt;/code&gt; and was excluded. That leaves &lt;strong&gt;104 dated posts from 81 named employers&lt;/strong&gt;. Their source timestamps range from &lt;strong&gt;3 November 2026 at 03:39 UTC to 5 November 2026 at 19:32 UTC&lt;/strong&gt;. Every retained timestamp falls inside the requested three-day window. The largest named employer contributed 6 posts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage:&lt;/strong&gt; this is what one public search returned under these rules. It is not a whole-board export, a random sample, or proof that every Indian data-analyst vacancy was captured. A job ID is a post, not a count of vacancies; similar roles with different IDs remain separate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New versus refreshed:&lt;/strong&gt; the posting window uses Naukri's source timestamp. &lt;a href="https://www.naukri.com/blog/recruiter-job-posting/" rel="noopener noreferrer"&gt;Naukri documents automatic job refresh&lt;/a&gt;. A single snapshot cannot distinguish genuinely new vacancies from refreshed or reposted jobs. These are recent search results, not a verified count of new hires or newly created roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salary:&lt;/strong&gt; search-card fields only, in nominal INR per year; no currency conversion and no inferred hidden pay. Only non-hidden, positive, ordered minimum/maximum pairs enter the salary statistics. Midpoint percentiles use linear interpolation. All bands receive equal weight, regardless of openings or company size. No median is shown for fewer than five bands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Repeat the search with Python and the Apify API
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/data_daemon/naukri-jobs-scraper" rel="noopener noreferrer"&gt;Naukri Jobs Scraper&lt;/a&gt; returns JSON with title, company, experience, salary endpoints in INR and LPA, disclosure status, cities, skills and posting time. It also supports full descriptions and job-page details. This study turned descriptions off because the search-card fields answer the salary question.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;requests&lt;/code&gt;, set &lt;code&gt;APIFY_TOKEN&lt;/code&gt; in your environment, then run:&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;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;statistics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;median&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.apify.com/v2/acts/data_daemon~naukri-jobs-scraper/run-sync-get-dataset-items&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&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;Authorization&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;Bearer &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;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;params&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;timeout&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maxTotalChargeUsd&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&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;queries&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;data analyst&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;locations&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sortBy&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;date&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;keywordInTitle&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;includeDescription&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;maxJobsPerQuery&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maxJobs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;onlyNewSinceLastRun&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="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;330&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;postedAt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\bdata analysts?\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[^a-z0-9]+&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; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;midpoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMinInr&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="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMaxInr&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="mi"&gt;200_000&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryHidden&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="ow"&gt;and&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;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMinInr&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="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="ow"&gt;and&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;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMaxInr&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="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMinInr&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;lt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salaryMaxInr&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; dated data-analyst posts; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;midpoints&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; show a salary band&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Median advertised band midpoint: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;midpoints&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; LPA&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;midpoints&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;No usable salary bands&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the retained 6 November snapshot, the calculation prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;104 dated data-analyst posts; 34 show a salary band
Median advertised band midpoint: 9.25 LPA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The live search was tested once on Apify; this exact code sample was tested with mocked HTTP transport and the real returned rows. A future live run will use a moving three-day window and can produce different numbers. The sample caps the run at &lt;strong&gt;$0.25&lt;/strong&gt; and &lt;strong&gt;300 seconds&lt;/strong&gt;, as well as 300 jobs; a larger result set can be truncated by those limits.&lt;/p&gt;

&lt;p&gt;At the current list price, the Actor costs &lt;strong&gt;$0.0008 per returned job plus $0.001 per run&lt;/strong&gt;. The 160 collected rows correspond to &lt;strong&gt;$0.129 at list price&lt;/strong&gt;, including the related titles later excluded from analysis. This was an owner research run; list-price equivalents are not customer revenue.&lt;/p&gt;

&lt;p&gt;For a ready-made no-code starting point, copy the &lt;a href="https://apify.com/data_daemon/naukri-jobs-scraper/examples/naukri-jobs-api-daily-feed-new-data-analyst-jobs-bangalore" rel="noopener noreferrer"&gt;daily feed of new data analyst jobs in Bangalore&lt;/a&gt;. That example uses its own city and posting-window settings, so it does not reproduce this all-India table. Its only-new mode remembers delivered IDs. For a comparable snapshot each week, leave only-new off; for a feed of previously unseen posts, turn it on and keep a stable saved-search name. This article creates no schedule.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  What is the data analyst salary in India per month?
&lt;/h3&gt;

&lt;p&gt;Among 34 disclosed bands in this sample, the median annual band midpoint was ₹9.25 LPA, equivalent to about ₹77,083 a month when divided by twelve. That is an advertised annual-to-monthly equivalent, not take-home pay or a national average.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the data analyst salary for freshers in India?
&lt;/h3&gt;

&lt;p&gt;Of 13 posts whose experience range accepted zero years, 5 showed a band. Their median band midpoint was ₹4.75 LPA. This is a small sample, and those posts may also accept experienced candidates.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the data analyst salary for 2 or 3 years of experience?
&lt;/h3&gt;

&lt;p&gt;Posts accepting a two-year candidate had a median disclosed band midpoint of ₹8 LPA (13 bands). Those accepting a three-year candidate also had ₹8 LPA (15 bands). Some posts appear in both groups.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the data analyst salary for 5 years of experience?
&lt;/h3&gt;

&lt;p&gt;Among 57 posts accepting a five-year candidate, 14 disclosed bands. Their median midpoint was ₹10.12 LPA. These include broad experience ranges; posts requiring at least four years had a different median, ₹14 LPA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does Naukri show “salary not disclosed”?
&lt;/h3&gt;

&lt;p&gt;Naukri allows employers to hide salary from candidates. In this sample 70 of 104 posts (67.3%) hid it. A hidden public field does not reveal the employer's budget or its reason for hiding it.&lt;/p&gt;

</description>
      <category>india</category>
      <category>hiring</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>How much do you pay a Filipino virtual assistant? Wages in 3,489 OnlineJobs.ph job posts (Oct-Nov 2026)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Tue, 03 Nov 2026 09:52:10 +0000</pubDate>
      <link>https://dev.to/datadaemon/how-much-do-you-pay-a-filipino-virtual-assistant-wages-in-3489-onlinejobsph-job-posts-oct-nov-1hfa</link>
      <guid>https://dev.to/datadaemon/how-much-do-you-pay-a-filipino-virtual-assistant-wages-in-3489-onlinejobsph-job-posts-oct-nov-1hfa</guid>
      <description>&lt;p&gt;OnlineJobs.ph is where many small businesses in the US, Australia and the UK hire Filipino virtual assistants directly. Every job post has a free-text wage field, and most "how much should I pay a VA" answers are anecdotes. So I counted.&lt;/p&gt;

&lt;p&gt;I collected &lt;strong&gt;every job OnlineJobs.ph returned for 20 common VA searches, posted in the 30 days from 4 October to 3 November 2026: 3,489 unique job posts from 2,443 employers&lt;/strong&gt;. Then I parsed the wage text the employer typed ("$5-7/hr", "₱35,000 monthly", "800") into minimum, maximum, currency and period. Data as of 3 November 2026, 09:35 UTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A full-time VA job paid a median of $900 a month&lt;/strong&gt; (middle half $650-$1,250, 914 full-time posts with a monthly US-dollar wage). Posts that state an hourly rate: &lt;strong&gt;median $5.50 an hour&lt;/strong&gt; full time, $5.00 part time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;86% of posts state a wage.&lt;/strong&gt; 84% of the stated wages are in US dollars and 13% in Philippine pesos. 56% are monthly and 42% hourly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full time means 40 hours.&lt;/strong&gt; The median full-time post asks for 40 hours a week, part time 20, gig 15.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The spread by role is narrower than you might expect.&lt;/strong&gt; Full-time monthly medians run from &lt;strong&gt;$750 for customer service&lt;/strong&gt; to &lt;strong&gt;$1,100 for accountants and $1,150 for project managers&lt;/strong&gt;. Video editors, SEO, Shopify, bookkeepers and appointment setters sit at $1,000-$1,025. General "virtual assistant", social media, graphic design and cold calling sit at $800.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The tails are real.&lt;/strong&gt; 9% of full-time monthly offers are under $500 and 19% are $1,500 or more (10% at $2,000+). Among full-time hourly offers, 8% are $3 or less and 13% are $10 or more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peso-paid posts are a separate market.&lt;/strong&gt; The full-time median is ₱45,000 a month (middle half ₱30,000-₱67,500). These are often local employers or agencies, so compare them with each other, not with dollar posts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wages by role
&lt;/h2&gt;

&lt;p&gt;Each row is one OnlineJobs.ph keyword search. The site's search matches the whole post, so a job can appear under several searches; 935 of the 3,489 did. The wage is the midpoint of the employer's range. Brackets show the middle half (25th-75th percentile) and the number of posts. A dash means fewer than 5 posts.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Full time&lt;/th&gt;
&lt;th&gt;State a wage&lt;/th&gt;
&lt;th&gt;Full-time USD per month: median (middle half)&lt;/th&gt;
&lt;th&gt;USD per hour, any type&lt;/th&gt;
&lt;th&gt;Full-time PHP per month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;project manager&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;$1,150 ($988-$1,600, n=44)&lt;/td&gt;
&lt;td&gt;$8.00 ($6.50-$10.00, n=31)&lt;/td&gt;
&lt;td&gt;₱55,000 (₱45,000-₱75,000, n=9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;web developer&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;$1,100 ($700-$1,600, n=5)&lt;/td&gt;
&lt;td&gt;$6.25 ($5.00-$9.00, n=20)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountant&lt;/td&gt;
&lt;td&gt;281&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;td&gt;$1,100 ($800-$1,525, n=62)&lt;/td&gt;
&lt;td&gt;$7.50 ($5.19-$10.00, n=77)&lt;/td&gt;
&lt;td&gt;₱70,000 (₱51,250-₱120,000, n=51)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopify&lt;/td&gt;
&lt;td&gt;275&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;$1,025 ($731-$1,750, n=86)&lt;/td&gt;
&lt;td&gt;$6.00 ($5.00-$7.50, n=93)&lt;/td&gt;
&lt;td&gt;₱46,175 (₱24,125-₱70,000, n=16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bookkeeper&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;$1,025 ($800-$1,238, n=42)&lt;/td&gt;
&lt;td&gt;$6.50 ($5.00-$8.50, n=67)&lt;/td&gt;
&lt;td&gt;₱52,444 (₱42,200-₱75,625, n=36)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;video editor&lt;/td&gt;
&lt;td&gt;268&lt;/td&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;$1,000 ($500-$1,425, n=92)&lt;/td&gt;
&lt;td&gt;$6.25 ($5.00-$8.25, n=68)&lt;/td&gt;
&lt;td&gt;₱26,500 (₱12,000-₱28,000, n=5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seo&lt;/td&gt;
&lt;td&gt;273&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;$1,000 ($800-$1,250, n=54)&lt;/td&gt;
&lt;td&gt;$6.00 ($5.00-$8.00, n=80)&lt;/td&gt;
&lt;td&gt;₱52,500 (₱36,250-₱66,875, n=22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;appointment setter&lt;/td&gt;
&lt;td&gt;276&lt;/td&gt;
&lt;td&gt;179&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;$1,000 ($682-$1,200, n=82)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.00, n=100)&lt;/td&gt;
&lt;td&gt;₱45,000 (₱20,000-₱45,000, n=21)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordpress&lt;/td&gt;
&lt;td&gt;274&lt;/td&gt;
&lt;td&gt;149&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;$925 ($640-$1,300, n=66)&lt;/td&gt;
&lt;td&gt;$6.50 ($5.00-$8.94, n=90)&lt;/td&gt;
&lt;td&gt;₱50,000 (₱37,850-₱71,250, n=26)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;284&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;$900 ($700-$1,500, n=65)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.00, n=92)&lt;/td&gt;
&lt;td&gt;₱43,750 (₱30,000-₱46,250, n=40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;amazon&lt;/td&gt;
&lt;td&gt;281&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;td&gt;79%&lt;/td&gt;
&lt;td&gt;$888 ($612-$1,375, n=90)&lt;/td&gt;
&lt;td&gt;$5.62 ($3.86-$8.00, n=76)&lt;/td&gt;
&lt;td&gt;₱62,500 (₱30,000-₱125,000, n=26)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lead generation&lt;/td&gt;
&lt;td&gt;278&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;$850 ($600-$1,050, n=63)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$7.12, n=88)&lt;/td&gt;
&lt;td&gt;₱45,000 (₱34,375-₱49,258, n=32)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;executive assistant&lt;/td&gt;
&lt;td&gt;276&lt;/td&gt;
&lt;td&gt;174&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;$850 ($700-$1,000, n=69)&lt;/td&gt;
&lt;td&gt;$5.50 ($4.05-$7.00, n=115)&lt;/td&gt;
&lt;td&gt;₱50,000 (₱40,750-₱55,000, n=23)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data entry&lt;/td&gt;
&lt;td&gt;268&lt;/td&gt;
&lt;td&gt;187&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;$825 ($650-$1,000, n=74)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.05-$7.00, n=96)&lt;/td&gt;
&lt;td&gt;₱44,505 (₱30,750-₱55,000, n=24)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;virtual assistant&lt;/td&gt;
&lt;td&gt;263&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;$800 ($500-$1,300, n=65)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.00, n=106)&lt;/td&gt;
&lt;td&gt;₱57,500 (₱49,258-₱84,375, n=18)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;social media manager&lt;/td&gt;
&lt;td&gt;261&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;$800 ($600-$1,081, n=64)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.00, n=90)&lt;/td&gt;
&lt;td&gt;₱47,550 (₱38,138-₱49,388, n=6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;graphic designer&lt;/td&gt;
&lt;td&gt;237&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;$800 ($688-$1,100, n=64)&lt;/td&gt;
&lt;td&gt;$5.25 ($4.12-$8.00, n=66)&lt;/td&gt;
&lt;td&gt;₱25,000 (₱20,000-₱36,000, n=25)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cold caller&lt;/td&gt;
&lt;td&gt;273&lt;/td&gt;
&lt;td&gt;152&lt;/td&gt;
&lt;td&gt;91%&lt;/td&gt;
&lt;td&gt;$800 ($562-$1,000, n=54)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.00, n=141)&lt;/td&gt;
&lt;td&gt;₱25,000 (₱23,000-₱45,000, n=8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content writer&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;$775 ($644-$950, n=10)&lt;/td&gt;
&lt;td&gt;$5.00 ($5.00-$7.00, n=9)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;customer service&lt;/td&gt;
&lt;td&gt;281&lt;/td&gt;
&lt;td&gt;214&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;$750 ($594-$862, n=80)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$6.50, n=109)&lt;/td&gt;
&lt;td&gt;₱22,500 (₱21,500-₱30,500, n=23)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OnlineJobs.ph lists at most 285 results per search. 15 of the 20 searches returned 261-284 posts, so they hit that cap before reaching 30 days back: for those roles the table covers the newest posts, not the whole month. Bookkeeper (206), graphic designer (237), project manager (127), web developer (38) and content writer (32) are the full 30-day count for those exact phrases. The last two are small samples.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type of work (employer's choice)&lt;/th&gt;
&lt;th&gt;USD per month&lt;/th&gt;
&lt;th&gt;USD per hour&lt;/th&gt;
&lt;th&gt;PHP per month&lt;/th&gt;
&lt;th&gt;Median hours a week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full Time (2,136 posts)&lt;/td&gt;
&lt;td&gt;$900 ($650-$1,250, n=914)&lt;/td&gt;
&lt;td&gt;$5.50 ($4.00-$7.50, n=547)&lt;/td&gt;
&lt;td&gt;₱45,000 (₱30,000-₱67,500, n=297)&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Part Time (743)&lt;/td&gt;
&lt;td&gt;$450 ($275-$600, n=143)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.37-$7.00, n=432)&lt;/td&gt;
&lt;td&gt;₱25,000 (₱17,250-₱33,375, n=40)&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any (510)&lt;/td&gt;
&lt;td&gt;$800 ($500-$1,200, n=166)&lt;/td&gt;
&lt;td&gt;$5.00 ($4.00-$7.00, n=165)&lt;/td&gt;
&lt;td&gt;₱40,000 (₱27,375-₱48,750, n=30)&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gig (100)&lt;/td&gt;
&lt;td&gt;$400 ($300-$1,500, n=25)&lt;/td&gt;
&lt;td&gt;$6.00 ($4.12-$9.88, n=46)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As a cross-check, $5.50 an hour × 40 hours × 4.33 weeks comes to $953 a month, close to the $900 monthly median. Employers price hourly and monthly offers about the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; OnlineJobs.ph's public job search and job pages, read with the &lt;a href="https://apify.com/data_daemon/onlinejobs-ph-scraper" rel="noopener noreferrer"&gt;OnlineJobs.ph Scraper&lt;/a&gt; Actor on Apify. I ran 20 searches, each with &lt;code&gt;postedWithinDays: 30&lt;/code&gt;, details on and no cap, on 3 November 2026. That gave 4,752 rows, which de-duplicated by job id to 3,489 posts. Posted dates run from 2026-10-04 12:00 UTC to 2026-11-03 09:32 UTC. At least 17 posts were deleted by their employers between listing and reading and are not counted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wages are what the employer typed.&lt;/strong&gt; The Actor parses ranges ("$4-$8 per hour"), "k" ("20k"), currency words and symbols, and the period. 47% of stated wages lacked a currency symbol, a period or both ("700-1000", "600/month"). For those, the parser infers what is missing from the size: up to $50 is hourly, $100 or more is monthly, 5,000 or more is pesos per month. Those rows carry &lt;code&gt;salaryInferred: true&lt;/code&gt;. &lt;strong&gt;The headline holds either way.&lt;/strong&gt; Full-time monthly USD is a median of $1,000 for explicit wages (n=425) and $850 for inferred ones (n=489); hourly is $5.00 explicit and $5.50 inferred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No currency conversion.&lt;/strong&gt; Dollar and peso offers are reported separately so no exchange rate is assumed. 3% of wages are in AUD, CAD, GBP or EUR and are left out of the tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What a "job" is:&lt;/strong&gt; one post. An employer posting the same role twice counts twice. The busiest employers posted 9-10 jobs each in the window, so no single employer moves the medians.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not measured:&lt;/strong&gt; what people were actually paid, raises and bonuses ("$500 + bonus" counts as $500), and posts hidden from logged-out visitors. No login was used. Employer names appear on 13% of posts (when the employer shows a logo), and no contact details were collected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get OnlineJobs.ph jobs as JSON, CSV or Excel
&lt;/h2&gt;

&lt;p&gt;OnlineJobs.ph has no public job API. The &lt;a href="https://apify.com/data_daemon/onlinejobs-ph-scraper" rel="noopener noreferrer"&gt;OnlineJobs.ph Scraper&lt;/a&gt; returns one row per job post: title, type of work, wage as written and parsed to &lt;code&gt;salaryMin&lt;/code&gt;/&lt;code&gt;salaryMax&lt;/code&gt;/&lt;code&gt;salaryCurrency&lt;/code&gt;/&lt;code&gt;salaryPeriod&lt;/code&gt;, hours per week, skills, posting time and the full description. It needs no login or proxy and costs $0.0008 per job plus $0.001 per run. The 4,752 rows behind this article cost about $3.82 at the list price.&lt;/p&gt;

&lt;p&gt;To repeat the bookkeeper row (206 jobs on 3 November 2026):&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/onlinejobs-ph-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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&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;bookkeeper&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;# 0 = no cap (up to 285 per search)
&lt;/span&gt;    &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;wage&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="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;salaryMin&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;salaryMax&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# midpoint of the employer's range
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&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;jobs,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&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;wage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;notna&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; state a wage&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;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;workType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;full_time&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;workType&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;Full Time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;bands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full_time&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;salaryCurrency&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;salaryPeriod&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;wage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;describe&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;bands&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bands&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&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;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;][[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&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;25%&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;50%&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;75%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;206 jobs, 87% state a wage
workType
Full Time    126
Part Time     56
Any           21
Gig            3
                             count        25%      50%       75%
salaryCurrency salaryPeriod
PHP            month          36.0  42200.000  52444.5  75625.00
USD            hour           27.0      5.125      7.0     11.75
               month          42.0    800.000   1025.0   1237.50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To track the market weekly, or to watch for new posts in your niche, schedule the same input with &lt;code&gt;onlyNewSinceLastRun: true&lt;/code&gt;. Each run then returns, and charges for, only posts you have not received before. Ready-made inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/onlinejobs-ph-scraper/examples/onlinejobs-ph-api-new-jobs-last-24-hours" rel="noopener noreferrer"&gt;New OnlineJobs.ph jobs in the last 24 hours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/onlinejobs-ph-scraper/examples/onlinejobs-ph-api-virtual-assistant-jobs-wages" rel="noopener noreferrer"&gt;Virtual assistant jobs with wages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/onlinejobs-ph-scraper&lt;/code&gt; in Claude, ChatGPT or Cursor. Then ask "what are employers offering full-time Shopify VAs on OnlineJobs.ph this week?".&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How much should I pay a full-time virtual assistant from the Philippines?&lt;/strong&gt;&lt;br&gt;
In October-November 2026, the median full-time offer on OnlineJobs.ph was $900 a month, and the middle half of offers was $650-$1,250. Specialist roles (accounting, bookkeeping, Shopify, SEO, video editing, project management) had medians of $1,000-$1,150. General admin and customer service had $750-$850.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the hourly rate for a Filipino VA?&lt;/strong&gt;&lt;br&gt;
The median hourly offer was $5.50 for full-time posts and $5.00 for part-time posts. 13% of full-time hourly offers were $10 or more, and 8% were $3 or less.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do employers on OnlineJobs.ph pay in dollars or pesos?&lt;/strong&gt;&lt;br&gt;
Mostly dollars: 84% of stated wages were in US dollars and 13% in Philippine pesos. Peso offers had a full-time median of ₱45,000 a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an OnlineJobs.ph API?&lt;/strong&gt;&lt;br&gt;
Not for job search. The site has employer plans for posting and contacting workers, but no public jobs API or export. The &lt;a href="https://apify.com/data_daemon/onlinejobs-ph-scraper" rel="noopener noreferrer"&gt;OnlineJobs.ph Scraper&lt;/a&gt; on Apify returns the public job posts as JSON, CSV or Excel and can run on a schedule.&lt;/p&gt;

</description>
      <category>remote</category>
      <category>hiring</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>São Paulo and Rio asking prices per square metre by neighborhood: 19,000 new Zap Imóveis and VivaReal listings (November 2026)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:48:30 +0000</pubDate>
      <link>https://dev.to/datadaemon/sao-paulo-and-rio-asking-prices-per-m2-by-neighborhood-19000-new-zap-imoveis-and-vivareal-38ll</link>
      <guid>https://dev.to/datadaemon/sao-paulo-and-rio-asking-prices-per-m2-by-neighborhood-19000-new-zap-imoveis-and-vivareal-38ll</guid>
      <description>&lt;p&gt;Zap Imóveis and VivaReal are the two largest property portals in Brazil. Both belong to OLX Brasil, neither offers a public API for listing data, and the "preço do m² em São Paulo" figures you find online are usually index numbers without the listings behind them.&lt;/p&gt;

&lt;p&gt;I pulled &lt;strong&gt;every listing created in the three days to 31 October 2026 in 13 neighborhoods of São Paulo and 13 of Rio de Janeiro (sale), every rental created in the same window in both cities, and every new-development page the portals list there: 19,032 listings after de-duplication plus 1,130 development pages, 10,609 of them residential apartments with a price and an area&lt;/strong&gt;, and computed median asking prices per square metre by neighborhood, rent per square metre, a gross asking yield, condominium fees as a share of rent, and how much of this inventory is shared between the two portals. Data as read on 31 October 2026, 17:47–18:37 UTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo em português:&lt;/strong&gt; este estudo usa anúncios criados nos três dias até 31/10/2026 em 13 bairros de São Paulo e 13 do Rio de Janeiro (venda), todos os anúncios de aluguel das duas cidades no mesmo período e todos os lançamentos listados. São preços pedidos, não transações registradas. Mediana do preço pedido por m² em apartamentos: Ipanema R$ 24.538, Leblon R$ 24.359, Pinheiros R$ 18.824, Itaim Bibi R$ 18.645, Vila Olímpia R$ 18.512, Moema R$ 18.456, Jardim Paulista R$ 15.163, Vila Mariana R$ 14.053, Botafogo R$ 13.499, Copacabana R$ 13.158, Tijuca R$ 6.417, Méier R$ 4.385. Aluguel mediano por m²: Vila Nova Conceição R$ 128, Vila Olímpia R$ 122, Leblon R$ 119, Ipanema R$ 116, Pinheiros R$ 107, Copacabana R$ 79, Tijuca R$ 38. O rendimento bruto estimado (aluguel pedido × 12 ÷ preço pedido) fica entre 5,7% (Ipanema) e 8,2% (Santo Amaro e Vila Andrade). O condomínio equivale a 22% do aluguel em São Paulo e 28% no Rio (medianas). Zap e VivaReal publicam os mesmos anúncios: 1.610 de 1.612 ids apareceram nos dois portais com preço, área e anunciante idênticos. Perguntas frequentes em português no fim do artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ipanema and Leblon ask the most per square metre: R$ 24,538 and R$ 24,359 median&lt;/strong&gt;, across 173 and 155 apartments listed in three days. São Paulo's top four sit together at R$ 18,456–18,824 (Pinheiros, Itaim Bibi, Vila Olímpia, Moema). The cheapest neighborhoods studied are in Rio's Zona Norte: Méier R$ 4,385 and Engenho Novo R$ 3,571, between a fifth and a seventh of Ipanema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rent per square metre is highest where small units dominate&lt;/strong&gt;: Vila Nova Conceição (R$ 128/m²/month), Vila Olímpia (R$ 122), Leblon (R$ 119), Ipanema (R$ 116), Itaim Bibi (R$ 111) and Pinheiros (R$ 107). Across São Paulo, studios and kitnets rent for R$ 100/m² against R$ 57/m² for two-bedroom flats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gross asking yields run from 5.7% to 8.2%&lt;/strong&gt; (median rent per m² × 12 ÷ median sale price per m²): Ipanema 5.7%, Leblon 5.8%, Vila Mariana 6.3%, Pinheiros 6.8%, Copacabana 7.2%, Vila Olímpia 7.9%, Santo Amaro and Vila Andrade 8.2%. Median 7.1% across 11 São Paulo neighborhoods and 6.6% across 9 in Rio. Cheaper neighborhoods yield more; this is an asking-price estimate before vacancy, fees and tax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The condominium fee is a quarter of the rent&lt;/strong&gt;: median 21.6% of the monthly rent in São Paulo (R$ 915 on a R$ 3,500 rent) and 27.8% in Rio (R$ 1,197 on R$ 3,900). 92% of rental listings show the fee. The IPTU field is unreliable: a third to two fifths of the values are too small to be yearly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zap Imóveis and VivaReal are one inventory.&lt;/strong&gt; In four neighborhoods pulled from each portal separately, 1,610 of 1,612 listing ids appeared on both, with identical price, area, advertiser and creation date. Scraping both portals adds nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;São Paulo has ten times Rio's new-development pages&lt;/strong&gt;: 1,024 launch listings against 106; 52% under construction, 36% already built, 12% still on plan. Vila Mariana (58), Pinheiros (48), Perdizes and Indianópolis (35 each) lead São Paulo; Recreio (21) and Barra da Tijuca (20) lead Rio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; the listings service behind zapimoveis.com.br and vivareal.com.br, read with the &lt;a href="https://apify.com/data_daemon/zap-imoveis-vivareal-scraper" rel="noopener noreferrer"&gt;Zap Imóveis &amp;amp; VivaReal Scraper&lt;/a&gt; Actor on Apify (build 0.1.10) with &lt;code&gt;includeImages: false&lt;/code&gt;. Asking prices as advertised; no registered transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sale, by neighborhood:&lt;/strong&gt; &lt;code&gt;business: sale&lt;/code&gt;, &lt;code&gt;portals: [zap]&lt;/code&gt;, &lt;code&gt;postedWithinDays: 3&lt;/code&gt;, &lt;code&gt;maxResults: 0&lt;/code&gt;, one search per neighborhood. Runs &lt;code&gt;W4zMW87vAifpYrSJj&lt;/code&gt; (Pinheiros, Moema: 865 rows), &lt;code&gt;dIR1Tfv8e4UgM4teI&lt;/code&gt; (Copacabana, Tijuca: 746), &lt;code&gt;BvbVenN6oNWlVd9uB&lt;/code&gt; and &lt;code&gt;ccbnMYcEDPeUadRfK&lt;/code&gt; (30 neighborhoods each, 2,103 and 2,081 rows), &lt;code&gt;Ta5YbWxR91MtTByk4&lt;/code&gt; and &lt;code&gt;35CpL9LV9rRbzncka&lt;/code&gt; (8 neighborhoods each, 3,523 and 2,861 rows). The portals' service answers at most about 1,000 listings per search, which a three-day window in one neighborhood stays under, so a neighborhood search is complete when every page of it was read. The two 30-neighborhood runs hit their 15-minute cap and had a few page requests refused (HTTP 403) once the site started throttling; neighborhoods affected were pulled again in the 8-neighborhood runs, and a neighborhood counts only from a run that read all of it. That gives 13 per city: Pinheiros, Moema, Vila Mariana, Itaim Bibi, Vila Andrade, Jardim Paulista, Perdizes, Vila Olímpia, Indianópolis, Mooca, Bela Vista, Santo Amaro and Ipiranga in São Paulo; Copacabana, Tijuca, Ipanema, Flamengo, Recreio dos Bandeirantes, Méier, Centro, Botafogo, Barra da Tijuca, Engenho Novo, Vila Isabel, Leblon and Barra Olímpica in Rio. Nothing is extrapolated to the rest of either city.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rent, whole city:&lt;/strong&gt; &lt;code&gt;business: rent&lt;/code&gt;, &lt;code&gt;postedWithinDays: 3&lt;/code&gt; for São Paulo (run &lt;code&gt;UJEpgiCVr6wGGmAMy&lt;/code&gt;, 7,029 rows, 226 seconds) and &lt;code&gt;postedWithinDays: 7&lt;/code&gt; for Rio (&lt;code&gt;82kcYnoOamSiTZu6U&lt;/code&gt;, 1,547 rows, plus the three-day run &lt;code&gt;UnlFAAKhfEKhCD4Tc&lt;/code&gt;, 942 rows), no truncation reported. Rentals priced per day (temporada) are left out by default; every rent here is monthly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developments:&lt;/strong&gt; &lt;code&gt;listingType: development&lt;/code&gt;, both cities, both portals, run &lt;code&gt;iwun0HiqhkXIEO4Dg&lt;/code&gt;, 1,130 rows, no date window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portal overlap:&lt;/strong&gt; the first two neighborhood pairs pulled again with &lt;code&gt;portals: [vivareal]&lt;/code&gt; (runs &lt;code&gt;EmJP7NlmEKU1DYTf0&lt;/code&gt; and &lt;code&gt;RehrSPAWXA1CLoVEw&lt;/code&gt;) and compared by listing id.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning:&lt;/strong&gt; residential apartments only (&lt;code&gt;unitTypes&lt;/code&gt; APARTMENT and &lt;code&gt;usageTypes&lt;/code&gt; RESIDENTIAL; houses, penthouses, flats, offices and land are excluded from the per-m² tables). A listing needs a price and a usable area; usable area between 15 and 1,000 m²; sale price at least R$ 50,000 and R$ 1,000–60,000 per m²; rent at least R$ 300 a month and R$ 5–400 per m². That dropped 36 sale and 16 rent apartments. Price per m² is &lt;code&gt;priceBrl / usableAreaSqm&lt;/code&gt; (it matched the Actor's &lt;code&gt;pricePerSqmBrl&lt;/code&gt; to the cent). One row per listing id and business: 281 ids carry both a sale and a rent price and count once on each side. Medians throughout; a neighborhood is shown only with at least 30 clean listings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Window:&lt;/strong&gt; &lt;code&gt;createdAt&lt;/code&gt; from 28 October (three days before each run) to 31 October 18:12 UTC for sale and São Paulo rent; from 24 October for Rio rent. Listings re-published with an old creation date are not in the window.&lt;/li&gt;
&lt;li&gt;Two city-wide sale pulls (&lt;code&gt;eMciqFFpnOwptY2m3&lt;/code&gt;, 4,347 rows; &lt;code&gt;Rbivjh8ClhIXv3fPW&lt;/code&gt;, 5,349 rows) reached their time cap while reading 64 price bands round-robin. They are balanced by price band rather than by volume, so they were used only to rank neighborhoods by activity, never for a median.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sale: median asking price per m² by neighborhood
&lt;/h2&gt;

&lt;p&gt;Residential apartments created in the three days to 31 October 2026. IQR is the interquartile range of price per m².&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;São Paulo&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;Listings&lt;/th&gt;
&lt;th&gt;Median R$/m²&lt;/th&gt;
&lt;th&gt;IQR R$/m²&lt;/th&gt;
&lt;th&gt;Median area (m²)&lt;/th&gt;
&lt;th&gt;Median asking price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pinheiros&lt;/td&gt;
&lt;td&gt;527&lt;/td&gt;
&lt;td&gt;18,824&lt;/td&gt;
&lt;td&gt;14,474–23,200&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;R$ 1,200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Itaim Bibi&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;18,645&lt;/td&gt;
&lt;td&gt;14,094–24,759&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;R$ 2,285,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Olímpia&lt;/td&gt;
&lt;td&gt;296&lt;/td&gt;
&lt;td&gt;18,512&lt;/td&gt;
&lt;td&gt;13,214–24,504&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;R$ 1,200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moema&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;18,456&lt;/td&gt;
&lt;td&gt;13,292–25,497&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;R$ 1,449,560&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indianópolis&lt;/td&gt;
&lt;td&gt;317&lt;/td&gt;
&lt;td&gt;15,811&lt;/td&gt;
&lt;td&gt;12,251–20,686&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;R$ 1,129,270&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jardim Paulista&lt;/td&gt;
&lt;td&gt;606&lt;/td&gt;
&lt;td&gt;15,163&lt;/td&gt;
&lt;td&gt;12,228–20,641&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;R$ 2,200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Mariana&lt;/td&gt;
&lt;td&gt;497&lt;/td&gt;
&lt;td&gt;14,053&lt;/td&gt;
&lt;td&gt;10,366–17,892&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;R$ 950,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perdizes&lt;/td&gt;
&lt;td&gt;379&lt;/td&gt;
&lt;td&gt;13,509&lt;/td&gt;
&lt;td&gt;10,707–18,067&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;R$ 1,350,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Santo Amaro&lt;/td&gt;
&lt;td&gt;171&lt;/td&gt;
&lt;td&gt;12,909&lt;/td&gt;
&lt;td&gt;10,069–15,442&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;R$ 780,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ipiranga&lt;/td&gt;
&lt;td&gt;209&lt;/td&gt;
&lt;td&gt;12,130&lt;/td&gt;
&lt;td&gt;9,722–13,934&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;R$ 949,121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bela Vista&lt;/td&gt;
&lt;td&gt;233&lt;/td&gt;
&lt;td&gt;11,111&lt;/td&gt;
&lt;td&gt;8,345–15,758&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;R$ 640,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mooca&lt;/td&gt;
&lt;td&gt;183&lt;/td&gt;
&lt;td&gt;9,297&lt;/td&gt;
&lt;td&gt;6,468–11,111&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;R$ 625,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Andrade&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;8,776&lt;/td&gt;
&lt;td&gt;6,862–10,156&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;R$ 757,450&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rio de Janeiro&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;Listings&lt;/th&gt;
&lt;th&gt;Median R$/m²&lt;/th&gt;
&lt;th&gt;IQR R$/m²&lt;/th&gt;
&lt;th&gt;Median area (m²)&lt;/th&gt;
&lt;th&gt;Median asking price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ipanema&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;td&gt;24,538&lt;/td&gt;
&lt;td&gt;21,194–32,658&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;R$ 2,700,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leblon&lt;/td&gt;
&lt;td&gt;155&lt;/td&gt;
&lt;td&gt;24,359&lt;/td&gt;
&lt;td&gt;20,571–30,864&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;R$ 2,799,340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra da Tijuca&lt;/td&gt;
&lt;td&gt;238&lt;/td&gt;
&lt;td&gt;14,239&lt;/td&gt;
&lt;td&gt;12,159–17,897&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;td&gt;R$ 1,725,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Botafogo&lt;/td&gt;
&lt;td&gt;320&lt;/td&gt;
&lt;td&gt;13,499&lt;/td&gt;
&lt;td&gt;10,000–16,767&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;R$ 1,260,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copacabana&lt;/td&gt;
&lt;td&gt;377&lt;/td&gt;
&lt;td&gt;13,158&lt;/td&gt;
&lt;td&gt;10,349–16,859&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;R$ 1,450,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flamengo&lt;/td&gt;
&lt;td&gt;197&lt;/td&gt;
&lt;td&gt;12,308&lt;/td&gt;
&lt;td&gt;9,878–15,352&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;R$ 1,270,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra Olímpica&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;9,821&lt;/td&gt;
&lt;td&gt;8,624–10,944&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;R$ 782,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recreio dos Bandeirantes&lt;/td&gt;
&lt;td&gt;230&lt;/td&gt;
&lt;td&gt;7,996&lt;/td&gt;
&lt;td&gt;6,957–9,024&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;R$ 739,745&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Centro&lt;/td&gt;
&lt;td&gt;266&lt;/td&gt;
&lt;td&gt;7,859&lt;/td&gt;
&lt;td&gt;6,453–9,722&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;R$ 320,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tijuca&lt;/td&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;6,417&lt;/td&gt;
&lt;td&gt;5,322–7,971&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;R$ 584,450&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Isabel&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;4,863&lt;/td&gt;
&lt;td&gt;3,799–6,000&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;R$ 325,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Méier&lt;/td&gt;
&lt;td&gt;303&lt;/td&gt;
&lt;td&gt;4,385&lt;/td&gt;
&lt;td&gt;3,676–5,197&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;R$ 320,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engenho Novo&lt;/td&gt;
&lt;td&gt;143&lt;/td&gt;
&lt;td&gt;3,571&lt;/td&gt;
&lt;td&gt;3,047–4,062&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;R$ 220,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Across the 13 São Paulo neighborhoods together (4,159 apartments) the median is R$ 14,286/m², with a tenth-to-ninetieth percentile range of R$ 8,333–25,385; across the 13 Rio neighborhoods (2,817 apartments) R$ 9,849/m² and R$ 4,067–23,451. Rio's spread between neighborhoods is far wider than São Paulo's: Zona Sul (Ipanema, Leblon) asks five to seven times Zona Norte (Méier, Engenho Novo) per square metre, while São Paulo's cheapest neighborhood in the set (Vila Andrade) is still half of Pinheiros. The spread inside a neighborhood is as wide as the gap between neighbors: a quarter of Pinheiros listings ask more than R$ 23,200/m² and a quarter less than R$ 14,474/m².&lt;/p&gt;

&lt;p&gt;Three days is a lot of listings. Pinheiros alone had 695 new sale listings of all types in 72 hours (527 clean apartments), Jardim Paulista 606 clean apartments and Copacabana 459 listings. The portals' totals for a whole neighborhood run to the tens of thousands (Pinheiros showed 21,889 sale listings in total, Jardim Paulista 20,962), which is why this study uses the creation date rather than everything on the site. Among the 5,869 São Paulo sale listings in the window, 72% were apartments, 9% houses, 6% offices, 4% serviced flats and 3% penthouses; in Rio's 4,517, 67% apartments, 9% penthouses, 9% offices and 5% houses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rent: median asking rent per m² by neighborhood
&lt;/h2&gt;

&lt;p&gt;Residential apartments, monthly rent, whole city, neighborhoods with at least 30 clean listings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;São Paulo&lt;/strong&gt; (rentals created 28–31 October 2026)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;Listings&lt;/th&gt;
&lt;th&gt;Median R$/m²/month&lt;/th&gt;
&lt;th&gt;Median rent&lt;/th&gt;
&lt;th&gt;Median area (m²)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vila Nova Conceição&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;127.9&lt;/td&gt;
&lt;td&gt;R$ 9,100&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Olímpia&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;121.9&lt;/td&gt;
&lt;td&gt;R$ 5,200&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Itaim Bibi&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;110.8&lt;/td&gt;
&lt;td&gt;R$ 9,400&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinheiros&lt;/td&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;td&gt;107.4&lt;/td&gt;
&lt;td&gt;R$ 4,500&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Butantã&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;107.4&lt;/td&gt;
&lt;td&gt;R$ 3,125&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cerqueira César&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;102.9&lt;/td&gt;
&lt;td&gt;R$ 4,810&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brooklin Paulista&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;102.1&lt;/td&gt;
&lt;td&gt;R$ 5,165&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consolação&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;R$ 4,250&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cidade Monções&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;R$ 7,800&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Campo Belo&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;91.5&lt;/td&gt;
&lt;td&gt;R$ 4,325&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indianópolis&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;90.6&lt;/td&gt;
&lt;td&gt;R$ 6,000&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jardim Paulista&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;td&gt;R$ 7,500&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Santo Amaro&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;87.7&lt;/td&gt;
&lt;td&gt;R$ 5,000&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bela Vista&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;75.4&lt;/td&gt;
&lt;td&gt;R$ 3,600&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Água Branca&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;74.8&lt;/td&gt;
&lt;td&gt;R$ 3,800&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Mariana&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;73.9&lt;/td&gt;
&lt;td&gt;R$ 3,756&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paraíso&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;72.8&lt;/td&gt;
&lt;td&gt;R$ 6,250&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perdizes&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;71.4&lt;/td&gt;
&lt;td&gt;R$ 5,000&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Clementino&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;68.9&lt;/td&gt;
&lt;td&gt;R$ 3,600&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tatuapé&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;64.0&lt;/td&gt;
&lt;td&gt;R$ 2,950&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mooca&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;60.4&lt;/td&gt;
&lt;td&gt;R$ 2,495&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Andrade&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;59.9&lt;/td&gt;
&lt;td&gt;R$ 4,000&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rio de Janeiro&lt;/strong&gt; (rentals created 24–31 October 2026)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;Listings&lt;/th&gt;
&lt;th&gt;Median R$/m²/month&lt;/th&gt;
&lt;th&gt;Median rent&lt;/th&gt;
&lt;th&gt;Median area (m²)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leblon&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;118.8&lt;/td&gt;
&lt;td&gt;R$ 11,000&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ipanema&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;115.7&lt;/td&gt;
&lt;td&gt;R$ 12,750&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copacabana&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;79.3&lt;/td&gt;
&lt;td&gt;R$ 4,500&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flamengo&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;77.8&lt;/td&gt;
&lt;td&gt;R$ 4,500&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra da Tijuca&lt;/td&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;77.6&lt;/td&gt;
&lt;td&gt;R$ 9,000&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Botafogo&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;74.3&lt;/td&gt;
&lt;td&gt;R$ 5,200&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra Olímpica&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;61.1&lt;/td&gt;
&lt;td&gt;R$ 5,400&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recreio dos Bandeirantes&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;41.2&lt;/td&gt;
&lt;td&gt;R$ 3,850&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tijuca&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;37.5&lt;/td&gt;
&lt;td&gt;R$ 2,700&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;City-wide, the median São Paulo apartment for rent (2,754 clean listings in three days) is 56 m² at R$ 3,500 a month, R$ 66.7/m²; in Rio (879 listings in seven days) 75 m² at R$ 3,900, R$ 51.7/m². Rentals are a smaller share of what gets listed: apartments were 39% of São Paulo's 7,029 new rental listings (offices 18%, shops 13%, houses 11%, serviced flats 6%, warehouses 5%) and 55% of Rio's 1,617.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gross asking yield by neighborhood
&lt;/h2&gt;

&lt;p&gt;Median rent per m² per month × 12, divided by the median sale price per m² of the same neighborhood. Both are asking prices from the same three days (Rio rent: seven days), so this is a gross, pre-negotiation, pre-vacancy figure, before the condominium fee, IPTU and income tax.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Sale R$/m² (n)&lt;/th&gt;
&lt;th&gt;Rent R$/m²/month (n)&lt;/th&gt;
&lt;th&gt;Gross asking yield&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Santo Amaro&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;12,909 (171)&lt;/td&gt;
&lt;td&gt;87.7 (34)&lt;/td&gt;
&lt;td&gt;8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Andrade&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;8,776 (300)&lt;/td&gt;
&lt;td&gt;59.9 (50)&lt;/td&gt;
&lt;td&gt;8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bela Vista&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;11,111 (233)&lt;/td&gt;
&lt;td&gt;75.4 (61)&lt;/td&gt;
&lt;td&gt;8.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Olímpia&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;18,512 (296)&lt;/td&gt;
&lt;td&gt;121.9 (81)&lt;/td&gt;
&lt;td&gt;7.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mooca&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;9,297 (183)&lt;/td&gt;
&lt;td&gt;60.4 (30)&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flamengo&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;12,308 (197)&lt;/td&gt;
&lt;td&gt;77.8 (37)&lt;/td&gt;
&lt;td&gt;7.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra Olímpica&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;9,821 (108)&lt;/td&gt;
&lt;td&gt;61.1 (42)&lt;/td&gt;
&lt;td&gt;7.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copacabana&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;13,158 (377)&lt;/td&gt;
&lt;td&gt;79.3 (57)&lt;/td&gt;
&lt;td&gt;7.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Itaim Bibi&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;18,645 (300)&lt;/td&gt;
&lt;td&gt;110.8 (64)&lt;/td&gt;
&lt;td&gt;7.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jardim Paulista&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;15,163 (606)&lt;/td&gt;
&lt;td&gt;89.4 (84)&lt;/td&gt;
&lt;td&gt;7.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tijuca&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;6,417 (201)&lt;/td&gt;
&lt;td&gt;37.5 (35)&lt;/td&gt;
&lt;td&gt;7.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indianópolis&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;15,811 (317)&lt;/td&gt;
&lt;td&gt;90.6 (62)&lt;/td&gt;
&lt;td&gt;6.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinheiros&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;18,824 (527)&lt;/td&gt;
&lt;td&gt;107.4 (131)&lt;/td&gt;
&lt;td&gt;6.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Botafogo&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;13,499 (320)&lt;/td&gt;
&lt;td&gt;74.3 (33)&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barra da Tijuca&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;14,239 (238)&lt;/td&gt;
&lt;td&gt;77.6 (133)&lt;/td&gt;
&lt;td&gt;6.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vila Mariana&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;14,053 (497)&lt;/td&gt;
&lt;td&gt;73.9 (138)&lt;/td&gt;
&lt;td&gt;6.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perdizes&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;13,509 (379)&lt;/td&gt;
&lt;td&gt;71.4 (53)&lt;/td&gt;
&lt;td&gt;6.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recreio dos Bandeirantes&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;7,996 (230)&lt;/td&gt;
&lt;td&gt;41.2 (100)&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leblon&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;24,359 (155)&lt;/td&gt;
&lt;td&gt;118.8 (35)&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ipanema&lt;/td&gt;
&lt;td&gt;Rio&lt;/td&gt;
&lt;td&gt;24,538 (173)&lt;/td&gt;
&lt;td&gt;115.7 (40)&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six sale neighborhoods had fewer than 30 rentals in the window and so have no yield here: Moema (28), Ipiranga (23), Centro (20), Vila Isabel (10), Méier (8) and Engenho Novo (2); Rio's Zona Norte is listed for sale far more than for rent on these portals. The ordering is the usual one: the two most expensive neighborhoods have the lowest asking yields, and the best yields are in mid-priced São Paulo (Santo Amaro, Bela Vista, Vila Andrade) where rents per m² hold up better than sale prices. Median 7.1% in São Paulo, 6.6% in Rio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Studios and one-bedrooms cost the most per m²
&lt;/h2&gt;

&lt;p&gt;Price per m² falls with size, then rises again at the luxury end. In the 13 São Paulo neighborhoods, studios and kitnets (&lt;code&gt;unitSubTypes&lt;/code&gt; STUDIO or KITNET) ask R$ 18,400/m² against R$ 12,823/m² for two-bedroom and R$ 13,044/m² for three-bedroom apartments; four or more bedrooms climb back to R$ 14,683/m². Rent behaves the same way across the whole city.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;SP sale R$/m² (n)&lt;/th&gt;
&lt;th&gt;SP sale median m²&lt;/th&gt;
&lt;th&gt;SP rent R$/m²/month (n)&lt;/th&gt;
&lt;th&gt;SP rent median m²&lt;/th&gt;
&lt;th&gt;RJ sale R$/m² (n)&lt;/th&gt;
&lt;th&gt;RJ rent R$/m²/month (n)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Studio / kitnet&lt;/td&gt;
&lt;td&gt;18,400 (267)&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;100.0 (215)&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;14,000 (113)&lt;/td&gt;
&lt;td&gt;86.1 (31)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 bedroom&lt;/td&gt;
&lt;td&gt;17,073 (745)&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;82.5 (808)&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;10,357 (439)&lt;/td&gt;
&lt;td&gt;64.7 (147)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 bedrooms&lt;/td&gt;
&lt;td&gt;12,823 (1,145)&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;57.3 (1,091)&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;8,212 (952)&lt;/td&gt;
&lt;td&gt;42.4 (384)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 bedrooms&lt;/td&gt;
&lt;td&gt;13,044 (1,359)&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;61.5 (551)&lt;/td&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;10,103 (943)&lt;/td&gt;
&lt;td&gt;50.8 (249)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4+ bedrooms&lt;/td&gt;
&lt;td&gt;14,683 (643)&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;67.4 (89)&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;11,781 (370)&lt;/td&gt;
&lt;td&gt;70.5 (68)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A São Paulo studio rents for a median R$ 2,870 and sells for R$ 500,000; a two-bedroom for R$ 3,300 and R$ 930,000. Two-bedroom apartments are the largest rental class in both cities (40% of São Paulo rentals, 44% of Rio's); on the sale side three-bedroom units lead in São Paulo (33%) and two- and three-bedroom units tie in Rio (34% each).&lt;/p&gt;

&lt;h2&gt;
  
  
  Condominium fee and IPTU
&lt;/h2&gt;

&lt;p&gt;Brazilian listings show the monthly condominium fee (&lt;code&gt;monthlyCondoFeeBrl&lt;/code&gt;) and the yearly property tax (&lt;code&gt;yearlyIptuBrl&lt;/code&gt;) next to the price. The fee is well filled: 92.6% of São Paulo rental apartments and 91.6% of Rio's show one, as do 94–95% of sale listings.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;São Paulo rent&lt;/th&gt;
&lt;th&gt;Rio rent&lt;/th&gt;
&lt;th&gt;São Paulo sale&lt;/th&gt;
&lt;th&gt;Rio sale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Listings with a condo fee&lt;/td&gt;
&lt;td&gt;2,551 (92.6%)&lt;/td&gt;
&lt;td&gt;805 (91.6%)&lt;/td&gt;
&lt;td&gt;3,946 (94.9%)&lt;/td&gt;
&lt;td&gt;2,651 (94.1%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median condo fee&lt;/td&gt;
&lt;td&gt;R$ 915&lt;/td&gt;
&lt;td&gt;R$ 1,197&lt;/td&gt;
&lt;td&gt;R$ 1,400&lt;/td&gt;
&lt;td&gt;R$ 1,239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee as share of rent (median)&lt;/td&gt;
&lt;td&gt;21.6%&lt;/td&gt;
&lt;td&gt;27.8%&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee, interquartile range&lt;/td&gt;
&lt;td&gt;15.3–30.2%&lt;/td&gt;
&lt;td&gt;20.6–37.9%&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee per m² per month&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;R$ 15.8&lt;/td&gt;
&lt;td&gt;R$ 14.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee × 12 as share of asking price&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1.34%&lt;/td&gt;
&lt;td&gt;1.71%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a tenant the fee is the cost that matters: the median all-in monthly outlay (rent + fee + IPTU/12, where all three are shown) is 1.23× the rent in São Paulo and 1.28× in Rio. By size, the fee's share of rent rises from 18% for São Paulo studios to 26% for four-bedroom units; in Rio it is 21–31% in every class.&lt;/p&gt;

&lt;p&gt;IPTU is another matter. The field is filled on 76–86% of listings, but 42.8% of São Paulo rental values and 33.3% of Rio's are R$ 200 a year or less, which in these neighborhoods can only be a monthly amount typed into a yearly field. The medians (R$ 250 a year on São Paulo rentals, R$ 780 on São Paulo sales) are therefore not usable as a tax estimate. If you need IPTU, treat values under about R$ 300 as monthly, or look the property up by its CEP.&lt;/p&gt;

&lt;h2&gt;
  
  
  New developments: 1,130 launch pages, 90% of them in São Paulo
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;listingType: development&lt;/code&gt; returns the portals' launch pages (lançamentos), one per project, all published by OLX's own account. São Paulo had 1,024 and Rio 106 on 31 October 2026; VivaReal reported exactly the same counts, and every id was delivered once.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;São Paulo&lt;/th&gt;
&lt;th&gt;Rio de Janeiro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Launch pages&lt;/td&gt;
&lt;td&gt;1,024&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under construction&lt;/td&gt;
&lt;td&gt;526 (51%)&lt;/td&gt;
&lt;td&gt;66 (62%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built (ready)&lt;/td&gt;
&lt;td&gt;391 (38%)&lt;/td&gt;
&lt;td&gt;14 (13%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan only (na planta)&lt;/td&gt;
&lt;td&gt;106 (10%)&lt;/td&gt;
&lt;td&gt;26 (25%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-bedroom projects&lt;/td&gt;
&lt;td&gt;558 (54%)&lt;/td&gt;
&lt;td&gt;41 (39%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Published in the last 90 days&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top neighborhoods&lt;/td&gt;
&lt;td&gt;Vila Mariana 58, Pinheiros 48, Perdizes 35, Indianópolis 35, Vila Clementino 31, Jardim Paulista 25&lt;/td&gt;
&lt;td&gt;Recreio 21, Barra da Tijuca 20, Centro 8, Barra Olímpica 7, Botafogo 7, Ipanema 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Over half of São Paulo's launches are one-bedroom projects, which matches the studio-heavy rental market above. A launch page quotes a price range and an area range; the record pairs the quoted price with the smallest unit, so a price per m² for developments is not computed in this study. The pages do carry the project name, construction status, coordinates and the unit mix, which is what a "new launches in Vila Mariana" feed needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zap Imóveis and VivaReal list the same ads
&lt;/h2&gt;

&lt;p&gt;Pinheiros, Moema, Copacabana and Tijuca were pulled once from Zap Imóveis and once from VivaReal with the same three-day window, a few minutes apart.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Neighborhood&lt;/th&gt;
&lt;th&gt;Ids on Zap&lt;/th&gt;
&lt;th&gt;Ids on VivaReal&lt;/th&gt;
&lt;th&gt;On both&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pinheiros&lt;/td&gt;
&lt;td&gt;695&lt;/td&gt;
&lt;td&gt;695&lt;/td&gt;
&lt;td&gt;695&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moema&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copacabana&lt;/td&gt;
&lt;td&gt;459&lt;/td&gt;
&lt;td&gt;459&lt;/td&gt;
&lt;td&gt;459&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tijuca&lt;/td&gt;
&lt;td&gt;287&lt;/td&gt;
&lt;td&gt;287&lt;/td&gt;
&lt;td&gt;286&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;1,610 of 1,612 distinct ids were on both portals (the two exceptions were published between the two runs), and for every shared id the price, usable area, condominium fee, advertiser and &lt;code&gt;createdAt&lt;/code&gt; were identical. Both sites read one OLX listing database; the portal is a skin. If you collect from both you will count everything twice, which is why the Actor delivers an id once even with both portals selected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who advertises
&lt;/h2&gt;

&lt;p&gt;Sale listings are concentrated: in the 13 São Paulo neighborhoods, 418 advertisers posted the 4,159 clean apartments and the top five (Emcasa 769, Newcore 661, SH Prime Imóveis 223, Hit Imóveis 166, Ishikawa Imóveis 119) posted 47%. In Rio's 13, 434 advertisers, top five 46% (Nova Época Imóveis 552, Maisveloz Leblon 342, Maisveloz Imóveis Laranjeiras 176, Newcore 130, Styllus Méier Alfa 105). Rentals are fragmented: 893 advertisers in São Paulo with the top five at 10.6%, 491 in Rio at 7.4%. A CRECI licence number is shown on 67–83% of listings; the rest are private owners or agencies that left it out. 54–70% of listings carry coordinates, and 93–99% show the street.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Zap Imóveis and VivaReal listings as JSON, CSV or Excel
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/data_daemon/zap-imoveis-vivareal-scraper" rel="noopener noreferrer"&gt;Zap Imóveis &amp;amp; VivaReal Scraper&lt;/a&gt; returns one row per listing: price, condominium fee, IPTU, price per m², usable and total area, bedrooms, bathrooms, suites, parking, property type and sub-type, construction status, address with neighborhood, zone, CEP and coordinates, creation and update dates, advertiser name and CRECI, and up to ten photo URLs. Filters for city, neighborhood, sale or rent, price, bedrooms, area, property type and listing age, newest first, with an only-new mode for daily feeds. No login or proxy setup, $1 per 1,000 listings plus $0.001 per run. The listings behind this article were read in 14 runs.&lt;/p&gt;

&lt;p&gt;New two-bedroom apartments for sale in Copacabana, in one HTTP call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~zap-imoveis-vivareal-scraper/run-sync-get-dataset-items?timeout=300"&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 &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&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; @input.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with &lt;code&gt;input.json&lt;/code&gt; (a UTF-8 file, because &lt;code&gt;curl.exe&lt;/code&gt; on Windows mangles accented characters in &lt;code&gt;-d&lt;/code&gt; strings):&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;"locations"&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;"Rio de Janeiro, RJ"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"neighborhoods"&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;"Copacabana"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"business"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"propertyTypes"&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;"apartment"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"minBedrooms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeImages"&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;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A row 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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2920089342"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"portal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Zap Imóveis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.zapimoveis.com.br/imovel/venda-apartamento-4-quartos-com-piscina-santana-zona-norte-sao-paulo-sp-153m2-id-2920089342/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apartamento com 4 Quartos à venda, 153m²"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"business"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"listingType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priceBrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1300000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"monthlyCondoFeeBrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2395&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"yearlyIptuBrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pricePerSqmBrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8496.73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usableAreaSqm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;153&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bedrooms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parkingSpaces"&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;"unitTypes"&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;"APARTMENT"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usageTypes"&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;"RESIDENTIAL"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"neighborhood"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Santana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Zona Norte"&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;"São Paulo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stateCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zipCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"02403010"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-23.491836&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-46.631268&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&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-30T18:13:08.506+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"advertiserName"&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;"advertiserCreci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To reproduce the Pinheiros and Moema rows of the sale table with the Python client and pandas (865 listings, about $0.87 at the list price, under a minute):&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/zap-imoveis-vivareal-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="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locations&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;São Paulo, SP&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;neighborhoods&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;Pinheiros&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;Moema&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;business&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;sale&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;portals&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;zap&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeImages&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# no cap: every listing created in the last 3 days
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&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="c1"&gt;# residential apartments with a price and a usable area, inside plausible bounds
&lt;/span&gt;&lt;span class="n"&gt;apts&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;unitTypes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;apply&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;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APARTMENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;priceBrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;usableAreaSqm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_per_m2&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="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priceBrl&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="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usableAreaSqm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;apts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usableAreaSqm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;between&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_per_m2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;between&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60000&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="nf"&gt;len&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;listings,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apts&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;clean apartments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apts&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;neighborhood&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;listings&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;id&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;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;median_price_per_m2&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;price_per_m2&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;median&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;median_area_m2&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;usableAreaSqm&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;median&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;median_price&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;priceBrl&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;median&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;with_condo_fee&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;monthlyCondoFeeBrl&lt;/span&gt;&lt;span class="sh"&gt;"&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;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;median_price_per_m2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;865 listings, 668 clean apartments
              listings  median_price_per_m2  median_area_m2  median_price  with_condo_fee
neighborhood
Pinheiros          527              18824.0            72.0     1200000.0             1.0
Moema              141              18456.0           105.0     1449560.0             1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a daily feed of new listings under a price per m², schedule a task with &lt;code&gt;postedWithinDays: 1&lt;/code&gt;, &lt;code&gt;onlyNewSinceLastRun: true&lt;/code&gt; and &lt;code&gt;maxResults: 0&lt;/code&gt;, and filter &lt;code&gt;pricePerSqmBrl&lt;/code&gt; on your side: each listing is delivered and charged once. From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/zap-imoveis-vivareal-scraper&lt;/code&gt; in Claude, ChatGPT or Cursor and ask "quais apartamentos de 2 quartos entraram em Pinheiros hoje abaixo de R$ 15 mil o m²?".&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asking prices, not transactions.&lt;/strong&gt; Nothing here says what a buyer paid. Registered prices in Brazil sit with the cartórios and the municipal ITBI records, not the portals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three days, 26 neighborhoods.&lt;/strong&gt; The sale tables cover the listings created between 28 and 31 October 2026 in 13 neighborhoods per city, chosen because they were the busiest in a city-wide sample and could be read completely. They are not a city average: São Paulo's set leans to the centre-south and west, Rio's to Zona Sul, Barra and the Méier axis; Zona Leste, Zona Oeste and the suburbs are largely absent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A listing is not a unit.&lt;/strong&gt; Agencies re-list the same apartment, and 281 ids carried both a sale and a rent price. Duplicate ads of one property under different ids are not detected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usable area is what the advertiser typed.&lt;/strong&gt; The 15–1,000 m² and R$ 1,000–60,000/m² bounds remove obvious typos (36 sale and 16 rent apartments), not subtle ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPTU&lt;/strong&gt; is often entered monthly in a yearly field (see above). The condominium fee looked consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekday window.&lt;/strong&gt; 28–31 October ran Wednesday to Saturday; listing volumes on other days are not measured.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;What is the asking price per m² in São Paulo in November 2026?&lt;/strong&gt;&lt;br&gt;
In listings created 28–31 October 2026: Pinheiros R$ 18,824 per m² (median of 527 apartments), Itaim Bibi R$ 18,645, Vila Olímpia R$ 18,512, Moema R$ 18,456, Indianópolis R$ 15,811, Jardim Paulista R$ 15,163, Vila Mariana R$ 14,053, Perdizes R$ 13,509, Santo Amaro R$ 12,909, Ipiranga R$ 12,130, Bela Vista R$ 11,111, Mooca R$ 9,297, Vila Andrade R$ 8,776. Across the 13 neighborhoods the median was R$ 14,286 and the tenth-to-ninetieth percentile range R$ 8,333–25,385.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the asking price per m² in Rio de Janeiro?&lt;/strong&gt;&lt;br&gt;
Ipanema R$ 24,538 per m² (173 apartments), Leblon R$ 24,359, Barra da Tijuca R$ 14,239, Botafogo R$ 13,499, Copacabana R$ 13,158, Flamengo R$ 12,308, Barra Olímpica R$ 9,821, Recreio R$ 7,996, Centro R$ 7,859, Tijuca R$ 6,417, Vila Isabel R$ 4,863, Méier R$ 4,385, Engenho Novo R$ 3,571, same window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the rental yield in São Paulo and Rio?&lt;/strong&gt;&lt;br&gt;
Gross asking yields of 5.7% (Ipanema) to 8.2% (Santo Amaro, Vila Andrade), median 7.1% across 11 São Paulo neighborhoods and 6.6% across 9 in Rio, computed as median asking rent per m² × 12 divided by median asking sale price per m². Net yields after vacancy, condominium fee and tax are lower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much is the condomínio compared with the rent?&lt;/strong&gt;&lt;br&gt;
Median 21.6% of the monthly rent in São Paulo and 27.8% in Rio; a quarter of Rio rentals carry a fee above 38% of the rent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are Zap Imóveis and VivaReal the same listings?&lt;/strong&gt;&lt;br&gt;
Yes. 1,610 of 1,612 listing ids in four neighborhoods appeared on both portals with identical price, area, advertiser and creation date. One portal is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a Zap Imóveis or VivaReal API?&lt;/strong&gt;&lt;br&gt;
Not a public one for listing data. The portals' pages load their listings from a JSON service, which the Actor above reads and returns through Apify's API (&lt;code&gt;POST https://api.apify.com/v2/acts/data_daemon~zap-imoveis-vivareal-scraper/run-sync-get-dataset-items&lt;/code&gt;), as a dataset you can download as JSON, CSV or Excel or append to Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the data include phone numbers?&lt;/strong&gt;&lt;br&gt;
No. Advertiser phone and WhatsApp numbers are not collected; the agency name and CRECI number identify the advertiser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes (PT-BR)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Qual é o preço do m² em São Paulo em novembro de 2026?&lt;/strong&gt;&lt;br&gt;
Nos anúncios criados de 28 a 31/10/2026: Pinheiros R$ 18.824 por m² (mediana de 527 apartamentos), Itaim Bibi R$ 18.645, Vila Olímpia R$ 18.512, Moema R$ 18.456, Indianópolis R$ 15.811, Jardim Paulista R$ 15.163, Vila Mariana R$ 14.053, Perdizes R$ 13.509, Santo Amaro R$ 12.909, Ipiranga R$ 12.130, Bela Vista R$ 11.111, Mooca R$ 9.297, Vila Andrade R$ 8.776. São preços pedidos; nos 13 bairros, 80% dos anúncios ficaram entre R$ 8.333 e R$ 25.385 por m².&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual é o preço do m² no Rio de Janeiro?&lt;/strong&gt;&lt;br&gt;
Ipanema R$ 24.538 por m² (173 apartamentos), Leblon R$ 24.359, Barra da Tijuca R$ 14.239, Botafogo R$ 13.499, Copacabana R$ 13.158, Flamengo R$ 12.308, Barra Olímpica R$ 9.821, Recreio R$ 7.996, Centro R$ 7.859, Tijuca R$ 6.417, Vila Isabel R$ 4.863, Méier R$ 4.385, Engenho Novo R$ 3.571, no mesmo período.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto custa o aluguel por m² em São Paulo e no Rio?&lt;/strong&gt;&lt;br&gt;
Mediana da cidade: R$ 66,7 por m² ao mês em São Paulo (apartamento mediano de 56 m² por R$ 3.500) e R$ 51,7 no Rio (75 m² por R$ 3.900). Por bairro: Vila Nova Conceição R$ 128, Vila Olímpia R$ 122, Leblon R$ 119, Ipanema R$ 116, Pinheiros R$ 107, Copacabana R$ 79, Tijuca R$ 38.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual é a rentabilidade do aluguel em São Paulo e no Rio?&lt;/strong&gt;&lt;br&gt;
Rendimento bruto estimado com preços pedidos (aluguel por m² × 12 ÷ preço de venda por m²): de 5,7% em Ipanema a 8,2% em Santo Amaro e na Vila Andrade; mediana de 7,1% em 11 bairros de São Paulo e 6,6% em 9 do Rio. O rendimento líquido, depois de vacância, condomínio e imposto, é menor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto o condomínio pesa no aluguel?&lt;/strong&gt;&lt;br&gt;
Mediana de 21,6% do aluguel em São Paulo (R$ 915) e 27,8% no Rio (R$ 1.197). O campo de IPTU é pouco confiável: 43% dos valores em São Paulo e 33% no Rio são de até R$ 200 por ano, provavelmente valores mensais digitados no campo anual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zap Imóveis e VivaReal têm os mesmos anúncios?&lt;/strong&gt;&lt;br&gt;
Sim. 1.610 de 1.612 ids de anúncios em quatro bairros apareceram nos dois portais com preço, área, anunciante e data idênticos. Basta coletar de um.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existe API do Zap Imóveis ou do VivaReal?&lt;/strong&gt;&lt;br&gt;
Não há API pública de anúncios. As páginas dos portais carregam os anúncios de um serviço JSON, que o &lt;a href="https://apify.com/data_daemon/zap-imoveis-vivareal-scraper" rel="noopener noreferrer"&gt;Zap Imóveis &amp;amp; VivaReal Scraper&lt;/a&gt; lê e devolve como JSON, CSV ou Excel pela API da Apify, sem login nem configuração de proxy, a US$ 1 por 1.000 anúncios. Telefones e WhatsApp dos anunciantes não são coletados.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are asking prices from listings on Zap Imóveis and VivaReal as read on 31 October 2026, 17:47–18:37 UTC, for the neighborhoods and windows stated above. They describe what advertisers asked in those days, not Brazil's housing market. Data: zapimoveis.com.br and vivareal.com.br via the Zap Imóveis &amp;amp; VivaReal Scraper.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>brazil</category>
      <category>realestate</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>How many companies were registered in India in October 2026? 17,622 new companies by state, type and industry</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Fri, 30 Oct 2026 17:44:42 +0000</pubDate>
      <link>https://dev.to/datadaemon/how-many-companies-were-registered-in-india-in-october-2026-17622-new-companies-by-state-type-2h9b</link>
      <guid>https://dev.to/datadaemon/how-many-companies-were-registered-in-india-in-october-2026-17622-new-companies-by-state-type-2h9b</guid>
      <description>&lt;p&gt;India's Ministry of Corporate Affairs (MCA) registers new companies every working day, but its own portal answers one company at a time, behind a captcha. There is no public "companies incorporated this week" list you can download.&lt;/p&gt;

&lt;p&gt;I pulled &lt;strong&gt;every company the MCA register lists as incorporated from 1 to 29 October 2026: 17,622 companies across 26 register dates&lt;/strong&gt;, and grouped them by state, company type and industry. Data as read on 30 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;17,622 companies were incorporated in India from 1 to 29 October 2026&lt;/strong&gt;: about &lt;strong&gt;800 per working day&lt;/strong&gt; (15,892 over 20 weekdays), about 420 on Saturdays, and almost none on Sundays (39 in the month). 2 October (Gandhi Jayanti) had none; the busiest day was Monday 5 October with 1,366.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;85% are private limited companies&lt;/strong&gt; (15,005). Section 8 non-profits are 7.4% (1,302), One Person Companies 5.9% (1,045), subsidiaries of foreign companies 1% (182) and new public limited companies 0.4% (71).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maharashtra registers the most&lt;/strong&gt;: 2,940 companies (16.7%), then Uttar Pradesh 1,931, Karnataka 1,415, Telangana 1,326, Delhi 1,321 and Tamil Nadu 1,266.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IT services is the largest industry&lt;/strong&gt;: 13.4% of new companies (2,367) declared computer programming and consultancy as their main activity, ahead of wholesale trade (9.8%) and retail (6.0%). In Karnataka and Telangana the share is 24% and 23%; in Delhi wholesale comes first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One in four new CINs (26%) carries a newer state code&lt;/strong&gt;: UW, PN, MR, DC, WR, ME or TZ. A CIN lookup table that only knows the classic codes (MH, UP, DL...) leaves these companies without a state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; the MCA register as mirrored by companies.dubleu.co, a public company directory that lists incorporations by date. Fetched with the &lt;a href="https://apify.com/data_daemon/india-new-company-registrations" rel="noopener noreferrer"&gt;India New Company Registrations&lt;/a&gt; Actor on Apify, in listing mode (&lt;code&gt;includeDetails: false&lt;/code&gt;), which reads the date lists and decodes each CIN without opening company pages. Runs &lt;code&gt;B2Wxf3ZJDh3Wqu6WP&lt;/code&gt; (14,456 rows; the directory rate-limited five list pages) and &lt;code&gt;zxFnbB2hnvIAfVNvC&lt;/code&gt; (3,966 rows re-reading 3, 5, 14, 15 and 16 October in full), merged and de-duplicated on CIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What the CIN tells you:&lt;/strong&gt; a CIN such as &lt;code&gt;U62011KA2026PTC230412&lt;/code&gt; encodes listed/unlisted (&lt;code&gt;U&lt;/code&gt;), the main activity as a 5-digit NIC 2008 code (&lt;code&gt;62011&lt;/code&gt;), the state (&lt;code&gt;KA&lt;/code&gt;), the year (&lt;code&gt;2026&lt;/code&gt;), the type (&lt;code&gt;PTC&lt;/code&gt; private, &lt;code&gt;NPL&lt;/code&gt; Section 8, &lt;code&gt;OPC&lt;/code&gt;, &lt;code&gt;FTC&lt;/code&gt; foreign subsidiary, &lt;code&gt;PLC&lt;/code&gt; public, &lt;code&gt;GOI&lt;/code&gt;/&lt;code&gt;SGC&lt;/code&gt; government) and the registration number. The NIC division in the CIN matched the activity shown on the company page for 200 of 200 companies checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope:&lt;/strong&gt; companies only. The directory's date lists did not include LLPs, which are registered under a separate LLPIN, so LLPs are not counted. 30 October was not yet listed when the data was read; late additions can still appear for recent dates.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company type&lt;/th&gt;
&lt;th&gt;Companies&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Private limited (PTC)&lt;/td&gt;
&lt;td&gt;15,005&lt;/td&gt;
&lt;td&gt;85.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Section 8 non-profit (NPL)&lt;/td&gt;
&lt;td&gt;1,302&lt;/td&gt;
&lt;td&gt;7.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One Person Company (OPC)&lt;/td&gt;
&lt;td&gt;1,045&lt;/td&gt;
&lt;td&gt;5.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foreign company subsidiary (FTC)&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;td&gt;1.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public limited (PLC)&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government company (GOI, SGC)&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which states register the most new companies?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;New companies, 1–29 Oct 2026&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;IT services share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maharashtra&lt;/td&gt;
&lt;td&gt;2,940&lt;/td&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uttar Pradesh&lt;/td&gt;
&lt;td&gt;1,931&lt;/td&gt;
&lt;td&gt;11.0%&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Karnataka&lt;/td&gt;
&lt;td&gt;1,415&lt;/td&gt;
&lt;td&gt;8.0%&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telangana&lt;/td&gt;
&lt;td&gt;1,326&lt;/td&gt;
&lt;td&gt;7.5%&lt;/td&gt;
&lt;td&gt;23%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delhi&lt;/td&gt;
&lt;td&gt;1,321&lt;/td&gt;
&lt;td&gt;7.5%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamil Nadu&lt;/td&gt;
&lt;td&gt;1,266&lt;/td&gt;
&lt;td&gt;7.2%&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gujarat&lt;/td&gt;
&lt;td&gt;1,088&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haryana&lt;/td&gt;
&lt;td&gt;914&lt;/td&gt;
&lt;td&gt;5.2%&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kerala&lt;/td&gt;
&lt;td&gt;714&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;West Bengal&lt;/td&gt;
&lt;td&gt;691&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rajasthan&lt;/td&gt;
&lt;td&gt;685&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bihar&lt;/td&gt;
&lt;td&gt;636&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"IT services share" is the share of the state's new companies whose CIN starts with NIC division 62 (computer programming, consultancy and related activities). Bengaluru and Hyderabad show up clearly: roughly one new company in four there is a software or IT consulting firm. Andhra Pradesh follows at 20%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which industries are new Indian companies in?
&lt;/h2&gt;

&lt;p&gt;Main activity declared at incorporation, NIC 2008 division, all 17,622 companies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NIC division&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Companies&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;Computer programming, consultancy and related activities&lt;/td&gt;
&lt;td&gt;2,367&lt;/td&gt;
&lt;td&gt;13.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;Wholesale trade&lt;/td&gt;
&lt;td&gt;1,730&lt;/td&gt;
&lt;td&gt;9.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;Retail trade&lt;/td&gt;
&lt;td&gt;1,052&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;Social work activities without accommodation&lt;/td&gt;
&lt;td&gt;808&lt;/td&gt;
&lt;td&gt;4.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;Real estate activities&lt;/td&gt;
&lt;td&gt;749&lt;/td&gt;
&lt;td&gt;4.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;td&gt;723&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;Specialized construction activities&lt;/td&gt;
&lt;td&gt;478&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Manufacture of food products&lt;/td&gt;
&lt;td&gt;469&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;Electricity, gas, steam and air conditioning supply&lt;/td&gt;
&lt;td&gt;468&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;Construction of buildings&lt;/td&gt;
&lt;td&gt;418&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;Human health activities&lt;/td&gt;
&lt;td&gt;415&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;Employment activities&lt;/td&gt;
&lt;td&gt;379&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;Head offices and management consultancy&lt;/td&gt;
&lt;td&gt;374&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By broad section: information and communication 17.5%, wholesale and retail trade 16.6%, manufacturing 14.7%, health and social work 7.2%, professional and technical services 7.1%, construction 6.3%.&lt;/p&gt;

&lt;p&gt;A few details that stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Energy:&lt;/strong&gt; 357 new companies registered power generation and distribution (NIC 3510) as their main activity; 74 company names contain "SOLAR", 301 "ENERGY" and 154 "GREEN".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI in the name:&lt;/strong&gt; 199 new companies have the word "AI" in their name, three in four of them (152) registered as IT services. "TECHNOLOGIES" (905) and "SOLUTIONS" (771) are still the most common name words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 8 companies are mostly charities and schools:&lt;/strong&gt; 61% of the 1,302 declared social work (division 88) and 20% education. Maharashtra (268), Uttar Pradesh (179), Bihar (93), West Bengal (90) and Delhi (86) register the most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreign subsidiaries cluster in IT:&lt;/strong&gt; 60 of the 182 new subsidiaries of foreign companies are IT services firms, mostly in Maharashtra (37), Karnataka (30), Telangana (22) and Haryana (18).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The CIN state codes older tables miss
&lt;/h2&gt;

&lt;p&gt;Classic CIN state codes are the two-letter state abbreviations: MH, KA, DL, UP and so on. In October 2026, 4,609 of the 17,622 new CINs (26%) carried one of these codes instead:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CIN code&lt;/th&gt;
&lt;th&gt;Registrar (RoC) on the company page&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Companies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UW&lt;/td&gt;
&lt;td&gt;RoC Uttar Pradesh II&lt;/td&gt;
&lt;td&gt;Uttar Pradesh&lt;/td&gt;
&lt;td&gt;1,020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PN&lt;/td&gt;
&lt;td&gt;RoC Pune&lt;/td&gt;
&lt;td&gt;Maharashtra&lt;/td&gt;
&lt;td&gt;961&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MR&lt;/td&gt;
&lt;td&gt;RoC Mumbai II&lt;/td&gt;
&lt;td&gt;Maharashtra&lt;/td&gt;
&lt;td&gt;810&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC&lt;/td&gt;
&lt;td&gt;RoC Delhi II&lt;/td&gt;
&lt;td&gt;Delhi&lt;/td&gt;
&lt;td&gt;611&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WR&lt;/td&gt;
&lt;td&gt;RoC Kolkata II&lt;/td&gt;
&lt;td&gt;West Bengal&lt;/td&gt;
&lt;td&gt;499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ME&lt;/td&gt;
&lt;td&gt;RoC Nagpur&lt;/td&gt;
&lt;td&gt;Maharashtra&lt;/td&gt;
&lt;td&gt;388&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TZ&lt;/td&gt;
&lt;td&gt;RoC Coimbatore&lt;/td&gt;
&lt;td&gt;Tamil Nadu&lt;/td&gt;
&lt;td&gt;320&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mapping was checked against the registrar shown on each company's page. If your code derives the state from characters 7–8 of the CIN, add these, or a quarter of new Maharashtra, Uttar Pradesh, Delhi, West Bengal and Tamil Nadu companies will come back without a state. (Our own Actor had the same gap until build 0.1.9, released while writing this.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the list of newly registered companies in India as JSON
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/data_daemon/india-new-company-registrations" rel="noopener noreferrer"&gt;India New Company Registrations&lt;/a&gt; Actor returns newly incorporated companies by date as JSON, CSV or Excel: CIN decoded into type, state and NIC code, and, with &lt;code&gt;includeDetails: true&lt;/code&gt; (the default), RoC, category, NIC activity text, authorised and paid-up capital, registered office address with PIN code and the number of directors. It collects no director names, phone numbers or email addresses. It needs no login or API key and costs $3 per 1,000 companies; filters on type, state and name are applied before anything is charged.&lt;/p&gt;

&lt;p&gt;Today's new companies in Karnataka in one HTTP call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~india-new-company-registrations/run-sync-get-dataset-items?timeout=300"&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 &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&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;'{"recentDates": 1, "states": ["Karnataka"], "includeDetails": false, "maxResults": 20}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With details, a row looks like this (trimmed):&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;"cin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"U56301KA2026PTC230411"&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;"2 MORE SHOTS HOSPITALITY PRIVATE 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;"registrationDate"&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-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;"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;"Private 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;"roc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RoC-Bangalore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Karnataka"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nicCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"56301"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"activity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Food and beverage service activities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorizedCapitalInr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paidUpCapitalInr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pincode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"560035"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"directorsCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="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;To reproduce the tables above, pull the month in listing mode and group with pandas:&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/india-new-company-registrations&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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fromDate&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-10-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;toDate&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-10-29&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;includeDetails&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;list_items&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;items&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;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cin&lt;/span&gt;&lt;span class="sh"&gt;"&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;division&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="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;nicCode&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="mi"&gt;2&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;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;companyType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;by_state&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="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;state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;agg&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="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cin&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;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;it_share_pct&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;division&lt;/span&gt;&lt;span class="sh"&gt;"&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;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;62&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&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;by_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&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="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;companyType
Private Limited                 15005
Section 8 (non-profit)           1302
One Person Company               1045
Foreign company (subsidiary)      182
Name: count, dtype: int64
               companies  it_share_pct
state
Maharashtra         2940            12
Uttar Pradesh       1931            13
Karnataka           1415            24
Telangana           1326            23
Delhi               1321            10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A whole month is about 17,600 rows, so this exact pull costs about $53 at $3 per 1,000. For a daily lead feed, schedule the Actor once a day with &lt;code&gt;recentDates: 3&lt;/code&gt; and &lt;code&gt;onlyNewSinceLastRun: true&lt;/code&gt;: each company is delivered (and charged) once, about 800 a working day before filters, fewer with a state, type or name filter.&lt;/p&gt;

&lt;p&gt;Ready-made inputs, each a one-click run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-new-company-registrations/examples/new-companies-india-latest-day" rel="noopener noreferrer"&gt;New companies registered in India on the latest day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-new-company-registrations/examples/new-section-8-companies-india" rel="noopener noreferrer"&gt;New Section 8 (non-profit) companies in India, newest 100&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/india-new-company-registrations&lt;/code&gt; in Claude, ChatGPT or Cursor and ask "which software companies were incorporated in Pune this week?".&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How many companies are registered in India every day?&lt;/strong&gt;&lt;br&gt;
About 800 per working day in October 2026: 15,892 companies over 20 weekdays, plus about 420 on each Saturday and almost none on Sundays and public holidays. The month from 1 to 29 October totalled 17,622 companies (LLPs not included).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which state registers the most new companies in India?&lt;/strong&gt;&lt;br&gt;
Maharashtra: 2,940 of the 17,622 companies incorporated from 1 to 29 October 2026 (16.7%), followed by Uttar Pradesh (1,931), Karnataka (1,415), Telangana (1,326) and Delhi (1,321).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I get a list of newly registered companies in India?&lt;/strong&gt;&lt;br&gt;
The MCA portal shows one company at a time. For a list by incorporation date, use a directory that mirrors the register by date, or the Actor above, which returns each day's new companies as JSON, CSV or Excel and can run on a schedule with only-new delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an MCA API for new company registrations?&lt;/strong&gt;&lt;br&gt;
MCA does not offer a public REST API for new incorporations; its master-data search is a web form with a captcha. The Actor above exposes the daily lists through Apify's API: &lt;code&gt;POST https://api.apify.com/v2/acts/data_daemon~india-new-company-registrations/run-sync-get-dataset-items&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do CIN codes like PN, MR or UW mean?&lt;/strong&gt;&lt;br&gt;
They are state codes used by newer Registrars of Companies: PN Pune, MR Mumbai II, ME Nagpur (all Maharashtra), UW Uttar Pradesh II, DC Delhi II, WR Kolkata II (West Bengal) and TZ Coimbatore (Tamil Nadu). In October 2026 they appeared on 26% of new CINs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many Section 8 companies are registered each month?&lt;/strong&gt;&lt;br&gt;
1,302 from 1 to 29 October 2026, 7.4% of all incorporations. Most declared social work (61%) or education (20%) as their main activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the data include director names, phone numbers or emails?&lt;/strong&gt;&lt;br&gt;
No. It covers company facts only: name, CIN, type, registrar, state, activity, capital, registered office and the number of directors.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are from the MCA register as listed by companies.dubleu.co and read on 30 October 2026; recent dates can still grow as late registrations appear. LLPs are not included.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>india</category>
      <category>datascience</category>
      <category>python</category>
      <category>startup</category>
    </item>
    <item>
      <title>Brazil job postings on Gupy: what 9,879 new jobs in October 2026 show (remote share, PcD, CLT vs PJ, cities, roles)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Thu, 29 Oct 2026 20:03:04 +0000</pubDate>
      <link>https://dev.to/datadaemon/brazil-job-postings-on-gupy-what-9879-new-jobs-in-october-2026-show-remote-share-pcd-clt-vs-4bjj</link>
      <guid>https://dev.to/datadaemon/brazil-job-postings-on-gupy-what-9879-new-jobs-in-october-2026-show-remote-share-pcd-clt-vs-4bjj</guid>
      <description>&lt;p&gt;Gupy is the applicant-tracking system behind the career sites of thousands of Brazilian employers, and its public portal (portal.gupy.io) lists every job those employers publish, newest first. There is no Gupy API for job search, so most "vagas Gupy" numbers you read are guesses.&lt;/p&gt;

&lt;p&gt;I pulled &lt;strong&gt;every job the portal listed on 29 October 2026: 9,879 postings from 1,571 employers, published between Monday 26 October, 10:06 and Thursday 29 October, 16:47 Brasília time&lt;/strong&gt; (3.3 days; the portal only keeps its newest 10,000), and counted workplace type, vacancy type, PcD flags, states, cities, employers and roles. Data as of 29 October 2026, 19:53 UTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo em português:&lt;/strong&gt; o portal da Gupy listava 9.879 vagas em 29/10/2026, publicadas em 3,3 dias (cerca de 2.700 vagas por dia útil). 91,8% presenciais, 6,7% híbridas e 1,5% remotas; 85,4% CLT (efetivo), 3,7% jovem aprendiz, 3,5% temporárias, 3,0% estágio, 1,2% PJ. 76% das vagas estão marcadas como abertas a PcD (3,0% são vagas afirmativas no título). São Paulo concentra 42,4% das vagas (a cidade de São Paulo, 18,8%); Rio de Janeiro 8,4%, Minas Gerais 7,4%, Paraná 5,9%. O McDonald's (Arcos Dorados) sozinho publicou 15,3% das vagas. As perguntas frequentes em português estão no fim do artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;About 2,700 new jobs a working day.&lt;/strong&gt; 2,692 jobs were published on Tuesday 27 October and 2,793 on Wednesday 28 October (Brasília dates); 2,701 in the 24 hours before the newest posting. 92% of postings went live between 08:00 and 17:59 Brasília time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote work is rare on Gupy: 1.5%.&lt;/strong&gt; 148 of 9,879 jobs were remote, 662 (6.7%) hybrid and 9,069 (91.8%) on-site. In jobs with a tech title, 25% were remote and 31% hybrid; in developer titles, 47% were remote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;76% of jobs are marked open to people with disabilities (PcD)&lt;/strong&gt;, the same share on every day of the window. 3.0% of titles name an affirmative vacancy ("vaga afirmativa para PcD").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLT is 85%, PJ is 1%.&lt;/strong&gt; 8,441 jobs were &lt;code&gt;effective&lt;/code&gt; (regular CLT employment), 369 apprentice (jovem aprendiz), 349 temporary, 297 internships, 153 talent pools and 120 PJ (&lt;code&gt;legal_entity&lt;/code&gt;). PJ rises to 8% in tech titles and 11% in remote jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;São Paulo state has 42% of the jobs&lt;/strong&gt;, the city of São Paulo alone 19%. Hybrid work is a big-city thing: 16% of jobs in the city of São Paulo, 13% in Rio de Janeiro, 11% in Belo Horizonte, under 1% in Goiás and Mato Grosso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One employer posted 15% of everything.&lt;/strong&gt; McDonald's (Arcos Dorados) published 1,513 jobs in 3.3 days. The ten busiest employers posted 28% of the jobs; 609 employers posted exactly one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The portal is a frontline-hiring board.&lt;/strong&gt; "Atendente" titles (restaurant and store attendants) were 21% of postings, sales 10%, "analista" 9%, "operador" 9%, "auxiliar" 8%. Developer titles were 0.6% and data titles 0.8%.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; the Gupy portal's job search, read with the &lt;a href="https://apify.com/data_daemon/gupy-jobs-scraper" rel="noopener noreferrer"&gt;Gupy Jobs Scraper&lt;/a&gt; Actor on Apify (run &lt;code&gt;ExVTyc9fdbsCZSwzP&lt;/code&gt;, empty search, no cap, 9,879 rows in 308 seconds). The portal serves 12 jobs a page, newest first, and stops at page 833, so the run is the newest 10,000 jobs minus 117 jobs that moved pages while new ones were published and were deduplicated by id.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Window:&lt;/strong&gt; &lt;code&gt;postedAt&lt;/code&gt; from 2026-10-26 13:06 UTC to 2026-10-29 19:47 UTC. The first and last days are partial; only Tuesday and Wednesday are full days. The window has no weekend, so weekend volumes are not measured here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fields are the employer's own.&lt;/strong&gt; Workplace type, vacancy type, PcD flag, city and state are what the employer selected in Gupy when publishing. Nobody verified that a "hybrid" job is hybrid. The portal shows no salary, so there is no salary field; 9.2% of descriptions mention an amount in R$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role families&lt;/strong&gt; are regular expressions on accent-folded titles (&lt;code&gt;atendente|atendimento&lt;/code&gt;, &lt;code&gt;vendedor|vendas|comercial&lt;/code&gt;, &lt;code&gt;desenvolvedor|developer|programador|software&lt;/code&gt;, ...). A title can fall into two families. Tech titles are a wider pattern (developer, dados/data, DevOps, cloud, QA, TI, infraestrutura, SAP, BI, UX and similar), 264 jobs.&lt;/li&gt;
&lt;li&gt;The analysis script, the raw dataset and the output are in the study folder linked at the end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Workplace and vacancy type
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workplace type&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;Open to PcD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;On-site (presencial)&lt;/td&gt;
&lt;td&gt;9,069&lt;/td&gt;
&lt;td&gt;91.8%&lt;/td&gt;
&lt;td&gt;75.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid (híbrido)&lt;/td&gt;
&lt;td&gt;662&lt;/td&gt;
&lt;td&gt;6.7%&lt;/td&gt;
&lt;td&gt;78.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote (remoto / home office)&lt;/td&gt;
&lt;td&gt;148&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;79.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vacancy type (&lt;code&gt;jobType&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;Open to PcD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;effective&lt;/code&gt; (CLT)&lt;/td&gt;
&lt;td&gt;8,441&lt;/td&gt;
&lt;td&gt;85.4%&lt;/td&gt;
&lt;td&gt;76.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;apprentice&lt;/code&gt; (jovem aprendiz)&lt;/td&gt;
&lt;td&gt;369&lt;/td&gt;
&lt;td&gt;3.7%&lt;/td&gt;
&lt;td&gt;71.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temporary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;349&lt;/td&gt;
&lt;td&gt;3.5%&lt;/td&gt;
&lt;td&gt;79.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;internship&lt;/code&gt; (estágio)&lt;/td&gt;
&lt;td&gt;297&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;72.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;talent_pool&lt;/code&gt; (banco de talentos)&lt;/td&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;92.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;legal_entity&lt;/code&gt; (PJ)&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;61.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;other (associate, autonomous, lecturer, trainee, freelancer, ...)&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;78.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Remote jobs are a different market from the rest of the portal. 44% of them have a tech title (against 2.7% of all jobs), 11% are PJ contracts (against 1.2%), and 147 of the 148 carry no city or state (the employer chose "Remote" instead of a place). The employers with the most remote jobs were Stefanini Group (8), Globalweb (7), Grupo Boticário (6), Afya, Vetta Tecnologia, Stefanini Latam and the law firm LBCA (4 each). Grupo Boticário stands out among large employers: 31% of its 61 jobs were remote or hybrid.&lt;/p&gt;

&lt;p&gt;Hybrid jobs cluster in "analista" (30% of analyst titles are hybrid), "especialista" (33%), "coordenador" (17%), internships (16%) and management (11%); they are below 1% in restaurant, store, warehouse, nursing and driving roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  PcD: what the 76% means
&lt;/h2&gt;

&lt;p&gt;Gupy lets an employer tick "vaga também para PcD" (also open to people with disabilities) on any posting. 7,518 of 9,879 jobs (76.1%) had the flag, and it was stable across the window: 76.1% on Monday, 76.5% Tuesday, 77.9% Wednesday, 73.3% Thursday. Of the 1,571 employers, 1,051 (67%) flagged every job, 216 (14%) flagged none and 304 mixed. McDonald's flagged all 1,513 of its jobs; without it the share is still 71.8%.&lt;/p&gt;

&lt;p&gt;The flag is inclusion, not reservation. Vacancies reserved for people with disabilities (Brazil's quota law makes companies with 100+ employees fill 2–5% of positions with PcD) appear in the title: 292 jobs (3.0%) say "afirmativa para pessoas com deficiência", "exclusiva para PcD" or similar, and 93.5% of those also carry the flag. The most common of them: "Técnico de enfermagem - afirmativa para pessoas com deficiência" (29 postings) and "Enfermeiro - afirmativa para pessoas com deficiência" (16). A further 39 titles name other affirmative groups (women, 50+, Black candidates, diversity).&lt;/p&gt;

&lt;p&gt;The flag share differs by role: 90% of attendant jobs and 87% of pharmacist jobs are flagged, but only 42% of "operador" jobs, 44% of cashier jobs and 44% of "repositor" (shelf stocker) jobs.&lt;/p&gt;

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

&lt;p&gt;Jobs by state (&lt;code&gt;state&lt;/code&gt; as the employer set it; 97.8% of jobs have one). The share of hybrid+remote is of that state's jobs; the "student" column is internships plus apprenticeships.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;Hybrid + remote&lt;/th&gt;
&lt;th&gt;Internship + apprentice&lt;/th&gt;
&lt;th&gt;Open to PcD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;td&gt;4,188&lt;/td&gt;
&lt;td&gt;42.4%&lt;/td&gt;
&lt;td&gt;9.3%&lt;/td&gt;
&lt;td&gt;7.3%&lt;/td&gt;
&lt;td&gt;71.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rio de Janeiro&lt;/td&gt;
&lt;td&gt;826&lt;/td&gt;
&lt;td&gt;8.4%&lt;/td&gt;
&lt;td&gt;8.6%&lt;/td&gt;
&lt;td&gt;6.5%&lt;/td&gt;
&lt;td&gt;79.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minas Gerais&lt;/td&gt;
&lt;td&gt;727&lt;/td&gt;
&lt;td&gt;7.4%&lt;/td&gt;
&lt;td&gt;7.2%&lt;/td&gt;
&lt;td&gt;8.9%&lt;/td&gt;
&lt;td&gt;79.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paraná&lt;/td&gt;
&lt;td&gt;579&lt;/td&gt;
&lt;td&gt;5.9%&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;td&gt;8.8%&lt;/td&gt;
&lt;td&gt;79.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Santa Catarina&lt;/td&gt;
&lt;td&gt;502&lt;/td&gt;
&lt;td&gt;5.1%&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;td&gt;79.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rio Grande do Sul&lt;/td&gt;
&lt;td&gt;474&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;5.5%&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;td&gt;85.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goiás&lt;/td&gt;
&lt;td&gt;308&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;0.3%&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ceará&lt;/td&gt;
&lt;td&gt;290&lt;/td&gt;
&lt;td&gt;2.9%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;3.4%&lt;/td&gt;
&lt;td&gt;84.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bahia&lt;/td&gt;
&lt;td&gt;252&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;78.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mato Grosso&lt;/td&gt;
&lt;td&gt;211&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;3.3%&lt;/td&gt;
&lt;td&gt;79.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distrito Federal&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;td&gt;4.9%&lt;/td&gt;
&lt;td&gt;5.4%&lt;/td&gt;
&lt;td&gt;81.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pernambuco&lt;/td&gt;
&lt;td&gt;190&lt;/td&gt;
&lt;td&gt;1.9%&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;td&gt;4.7%&lt;/td&gt;
&lt;td&gt;75.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No state (remote or not set)&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;td&gt;79.6%&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;td&gt;73.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All 26 states and the Federal District appear, and 898 distinct cities. The 15 busiest cities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Share of all jobs&lt;/th&gt;
&lt;th&gt;Hybrid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;São Paulo (SP)&lt;/td&gt;
&lt;td&gt;1,861&lt;/td&gt;
&lt;td&gt;18.8%&lt;/td&gt;
&lt;td&gt;16.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rio de Janeiro (RJ)&lt;/td&gt;
&lt;td&gt;560&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;td&gt;12.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Belo Horizonte (MG)&lt;/td&gt;
&lt;td&gt;301&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;11.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Curitiba (PR)&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;td&gt;5.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Campinas (SP)&lt;/td&gt;
&lt;td&gt;214&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;td&gt;6.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fortaleza (CE)&lt;/td&gt;
&lt;td&gt;202&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;5.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brasília (DF)&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;td&gt;5.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Porto Alegre (RS)&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;td&gt;9.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goiânia (GO)&lt;/td&gt;
&lt;td&gt;144&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sorocaba (SP)&lt;/td&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;td&gt;1.3%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Florianópolis (SC)&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;1.3%&lt;/td&gt;
&lt;td&gt;6.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guarulhos (SP)&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recife (PE)&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;5.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ribeirão Preto (SP)&lt;/td&gt;
&lt;td&gt;117&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salvador (BA)&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Remote jobs have no city, so the remote column would be 0% everywhere; hybrid is where cities differ. Nearly half of all hybrid jobs (301 of 662) are in the city of São Paulo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who posts: 1,571 employers, one of them 15%
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Employer (Gupy career page)&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Remote + hybrid&lt;/th&gt;
&lt;th&gt;CLT&lt;/th&gt;
&lt;th&gt;Open to PcD&lt;/th&gt;
&lt;th&gt;Main state&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;McDonald's Restaurante (Arcos Dorados)&lt;/td&gt;
&lt;td&gt;1,513&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;94.8%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPA (Pão de Açúcar, Extra)&lt;/td&gt;
&lt;td&gt;317&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;99.1%&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assaí Atacadista&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;97.2%&lt;/td&gt;
&lt;td&gt;10.2%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localiza&amp;amp;Co&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;td&gt;92.9%&lt;/td&gt;
&lt;td&gt;56.0%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sicredi&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;3.5%&lt;/td&gt;
&lt;td&gt;78.8%&lt;/td&gt;
&lt;td&gt;96.5%&lt;/td&gt;
&lt;td&gt;Paraná&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seconci-SP&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;76.2%&lt;/td&gt;
&lt;td&gt;98.1%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;58.6%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solar Coca-Cola&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;td&gt;80.9%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;Maranhão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FARM&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;41.2%&lt;/td&gt;
&lt;td&gt;98.8%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Petz&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rede D'Or&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;1.4%&lt;/td&gt;
&lt;td&gt;95.9%&lt;/td&gt;
&lt;td&gt;98.6%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grupo Boticário&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;31.1%&lt;/td&gt;
&lt;td&gt;95.1%&lt;/td&gt;
&lt;td&gt;86.9%&lt;/td&gt;
&lt;td&gt;Paraná&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vivara Lojas&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;75.9%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Movida Aluguel de Carros&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;94.8%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lojas Renner&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;98.2%&lt;/td&gt;
&lt;td&gt;70.9%&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GPA also runs a separate career page for interns and apprentices (52 more jobs). The top ten employers posted 28.3% of the jobs and the top fifty 44.3%; the median employer posted 2 jobs. Retail, restaurants, car rental, health and banking cooperatives dominate; the first tech employer by volume is Stefanini (Latam 12 + Group 10 tech-title jobs), then Hitss Brasil (9), Porto and Montreal (8 each).&lt;/p&gt;

&lt;p&gt;A consequence for anyone counting "jobs in Brazil" from Gupy: one restaurant chain's hiring calendar moves the daily total by hundreds. Count distinct employers, or exclude the top career pages, before comparing days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roles
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title family&lt;/th&gt;
&lt;th&gt;Jobs&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;Remote&lt;/th&gt;
&lt;th&gt;Hybrid&lt;/th&gt;
&lt;th&gt;Open to PcD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Atendente / atendimento (attendants, customer service)&lt;/td&gt;
&lt;td&gt;2,082&lt;/td&gt;
&lt;td&gt;21.1%&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;89.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendedor / vendas / comercial (sales)&lt;/td&gt;
&lt;td&gt;1,025&lt;/td&gt;
&lt;td&gt;10.4%&lt;/td&gt;
&lt;td&gt;1.0%&lt;/td&gt;
&lt;td&gt;3.7%&lt;/td&gt;
&lt;td&gt;77.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analista (analyst)&lt;/td&gt;
&lt;td&gt;910&lt;/td&gt;
&lt;td&gt;9.2%&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;td&gt;29.9%&lt;/td&gt;
&lt;td&gt;81.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operador (operator, incl. store and cashier operators)&lt;/td&gt;
&lt;td&gt;847&lt;/td&gt;
&lt;td&gt;8.6%&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;41.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auxiliar (assistant/helper)&lt;/td&gt;
&lt;td&gt;773&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;td&gt;73.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assistente&lt;/td&gt;
&lt;td&gt;577&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;74.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Técnico&lt;/td&gt;
&lt;td&gt;556&lt;/td&gt;
&lt;td&gt;5.6%&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;79.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprendiz&lt;/td&gt;
&lt;td&gt;426&lt;/td&gt;
&lt;td&gt;4.3%&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;69.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estagiário / estágio&lt;/td&gt;
&lt;td&gt;325&lt;/td&gt;
&lt;td&gt;3.3%&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;td&gt;15.7%&lt;/td&gt;
&lt;td&gt;73.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enfermagem (nurses, nursing technicians)&lt;/td&gt;
&lt;td&gt;294&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;83.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gerente&lt;/td&gt;
&lt;td&gt;226&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;td&gt;11.1%&lt;/td&gt;
&lt;td&gt;78.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caixa (cashier)&lt;/td&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;44.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Farmacêutico&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;87.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supervisor&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;72.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordenador&lt;/td&gt;
&lt;td&gt;145&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;1.4%&lt;/td&gt;
&lt;td&gt;16.6%&lt;/td&gt;
&lt;td&gt;82.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Especialista&lt;/td&gt;
&lt;td&gt;144&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;td&gt;32.6%&lt;/td&gt;
&lt;td&gt;85.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motorista (driver)&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;1.3%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;75.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dados / data&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;td&gt;21.3%&lt;/td&gt;
&lt;td&gt;32.0%&lt;/td&gt;
&lt;td&gt;86.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engenheiro / engineer&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;20.0%&lt;/td&gt;
&lt;td&gt;21.5%&lt;/td&gt;
&lt;td&gt;81.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desenvolvedor / developer / software&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;0.6%&lt;/td&gt;
&lt;td&gt;47.5%&lt;/td&gt;
&lt;td&gt;32.2%&lt;/td&gt;
&lt;td&gt;83.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most repeated exact titles were "Operador(a) de loja" (52), "Atendente de restaurante" with a restaurant address in brackets (McDonald's posts one per restaurant: Prado Velho in Curitiba 33, Bela Vista in São Paulo 28, Santo Amaro 24, Agronômica in Florianópolis 23, ...), "Operador(a) de caixa" (19), "Motorista de carros leve" (19), "Assistente administrativo" (18) and "Aprendiz" (18). 7,599 distinct titles after stripping requisition codes.&lt;/p&gt;

&lt;p&gt;Tech is a thin slice. 264 jobs (2.7%) had a tech title; 102 of them in São Paulo state and 76 without a state (remote). Their workplace split was 24.6% remote, 31.4% hybrid, 43.9% on-site, and 22 of the 264 were PJ. Top tech titles were senior data engineer, .NET junior programmer, senior data scientist, full-stack developer (pleno) and data analyst. If you want Brazilian tech jobs, Gupy is the long tail; if you want Brazilian frontline hiring at scale, it is the main source.&lt;/p&gt;

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

&lt;p&gt;Every job has a description (median 2,184 characters, 10th–90th percentile 1,300–4,060), written by the employer. 99.9% are in Portuguese (12 were mostly English).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benefits:&lt;/strong&gt; 71.5% mention a health plan (plano de saúde, assistência médica), 67.2% transport vouchers (vale-transporte), 62.7% a gym benefit (Gympass/Wellhub or TotalPass), 52.2% meal vouchers (VR/VA).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt; 50.6% mention ensino médio (secondary school), 25.2% ensino superior or graduação, 6.1% English.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay:&lt;/strong&gt; 9.2% mention an R$ amount; the portal has no salary field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract words:&lt;/strong&gt; only 2.5% of descriptions say "CLT" and 1.3% "PJ"; the structured &lt;code&gt;jobType&lt;/code&gt; field is where that information lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadlines:&lt;/strong&gt; every job has an application deadline. The median is 58 days after posting, and 37.6% of jobs sit at exactly 59 days, which looks like an employer-side default that few change. Treat the deadline as a listing expiry, not a hiring timeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Gupy jobs as JSON, CSV or Excel
&lt;/h2&gt;

&lt;p&gt;Gupy has no public job-search API. The &lt;a href="https://apify.com/data_daemon/gupy-jobs-scraper" rel="noopener noreferrer"&gt;Gupy Jobs Scraper&lt;/a&gt; reads the JSON page data that portal.gupy.io's own search loads (Gupy's robots.txt allows the portal) and returns one row per job: id, title, company and career page, city and state, workplace type, vacancy type, PcD flag, posting date, deadline and the full description. Keywords, states and cities are applied server-side by Gupy; everything else is filtered after download. It needs no login, API key or proxy, costs $0.0008 per job plus $0.001 per run, and the 9,879 rows behind this article took 308 seconds.&lt;/p&gt;

&lt;p&gt;One HTTP call for every job mentioning Python posted in the last week (3 rows on 29 October; the portal's window was 3.3 days, so "last 7 days" reaches only as far as the portal lists):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~gupy-jobs-scraper/run-sync-get-dataset-items?timeout=120"&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 &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&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;'{"searchTerms": ["python"], "postedWithinDays": 7, "maxResultsPerSearch": 20}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A row looks like this (description trimmed):&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12789861&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Python Data Science | Mid/Senior (Remote)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://compass.gupy.io/job/eyJqb2JJZCI6MTI3ODk4NjEsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=?jobBoardSource=gupy_portal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Compass UOL"&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://compass.gupy.io/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"careerPage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"effective"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workplaceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isRemote"&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;"city"&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;"state"&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;"locationText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"acceptsPwd"&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;"postedAt"&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-27T15:12:29.310Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applicationDeadline"&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-12-26T00:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".Responsabilidades e atribuiçõesDesenvolver e implementar soluções de Pesquisa Operacional com foco em otimização matemática ..."&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;Tip for Windows users: &lt;code&gt;curl.exe&lt;/code&gt; re-encodes non-ASCII characters in &lt;code&gt;-d&lt;/code&gt; strings, so a state such as &lt;code&gt;São Paulo&lt;/code&gt; arrives mangled and matches nothing. Put the JSON body in a UTF-8 file and send &lt;code&gt;-d @input.json&lt;/code&gt;, or use the Python client below.&lt;/p&gt;

&lt;p&gt;To reproduce the headline numbers, pull the whole portal and group with pandas (about $8 at the list price, five minutes):&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/gupy-jobs-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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResultsPerSearch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;# no keyword, no cap: every job the portal lists, newest first
&lt;/span&gt;    &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;posted&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="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_datetime&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;postedAt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tz_convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;America/Sao_Paulo&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="nf"&gt;len&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;jobs from&lt;/span&gt;&lt;span class="sh"&gt;"&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;posted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&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;posted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;max&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;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;workplaceType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;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;jobType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open to PcD:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&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;acceptsPwd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;3&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;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;state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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;df&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="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;posted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;9879 jobs from 2026-10-26 10:06:13.602000-03:00 to 2026-10-29 16:47:44.936000-03:00
workplaceType
on-site    0.918
hybrid     0.067
remote     0.015
jobType
effective      8441
apprentice      369
temporary       349
internship      297
talent_pool     153
open to PcD: 0.761
state
São Paulo         4188
Rio de Janeiro     826
Minas Gerais       727
Paraná             579
Santa Catarina     502
posted
2026-10-26    2243
2026-10-27    2692
2026-10-28    2793
2026-10-29    2151
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a daily feed, set &lt;code&gt;postedWithinDays: 1&lt;/code&gt;, &lt;code&gt;maxResultsPerSearch: 0&lt;/code&gt; and &lt;code&gt;onlyNewSinceLastRun: true&lt;/code&gt; on a scheduled task: each run then returns, and charges for, only jobs you have not received before (about 2,700 a day, about $2.20). Ready-made inputs, one click each:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/gupy-jobs-scraper/examples/remote-jobs-brazil-gupy" rel="noopener noreferrer"&gt;Remote jobs in Brazil on Gupy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/gupy-jobs-scraper/examples/data-analyst-jobs-sao-paulo-gupy" rel="noopener noreferrer"&gt;Data analyst jobs in São Paulo on Gupy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/gupy-jobs-scraper&lt;/code&gt; in Claude, ChatGPT or Cursor and ask "quais vagas remotas de dados a Gupy publicou esta semana?".&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The portal lists only its newest 10,000 jobs. On a weekday that is about 3.5 days; nothing older is reachable, including through keyword search (the Python search above returned nothing older than the full list's oldest job). For history, run a daily only-new feed and keep the datasets.&lt;/li&gt;
&lt;li&gt;Four partial-to-full weekdays in one week. Weekend volumes, seasonality and the December hiring dip are not in this data.&lt;/li&gt;
&lt;li&gt;Gupy is one ATS. Employers on other systems (Vagas.com, Catho, InfoJobs, Workday, LinkedIn-only postings) are not here, and public-sector hiring is mostly absent.&lt;/li&gt;
&lt;li&gt;Every attribute is self-declared by the employer in Gupy's publishing form. The PcD flag in particular measures what employers tick, not accessibility in practice.&lt;/li&gt;
&lt;li&gt;Title families are keyword matches; "operador" includes store, cashier, warehouse and machine operators.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Does Gupy have a public API?&lt;/strong&gt;&lt;br&gt;
Not for job search. Gupy publishes an API for its customers' ATS integrations, not for reading the portal's job listings. The portal page loads its listings from a JSON route, which is what the Actor above reads; it returns the same rows as a REST endpoint (&lt;code&gt;POST https://api.apify.com/v2/acts/data_daemon~gupy-jobs-scraper/run-sync-get-dataset-items&lt;/code&gt;) with the Apify client libraries, n8n, Make, Zapier and MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many jobs are posted on Gupy per day?&lt;/strong&gt;&lt;br&gt;
About 2,700 on a weekday in late October 2026: 2,692 on Tuesday 27 October and 2,793 on Wednesday 28 October, and 2,701 in the 24 hours to 29 October 16:47 Brasília time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What share of Gupy jobs are remote?&lt;/strong&gt;&lt;br&gt;
1.5% remote and 6.7% hybrid of the 9,879 jobs listed on 29 October 2026. Among tech titles, 25% remote and 31% hybrid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the PcD flag on a Gupy job mean?&lt;/strong&gt;&lt;br&gt;
The employer marked the vacancy as also open to people with disabilities ("vaga também para PcD"). 76% of jobs carried it. Vacancies reserved for PcD say so in the title (3.0% of jobs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which cities have the most Gupy jobs?&lt;/strong&gt;&lt;br&gt;
São Paulo (1,861, 18.8%), Rio de Janeiro (560), Belo Horizonte (301), Curitiba (280), Campinas (214), Fortaleza (202), Brasília (180) and Porto Alegre (177), out of 898 cities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Gupy show salaries?&lt;/strong&gt;&lt;br&gt;
No. There is no salary field on the portal; 9.2% of descriptions mention an R$ amount in the text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I download Gupy jobs to Excel or Google Sheets?&lt;/strong&gt;&lt;br&gt;
Yes. Every run of the Actor is a dataset you can download as CSV, Excel, JSON or XML, or append to a Google Sheet from the task's Integrations tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes (PT-BR)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A Gupy tem API pública de vagas?&lt;/strong&gt;&lt;br&gt;
Não para busca de vagas. A API da Gupy é para integrações de clientes do ATS. O portal carrega as vagas de uma rota JSON, que é o que o &lt;a href="https://apify.com/data_daemon/gupy-jobs-scraper" rel="noopener noreferrer"&gt;Gupy Jobs Scraper&lt;/a&gt; lê, devolvendo as vagas como JSON, CSV ou Excel, sem login nem proxy, a US$ 0,0008 por vaga.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quantas vagas são publicadas na Gupy por dia?&lt;/strong&gt;&lt;br&gt;
Cerca de 2.700 por dia útil no fim de outubro de 2026 (2.692 na terça 27/10 e 2.793 na quarta 28/10, horário de Brasília).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual a proporção de vagas remotas na Gupy?&lt;/strong&gt;&lt;br&gt;
1,5% remotas e 6,7% híbridas entre as 9.879 vagas listadas em 29/10/2026. Nas vagas de tecnologia, 25% remotas e 31% híbridas; nas vagas de desenvolvedor, 47% remotas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que significa "vaga também para PcD" na Gupy?&lt;/strong&gt;&lt;br&gt;
Que o empregador marcou a vaga como aberta a pessoas com deficiência. 76% das vagas tinham a marcação; vagas exclusivas ou afirmativas para PcD aparecem no título (3,0% das vagas).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLT ou PJ: qual predomina na Gupy?&lt;/strong&gt;&lt;br&gt;
CLT: 85,4% das vagas são efetivas, 3,7% jovem aprendiz, 3,5% temporárias, 3,0% estágio e 1,2% PJ. Entre as vagas remotas, PJ sobe para 11%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quais cidades têm mais vagas na Gupy?&lt;/strong&gt;&lt;br&gt;
São Paulo (1.861 vagas, 18,8%), Rio de Janeiro (560), Belo Horizonte (301), Curitiba (280), Campinas (214), Fortaleza (202), Brasília (180) e Porto Alegre (177), entre 898 cidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Gupy mostra salário?&lt;/strong&gt;&lt;br&gt;
Não. O portal não tem campo de salário; 9,2% das descrições citam um valor em R$.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como exportar as vagas da Gupy para Excel ou Google Sheets?&lt;/strong&gt;&lt;br&gt;
Cada execução do Actor gera um dataset para baixar em CSV, Excel, JSON ou XML, ou para enviar a uma planilha do Google pela aba Integrations da task.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are from the Gupy portal as read on 29 October 2026, 19:48–19:53 UTC, and describe what employers published in that window, not Brazil's whole labour market. Data: portal.gupy.io, via the Gupy Jobs Scraper.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>brazil</category>
      <category>braziliandevs</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Dubai off-plan vs ready prices per sqm by area: what 11,027 registered DLD sales in October 2026 show</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:33:01 +0000</pubDate>
      <link>https://dev.to/datadaemon/dubai-off-plan-vs-ready-prices-per-sqm-by-area-what-11027-registered-dld-sales-in-october-2026-4f1p</link>
      <guid>https://dev.to/datadaemon/dubai-off-plan-vs-ready-prices-per-sqm-by-area-what-11027-registered-dld-sales-in-october-2026-4f1p</guid>
      <description>&lt;p&gt;Dubai publishes every registered property transaction as open data: sales, off-plan sales, mortgages and gifts, with the price, the size and the area. Portals show asking prices; this register shows what buyers actually paid.&lt;/p&gt;

&lt;p&gt;I pulled &lt;strong&gt;every transaction the Dubai Land Department (DLD) registered from 1 to 29 October 2026: 16,108 rows after cleaning, of which 11,027 are sales&lt;/strong&gt;, and grouped them by off-plan vs ready, by area and by bedroom count. Data as of 29 October 2026, 15:26 UTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;58% of Dubai property sales in October 2026 were off-plan&lt;/strong&gt;: 6,420 of 11,027 registered sales. Ready sales were 4,607.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;By value, ready property still leads&lt;/strong&gt;: AED 19.4 billion of ready sales against AED 12.5 billion off-plan, out of AED 31.9 billion in total. The median ready sale (AED 1.83 million) is larger than the median off-plan sale (AED 1.25 million) because ready sales include land plots and whole buildings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-plan flats cost about 25% more per square metre than ready flats&lt;/strong&gt;: median AED 19,303 per sqm against AED 15,434, across 8,639 residential unit sales. The median off-plan unit is also smaller: 68 sqm against 81 sqm, so the median ticket is almost the same (AED 1.18 million vs 1.20 million).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The gap depends on the area&lt;/strong&gt;: +7% in Majan, +28% in Jumeirah Village Circle, +43% in Business Bay, +83% in Dubai Land Residence Complex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One month is 16,000 rows&lt;/strong&gt;: 11,027 sales, 4,123 mortgages (AED 11.5 billion) and 958 gifts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the numbers were measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; the DLD open-data transactions service, fetched with the &lt;a href="https://apify.com/data_daemon/dubai-property-transactions" rel="noopener noreferrer"&gt;Dubai DLD Property Transactions&lt;/a&gt; Actor on Apify (run &lt;code&gt;T6ufNxkMMy6eAuIwE&lt;/code&gt;, input &lt;code&gt;fromDate 2026-10-01&lt;/code&gt;, &lt;code&gt;toDate 2026-10-29&lt;/code&gt;, all transaction groups, 16,508 rows, 202 seconds).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning:&lt;/strong&gt; 267 rows were exact duplicates (all &lt;code&gt;Portfolio Mortgage Registration&lt;/code&gt;, one loan secured on many units, which DLD lists once per unit with identical values). 132 rows carried a 30 September date (DLD filters on the registration timestamp, not the calendar date), so the study keeps &lt;code&gt;transactionDate&lt;/code&gt; 1 to 29 October. One 70.74 sqm flat in Marina Pinnacle registered at AED 919,789,428 (AED 13 million per sqm) is excluded as a data-entry error. That leaves 16,108 rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-plan vs ready:&lt;/strong&gt; DLD's own &lt;code&gt;isOffplan&lt;/code&gt; flag. In practice off-plan sales are the &lt;code&gt;Sell - Pre registration&lt;/code&gt; procedure (6,191 rows) and &lt;code&gt;Development Registration Pre-Registration&lt;/code&gt; (223); ready sales are &lt;code&gt;Sale&lt;/code&gt; (3,061), &lt;code&gt;Delayed Sell&lt;/code&gt; (1,379) and a few smaller procedures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price per sqm:&lt;/strong&gt; transaction value divided by DLD's actual area, for residential units (flats, hotel apartments) of at least 20 sqm. Medians, not averages, because a handful of penthouses and whole-floor deals move an average by thousands of dirhams.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transaction group&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Value (AED billion)&lt;/th&gt;
&lt;th&gt;Median value (AED)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sales, off-plan&lt;/td&gt;
&lt;td&gt;6,420&lt;/td&gt;
&lt;td&gt;12.5&lt;/td&gt;
&lt;td&gt;1,250,152&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales, ready&lt;/td&gt;
&lt;td&gt;4,607&lt;/td&gt;
&lt;td&gt;19.4&lt;/td&gt;
&lt;td&gt;1,826,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mortgages&lt;/td&gt;
&lt;td&gt;4,123&lt;/td&gt;
&lt;td&gt;11.5&lt;/td&gt;
&lt;td&gt;1,297,039&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gifts&lt;/td&gt;
&lt;td&gt;958&lt;/td&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Of the 11,027 sales, 8,679 were units, 1,408 land plots (all ready) and 940 buildings (655 off-plan). 96% were freehold, 98% residential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price per square metre by bedroom count
&lt;/h2&gt;

&lt;p&gt;Residential unit sales, 1 to 29 October 2026, median values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rooms&lt;/th&gt;
&lt;th&gt;Off-plan sales&lt;/th&gt;
&lt;th&gt;Off-plan AED/sqm&lt;/th&gt;
&lt;th&gt;Off-plan size&lt;/th&gt;
&lt;th&gt;Off-plan price&lt;/th&gt;
&lt;th&gt;Ready sales&lt;/th&gt;
&lt;th&gt;Ready AED/sqm&lt;/th&gt;
&lt;th&gt;Ready size&lt;/th&gt;
&lt;th&gt;Ready price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Studio&lt;/td&gt;
&lt;td&gt;1,931&lt;/td&gt;
&lt;td&gt;19,212&lt;/td&gt;
&lt;td&gt;36 sqm&lt;/td&gt;
&lt;td&gt;700,000&lt;/td&gt;
&lt;td&gt;612&lt;/td&gt;
&lt;td&gt;14,111&lt;/td&gt;
&lt;td&gt;41 sqm&lt;/td&gt;
&lt;td&gt;550,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 B/R&lt;/td&gt;
&lt;td&gt;2,180&lt;/td&gt;
&lt;td&gt;17,853&lt;/td&gt;
&lt;td&gt;69 sqm&lt;/td&gt;
&lt;td&gt;1,211,468&lt;/td&gt;
&lt;td&gt;1,132&lt;/td&gt;
&lt;td&gt;14,735&lt;/td&gt;
&lt;td&gt;75 sqm&lt;/td&gt;
&lt;td&gt;1,052,333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 B/R&lt;/td&gt;
&lt;td&gt;1,057&lt;/td&gt;
&lt;td&gt;20,568&lt;/td&gt;
&lt;td&gt;112 sqm&lt;/td&gt;
&lt;td&gt;2,222,439&lt;/td&gt;
&lt;td&gt;741&lt;/td&gt;
&lt;td&gt;16,253&lt;/td&gt;
&lt;td&gt;118 sqm&lt;/td&gt;
&lt;td&gt;1,950,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 B/R&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;19,398&lt;/td&gt;
&lt;td&gt;169 sqm&lt;/td&gt;
&lt;td&gt;3,432,847&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;td&gt;20,957&lt;/td&gt;
&lt;td&gt;177 sqm&lt;/td&gt;
&lt;td&gt;3,800,414&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Studios and one-bedrooms are 71% of off-plan unit sales. Three-bedroom units are the one segment where ready stock is dearer per sqm than off-plan: the ready three-bedroom sales in October clustered in Palm Jumeirah (20), Downtown (18), Business Bay (18), Dubai Marina (16) and Dubai Creek Harbour (15), while the off-plan ones were led by Dubai Islands (Palm Deira, 20), Wadi Al Safa 3 (12) and Dubai Land Residence Complex (11).&lt;/p&gt;

&lt;h2&gt;
  
  
  Price per square metre by area
&lt;/h2&gt;

&lt;p&gt;The 20 areas with the most residential unit sales. &lt;code&gt;n&lt;/code&gt; is the number of sales behind each median; treat anything under 30 as indicative.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area (DLD name)&lt;/th&gt;
&lt;th&gt;Unit sales&lt;/th&gt;
&lt;th&gt;Off-plan share&lt;/th&gt;
&lt;th&gt;Off-plan median AED/sqm (n)&lt;/th&gt;
&lt;th&gt;Ready median AED/sqm (n)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jumeirah Village Circle&lt;/td&gt;
&lt;td&gt;754&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;17,380 (394)&lt;/td&gt;
&lt;td&gt;13,573 (360)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Madinat Al Mataar (Dubai South, Azizi Venice)&lt;/td&gt;
&lt;td&gt;572&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;18,370 (572)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Bay&lt;/td&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;29,375 (113)&lt;/td&gt;
&lt;td&gt;20,550 (288)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai Land Residence Complex&lt;/td&gt;
&lt;td&gt;362&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;16,105 (315)&lt;/td&gt;
&lt;td&gt;8,778 (47)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Majan&lt;/td&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;15,277 (253)&lt;/td&gt;
&lt;td&gt;14,323 (52)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jabal Ali Industrial Second&lt;/td&gt;
&lt;td&gt;298&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;19,619 (298)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Hebiah Fifth (Damac Lagoons)&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;19,385 (260)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arjan&lt;/td&gt;
&lt;td&gt;242&lt;/td&gt;
&lt;td&gt;57%&lt;/td&gt;
&lt;td&gt;18,029 (139)&lt;/td&gt;
&lt;td&gt;14,818 (103)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Hebiah First&lt;/td&gt;
&lt;td&gt;207&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;16,172 (207)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jumeirah Village Triangle&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;td&gt;18,337 (151)&lt;/td&gt;
&lt;td&gt;14,095 (48)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;City of Arabia&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;17,837 (184)&lt;/td&gt;
&lt;td&gt;11,979 (10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai Sports City&lt;/td&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;17,453 (94)&lt;/td&gt;
&lt;td&gt;9,954 (78)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Down Town Jabal Ali&lt;/td&gt;
&lt;td&gt;169&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;19,406 (163)&lt;/td&gt;
&lt;td&gt;12,911 (6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai Production City&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;16,469 (94)&lt;/td&gt;
&lt;td&gt;10,697 (68)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burj Khalifa (Downtown)&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;38,021 (22)&lt;/td&gt;
&lt;td&gt;27,680 (138)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;International City Phase 1&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;13,778 (19)&lt;/td&gt;
&lt;td&gt;7,090 (131)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Palm Deira (Dubai Islands)&lt;/td&gt;
&lt;td&gt;142&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;27,477 (132)&lt;/td&gt;
&lt;td&gt;23,896 (10)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai South&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;td&gt;14,051 (74)&lt;/td&gt;
&lt;td&gt;10,725 (66)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai Marina&lt;/td&gt;
&lt;td&gt;134&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;td&gt;29,484 (15)&lt;/td&gt;
&lt;td&gt;17,762 (119)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Al Khairan First (Dubai Creek Harbour)&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;27,299 (132)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things stand out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Volume is in the new districts.&lt;/strong&gt; Six of the top ten areas were 83–100% off-plan, and the ten busiest areas took 42% of all unit sales. Single projects drive it: Raw District 2 by Imtiaz (246 sales), Binghatti Skyterraces (201) and Damac Lagoons Lagoon Views 13 (163) each sold more units in October than the whole of Dubai Marina (134); Azizi Venice 7 (131) came close.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The established areas are mostly resale.&lt;/strong&gt; Dubai Marina (11% off-plan), International City (13%), Downtown (14%) and Business Bay (28%) are where ready stock trades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The off-plan premium is widest where ready stock is old.&lt;/strong&gt; In every one of the 13 areas with at least 30 sales on each side, the off-plan median was above the ready median: Majan +7%, Arjan +22%, Al Furjan +25%, JVC +28%, JVT +30%, Dubai South +31%, Damac Hills +37%, Business Bay +43%, Dubai Production City +54%, Jumeirah Lakes Towers +57%, Dubai Sports City +75%, Dubai Land Residence Complex +83%, Motor City +87%. The clearest exception just below the threshold was Meydan One (29 off-plan, 93 ready sales), where ready stock sold at AED 21,567 per sqm against 15,497 off-plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most expensive areas by median price per sqm (at least 30 unit sales) were Tecom Site A (AED 43,089), Business Park (37,220), Palm Jumeirah (35,485), Dubai Maritime City (34,566) and Al Wasl (33,134). The cheapest were International City Phase 1 (7,326), Discovery Gardens (9,552), Dubai Investment Park First (9,577), Liwan (10,993) and Silicon Oasis (11,276).&lt;/p&gt;

&lt;h2&gt;
  
  
  What a month of DLD data looks like
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekdays only.&lt;/strong&gt; 97% of October's rows carry a Monday-to-Friday date; Saturday had 369 rows and Sunday 79 across four weekends. A daily feed that runs on a weekend returns almost nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Around 540 to 930 rows per working day&lt;/strong&gt;, with a 1,309-row spike on 2 October, 557 of them &lt;code&gt;Delayed Sell&lt;/code&gt; registrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ticket sizes:&lt;/strong&gt; 30% of sales were under AED 1 million, 32% between 1 and 2 million, 27% between 2 and 5 million, 7% between 5 and 10 million, and 393 sales (4%) were AED 10 million or more. The largest was an AED 600 million land plot in Barsha Heights on 29 October; three plots in Al Rowaiyah First sold for AED 126–215 million each on 22 October.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mortgages:&lt;/strong&gt; 4,123 registrations and modifications, median AED 1.30 million; 2,809 were plain &lt;code&gt;Mortgage Registration&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field coverage&lt;/strong&gt; (sales, off-plan / ready): project 100% / 80%, rooms 95% / 68%, nearest metro 36% / 56%, nearest mall 35% / 55%, parcel id 36% / 35%, master project 1% / 0%. Group on &lt;code&gt;area&lt;/code&gt; when you need every row to fall into a bucket.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get the Dubai Land Department transaction data as JSON
&lt;/h2&gt;

&lt;p&gt;DLD publishes the register through its open-data portal and the Dubai Pulse platform; there is no public REST API with a documented key. The &lt;a href="https://apify.com/data_daemon/dubai-property-transactions" rel="noopener noreferrer"&gt;Dubai DLD Property Transactions&lt;/a&gt; Actor reads that service and returns JSON, CSV or Excel with numeric AED values, ISO dates, boolean &lt;code&gt;offPlan&lt;/code&gt; and &lt;code&gt;freehold&lt;/code&gt; flags and &lt;code&gt;pricePerSqmAed&lt;/code&gt; precomputed. It needs no login, API key or proxy and costs $1 per 1,000 transactions; the 16,508 rows behind this article cost about $16.50 and took three and a half minutes.&lt;/p&gt;

&lt;p&gt;Last 7 days of off-plan sales in one HTTP call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/data_daemon~dubai-property-transactions/run-sync-get-dataset-items?timeout=300"&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 &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&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;'{"daysBack": 7, "transactionGroup": "sales", "offPlan": "offplan", "maxItems": 5000}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row looks like this (trimmed):&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;"transactionNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"11-29816-2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transactionDate"&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-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;"group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"procedure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Residential"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offPlan"&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;"freehold"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BURJ KHALIFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BURJ KHALIFA TOWERS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"propertyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"propertySubType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Flat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rooms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 B/R"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actualAreaSqm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;146.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transactionValueAed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6175000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pricePerSqmAed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42121.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nearestMetro"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Buj Khalifa Dubai Mall Metro Station"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nearestMall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dubai Mall"&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;To reproduce the area table, pull October's sales and group with pandas:&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&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&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;data_daemon/dubai-property-transactions&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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fromDate&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-10-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;toDate&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-10-29&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;transactionGroup&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;sales&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;0&lt;/span&gt;&lt;span class="p"&gt;}&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;list_items&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;items&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;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&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;columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scrapedAt&lt;/span&gt;&lt;span class="sh"&gt;"&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;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;transactionDate&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;gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;units&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;propertyType&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;Unit&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;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;usage&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;Residential&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;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;pricePerSqmAed&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;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&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;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;actualAreaSqm&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;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;units&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;area&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;offPlan&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;pricePerSqmAed&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="nf"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;median_aed_sqm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;median&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="nf"&gt;unstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;offPlan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&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="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&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;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&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="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                              sales        median_aed_sqm           total
offPlan                       False   True          False     True
area
JUMEIRAH VILLAGE CIRCLE       360.0  394.0        13573.0  17380.0  754.0
Madinat Al Mataar               NaN  572.0            NaN  18370.0  572.0
BUSINESS BAY                  288.0  113.0        20550.0  29375.0  401.0
DUBAI LAND RESIDENCE COMPLEX   47.0  315.0         8778.0  16105.0  362.0
MAJAN                          52.0  253.0        14323.0  15277.0  305.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ready-made inputs, each a one-click run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-property-transactions/examples/dubai-sales-last-7-days" rel="noopener noreferrer"&gt;Dubai property sales in the last 7 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-property-transactions/examples/dubai-off-plan-transactions" rel="noopener noreferrer"&gt;Dubai off-plan transactions this week&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-property-transactions/examples/dubai-ready-property-sales-last-7-days" rel="noopener noreferrer"&gt;Dubai ready (secondary) property sales, last 7 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/dubai-property-transactions/examples/dubai-mortgages-registered" rel="noopener noreferrer"&gt;Dubai mortgages registered this week&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an AI assistant, add the MCP connector &lt;code&gt;https://mcp.apify.com/?tools=data_daemon/dubai-property-transactions&lt;/code&gt; in Claude, ChatGPT or Cursor and ask "what did two-bedroom flats in Business Bay sell for in October?".&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How many Dubai property sales are off-plan?&lt;/strong&gt;&lt;br&gt;
In October 2026, 58% by count (6,420 of 11,027 registered sales from 1 to 29 October) and 39% by value (AED 12.5 billion of 31.9 billion). Residential units alone were 66% off-plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is off-plan cheaper than ready property in Dubai?&lt;/strong&gt;&lt;br&gt;
Per square metre, no: the median off-plan flat registered at AED 19,303 per sqm in October 2026, 25% above the ready median of AED 15,434. Off-plan units are smaller (median 68 sqm vs 81 sqm), so the median price paid was almost the same, AED 1.18 million against 1.20 million. The premium ranged from +7% (Majan) to +87% (Motor City) in the 13 areas with at least 30 sales on each side; Meydan One, just under that threshold, was the one busy area where ready stock sold higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the average price per square metre in Dubai?&lt;/strong&gt;&lt;br&gt;
Across 8,639 residential unit sales in October 2026 the median was AED 18,273 per sqm (about AED 1,700 per sq ft). It ranges from AED 7,326 in International City Phase 1 to AED 43,089 in Tecom Site A, so quote the area, not the city.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a Dubai Land Department API?&lt;/strong&gt;&lt;br&gt;
DLD publishes transactions as open data (the DLD open-data portal and Dubai Pulse), not as a documented public REST API with keys. The Actor above wraps that service: &lt;code&gt;POST https://api.apify.com/v2/acts/data_daemon~dubai-property-transactions/run-sync-get-dataset-items&lt;/code&gt; returns the rows for any date range, and the Apify client libraries, n8n, Make, Zapier and MCP call the same endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often is DLD transaction data updated?&lt;/strong&gt;&lt;br&gt;
Daily on working days. The register has rows for every Monday to Friday; weekends carry a few dozen rows at most. Rows registered late in the day can appear in the next day's pull, so dedupe on the full row when you append daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the data include buyer or seller names?&lt;/strong&gt;&lt;br&gt;
No. The open-data service carries no personal data: transaction number, date, procedure, area, project, property type, rooms, size, value and nearest metro, mall and landmark.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers are from the DLD register as read on 29 October 2026 and will change as late registrations and corrections are added. Nothing here is investment advice. Data: Dubai Land Department open data.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dubai</category>
      <category>realestate</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>Oracle Recruiting Cloud jobs API: the public JSON endpoints behind every Oracle HCM career site (Python guide)</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Wed, 28 Oct 2026 15:26:11 +0000</pubDate>
      <link>https://dev.to/datadaemon/oracle-recruiting-cloud-jobs-api-the-public-json-endpoints-behind-every-oracle-hcm-career-site-5eal</link>
      <guid>https://dev.to/datadaemon/oracle-recruiting-cloud-jobs-api-the-public-json-endpoints-behind-every-oracle-hcm-career-site-5eal</guid>
      <description>&lt;p&gt;If you build a job board, a hiring-signals feed or a talent-intelligence dashboard, you will meet career pages that look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://efds.fa.em5.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1/requisitions
https://ebwh.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001/requisitions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is &lt;strong&gt;Oracle Recruiting Cloud&lt;/strong&gt; (part of Oracle Fusion Cloud HCM). The first one is Ford's global career site, the second Macy's. Banks, hospitals, universities, retailers and governments use the same product. The page is a single-page app, and everything it shows comes from a REST API on the same host. No login, no API key, no browser required.&lt;/p&gt;

&lt;p&gt;This post documents the three endpoints you need, the parameters that matter, and four gotchas that cost me time. All examples were run on 29 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a career-site URL
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://efds.fa.em5.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1/requisitions
        └──── tenant host ────────┘                              └ site ┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;tenant host&lt;/strong&gt; (&lt;code&gt;efds.fa.em5&lt;/code&gt;) identifies the customer's Fusion pod. The four letters are opaque; there is no way to derive them from the company name.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;site number&lt;/strong&gt; (&lt;code&gt;CX_1&lt;/code&gt;, &lt;code&gt;CX_1001&lt;/code&gt;, sometimes just &lt;code&gt;CX&lt;/code&gt;) identifies one career site on that tenant. Large employers run several: Ford has &lt;code&gt;CX_1&lt;/code&gt; (global), &lt;code&gt;CX_1001&lt;/code&gt; (interns), &lt;code&gt;CX_5001&lt;/code&gt; (Model e), &lt;code&gt;CX_6001&lt;/code&gt; and &lt;code&gt;CX_7001&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&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;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(https://[^/]+)/hcmUI/CandidateExperience/[^/]+/sites/([^/?#]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not an Oracle Candidate Experience URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# origin, site number
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint 1: list requisitions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {origin}/hcmRestApi/resources/latest/recruitingCEJobRequisitions
    ?onlyData=true
    &amp;amp;expand=requisitionList.secondaryLocations
    &amp;amp;finder=findReqs;siteNumber=CX_1,limit=25,offset=0,sortBy=POSTING_DATES_DESC
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part is the &lt;code&gt;finder&lt;/code&gt; parameter. It is one string: the finder name (&lt;code&gt;findReqs&lt;/code&gt;), a semicolon, then comma-separated &lt;code&gt;key=value&lt;/code&gt; pairs. Text values are wrapped in double quotes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;finder key&lt;/th&gt;
&lt;th&gt;example&lt;/th&gt;
&lt;th&gt;notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;siteNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CX_1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keyword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"data engineer"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;full-text, quoted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Germany"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;as typed in the site's location box, quoted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;selectedPostingDatesFacet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"7"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;only &lt;code&gt;7&lt;/code&gt; and &lt;code&gt;30&lt;/code&gt; exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;selectedWorkplaceTypesFacet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"ORA_REMOTE"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;also &lt;code&gt;ORA_HYBRID&lt;/code&gt;, &lt;code&gt;ORA_ON_SITE&lt;/code&gt;; separate several with &lt;code&gt;;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;100&lt;/code&gt;, &lt;code&gt;200&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;paging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sortBy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POSTING_DATES_DESC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;newest first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;facetsList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POSTING_DATES;WORKPLACE_TYPES;CATEGORIES;LOCATIONS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ask for facet counts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The response is a single item (&lt;code&gt;items[0]&lt;/code&gt;) holding &lt;code&gt;TotalJobsCount&lt;/code&gt;, the facets, and the jobs in &lt;code&gt;requisitionList&lt;/code&gt;. Each job has &lt;code&gt;Id&lt;/code&gt;, &lt;code&gt;Title&lt;/code&gt;, &lt;code&gt;PostedDate&lt;/code&gt;, &lt;code&gt;PrimaryLocation&lt;/code&gt;, &lt;code&gt;PrimaryLocationCountry&lt;/code&gt;, &lt;code&gt;ShortDescriptionStr&lt;/code&gt;, &lt;code&gt;WorkplaceType&lt;/code&gt;, &lt;code&gt;HotJobFlag&lt;/code&gt; and a few more.&lt;/p&gt;

&lt;h3&gt;
  
  
  The facets are free analytics
&lt;/h3&gt;

&lt;p&gt;Ask for &lt;code&gt;facetsList&lt;/code&gt; with &lt;code&gt;limit=1&lt;/code&gt; and you get a hiring snapshot of an employer in one request. Ford's global site on 29 October:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TotalJobsCount: 915
postingDatesFacet:   less than 7 days 207 · less than 30 days 558 · greater than 30 days 357
workplaceTypesFacet: Hybrid 596 · On-site 290 · Remote 29
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(The 30-day bucket includes the 7-day one.) Macy's (&lt;code&gt;CX_1001&lt;/code&gt; on &lt;code&gt;ebwh.fa.us2&lt;/code&gt;): 5,852 open requisitions, 803 of them posted in the last 7 days. Oracle's own careers site (&lt;code&gt;eeho.fa.us2&lt;/code&gt;, &lt;code&gt;CX_45001&lt;/code&gt;): 2,710 open, of which 1,066 are in &lt;em&gt;Product and Research&lt;/em&gt; and 863 are in Nashville. If you track hiring as a sales or investment signal, polling the facets daily is about as cheap as data gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoint 2: the full job record
&lt;/h2&gt;

&lt;p&gt;The list gives you a short description. Everything else (long description, qualifications, responsibilities, corporate description, hiring manager, number of openings, flex fields, secondary locations, skills) comes from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {origin}/hcmRestApi/resources/latest/recruitingCEJobRequisitionDetails
    ?expand=all
    &amp;amp;onlyData=true
    &amp;amp;finder=ById;Id="349089",siteNumber=CX_45001
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fields worth knowing: &lt;code&gt;ExternalDescriptionStr&lt;/code&gt;, &lt;code&gt;ExternalQualificationsStr&lt;/code&gt;, &lt;code&gt;ExternalResponsibilitiesStr&lt;/code&gt; (all HTML), &lt;code&gt;CorporateDescriptionStr&lt;/code&gt;, &lt;code&gt;Category&lt;/code&gt;, &lt;code&gt;JobFunction&lt;/code&gt;, &lt;code&gt;NumberOfOpenings&lt;/code&gt;, &lt;code&gt;HiringManager&lt;/code&gt;, &lt;code&gt;LegalEmployer&lt;/code&gt;, &lt;code&gt;WorkplaceType&lt;/code&gt;, &lt;code&gt;ExternalPostedStartDate&lt;/code&gt;, &lt;code&gt;requisitionFlexFields&lt;/code&gt; (employer-defined fields such as job type or visa sponsorship), &lt;code&gt;secondaryLocations&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;. Which of them are filled depends on how the employer configured Oracle.&lt;/p&gt;

&lt;p&gt;Quote the &lt;code&gt;Id&lt;/code&gt; and do not quote the site number; that is the form the career site itself sends. A closed or unknown &lt;code&gt;Id&lt;/code&gt; also returns HTTP 200, with an empty &lt;code&gt;items&lt;/code&gt; list, so check for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoint 3: which sites exist on a tenant
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {origin}/hcmRestApi/resources/latest/recruitingCESites?onlyData=true&amp;amp;limit=50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns &lt;code&gt;SiteNumber&lt;/code&gt; and &lt;code&gt;SiteName&lt;/code&gt; for each site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;efds.fa.em5 → CX_1 Ford Global Career Site · CX_1001 Ford Intern · CX_5001 Ford Model-e U.S. · CX_6001 Ford BlueOvalCity/TEVC · CX_7001 Ford Platform Architecture Careers
ebwh.fa.us2 → CX Candidate Experience site · CX_1001 Macy's · CX_1002 Bloomingdale's · CX_4001 bluemercury · CX_2001 Macy's Seasonal · ...
eeug.fa.us6 → CX Diebold Nixdorf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for discovery, but see gotcha 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  A complete script: one site to CSV
&lt;/h2&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;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;UA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/128.0 Safari/537.36&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(https://[^/]+)/hcmUI/CandidateExperience/[^/]+/sites/([^/?#]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not an Oracle Candidate Experience URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'"'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'"'&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_jobs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posted_within&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page_size&lt;/span&gt;&lt;span class="o"&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;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&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;application/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;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;finder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;siteNumber=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;finder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keyword=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;finder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;posted_within&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Oracle only knows the 7 and 30 day buckets
&lt;/span&gt;            &lt;span class="n"&gt;finder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;selectedPostingDatesFacet=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posted_within&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;finder&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;offset=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="si"&gt;}&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;sortBy=POSTING_DATES_DESC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/hcmRestApi/resources/latest/recruitingCEJobRequisitions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;params&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;onlyData&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;true&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;expand&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;requisitionList.secondaryLocations&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;finder&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;findReqs;&lt;/span&gt;&lt;span class="sh"&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;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finder&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requisitionList&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="c1"&gt;# dedupe: new postings shift pages
&lt;/span&gt;                &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;
        &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;page_size&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TotalJobsCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                        &lt;span class="c1"&gt;# be polite
&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;job_detail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/hcmRestApi/resources/latest/recruitingCEJobRequisitionDetails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;params&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;expand&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;all&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;onlyData&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;true&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;finder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ById;Id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,siteNumber=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;headers&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;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&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;application/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;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="k"&gt;if&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;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;rows&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id&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;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Title&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;posted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PostedDate&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="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PrimaryLocation&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/hcmUI/CandidateExperience/en/sites/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/job/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;list_jobs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posted_within&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)]&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;jobs.csv&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;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&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;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&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;fieldnames&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;id&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;title&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;posted&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&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="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; jobs -&amp;gt; jobs.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&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;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;job_detail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&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;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Title&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;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Category&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;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExternalDescriptionStr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&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;chars of description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python oracle_jobs.py "https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_45001/requisitions" python
100 jobs -&amp;gt; jobs.csv
Principal Software Engineer – Backend, Java/Python | Oracle Health | Product Development | 3386 chars of description
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Without &lt;code&gt;expand&lt;/code&gt;, you get counts and no jobs.&lt;/strong&gt; Drop &lt;code&gt;expand=requisitionList...&lt;/code&gt; and the response still returns &lt;code&gt;TotalJobsCount&lt;/code&gt; and facets, but &lt;code&gt;requisitionList&lt;/code&gt; is missing. Easy to misread as "this site has no jobs".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A wrong site number fails silently.&lt;/strong&gt; Ask Ford's tenant for &lt;code&gt;siteNumber=CX_999&lt;/code&gt;, which does not exist, and you get HTTP 200 with the 915 jobs of its default site &lt;code&gt;CX_1&lt;/code&gt;. Macy's tenant answers &lt;code&gt;CX_999&lt;/code&gt; with 7,323 jobs, more than any of its real sites (Macy's 5,852, Bloomingdale's 1,148, bluemercury 323). No error either way. Oracle's own tenant goes further: the retired &lt;code&gt;CX_1&lt;/code&gt;, the live &lt;code&gt;CX_45001&lt;/code&gt;, the non-existent &lt;code&gt;CX_999&lt;/code&gt; and even the word &lt;code&gt;jobsearch&lt;/code&gt; all return the same 2,710 jobs. If you build site numbers from a list or a typo-prone config, you will happily ingest the wrong career site. Always take the site number from the public URL, and sanity-check the result (for example, compare &lt;code&gt;TotalJobsCount&lt;/code&gt; with what the career page shows). Related: &lt;code&gt;recruitingCESites&lt;/code&gt; also lists retired and internal sites (Oracle's tenant lists six, among them "Oracle Modern FOR REFERENCE ONLY", two backups and a "Baseline DO NOT UPDATE"), so do not crawl every site it returns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Posted-date filtering has two buckets.&lt;/strong&gt; &lt;code&gt;selectedPostingDatesFacet&lt;/code&gt; accepts &lt;code&gt;7&lt;/code&gt; and &lt;code&gt;30&lt;/code&gt;. Any other value is ignored without an error: &lt;code&gt;"3"&lt;/code&gt; returns every open job. For "last 3 days", fetch the 7-day bucket sorted by &lt;code&gt;POSTING_DATES_DESC&lt;/code&gt; and stop when &lt;code&gt;PostedDate&lt;/code&gt; is older than your cutoff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Pages shift while you read them.&lt;/strong&gt; Sorting by posting date means a job published mid-crawl pushes everything down by one, and you see a duplicate on the next page. Dedupe by &lt;code&gt;Id&lt;/code&gt;. For large sites, larger pages (100) reduce the window; the UI uses 25, and the tenants I tested accepted 100 and 200.&lt;/p&gt;

&lt;p&gt;Also: the detail endpoint is one request per job, so a 6,000-job site is 6,000 requests. Run them with modest concurrency (I use 5) and back off on 429 and 5xx.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding employers that use Oracle Recruiting Cloud
&lt;/h2&gt;

&lt;p&gt;There is no public directory and the tenant codes are opaque. What works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google: &lt;code&gt;site:oraclecloud.com "CandidateExperience" "company name"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The career link on the employer's own website usually redirects to an &lt;code&gt;*.oraclecloud.com/hcmUI/CandidateExperience/...&lt;/code&gt; URL.&lt;/li&gt;
&lt;li&gt;GitHub code search for &lt;code&gt;hcmUI/CandidateExperience&lt;/code&gt; returns about 13,000 files: job-board and aggregator projects that hard-code tenant URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When not to maintain this yourself
&lt;/h2&gt;

&lt;p&gt;The script above is fine for one employer. It gets tedious when you need dozens of tenants on a schedule, full details with retries, change monitoring, and someone to notice when Oracle ships a release that changes a field.&lt;/p&gt;

&lt;p&gt;That is why I packaged it as the &lt;a href="https://apify.com/data_daemon/oracle-hcm-jobs-scraper?utm_source=devto&amp;amp;utm_campaign=oracle-hcm-api" rel="noopener noreferrer"&gt;Oracle Cloud HCM Jobs Scraper on Apify&lt;/a&gt; (disclosure: I built it). Paste any career-site URL (even a single job URL), optionally a keyword, location, 7/30-day window or workplace type, and it walks every listed site and returns one record per requisition with the detail fields above. It costs $0.002 per job plus $0.002 per full detail record, so a 500-job site with details is $2; from 2 November the details are included in the $0.002 per job (plus $0.001 per run), so the same site costs about $1. It runs on a schedule, exposes a REST endpoint, and works as an MCP tool for AI agents. Ready-made examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/oracle-hcm-jobs-scraper/examples/all-open-jobs-oracle-careers?utm_source=devto&amp;amp;utm_campaign=oracle-hcm-api" rel="noopener noreferrer"&gt;All open jobs on Oracle's career site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/oracle-hcm-jobs-scraper/examples/new-engineering-jobs-last-7-days?utm_source=devto&amp;amp;utm_campaign=oracle-hcm-api" rel="noopener noreferrer"&gt;New engineering jobs posted in the last 7 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/oracle-hcm-jobs-scraper/examples/remote-jobs-oracle-hcm?utm_source=devto&amp;amp;utm_campaign=oracle-hcm-api" rel="noopener noreferrer"&gt;Remote jobs on an Oracle HCM career site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, the endpoints above are what the career site itself uses. Keep request rates low, cache what you can, and respect each employer's terms, especially for fields like hiring-manager names.&lt;/p&gt;

&lt;p&gt;If you run into a tenant that behaves differently, post the host in the comments. I am collecting the edge cases.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Does Oracle Recruiting Cloud have a public jobs API?&lt;/strong&gt;&lt;br&gt;
Yes, in practice. Oracle documents the authenticated Fusion HCM REST API for recruiters, which needs credentials. The candidate-facing career sites use the &lt;code&gt;recruitingCEJobRequisitions&lt;/code&gt;, &lt;code&gt;recruitingCEJobRequisitionDetails&lt;/code&gt; and &lt;code&gt;recruitingCESites&lt;/code&gt; resources shown above, and those answer without a login or API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find an employer's tenant host and site number?&lt;/strong&gt;&lt;br&gt;
Open the employer's careers page and look at the URL: &lt;code&gt;https://&amp;lt;tenant&amp;gt;.fa.&amp;lt;pod&amp;gt;.oraclecloud.com/hcmUI/CandidateExperience/&amp;lt;lang&amp;gt;/sites/&amp;lt;site number&amp;gt;/...&lt;/code&gt;. Some employers put a vanity domain in front (careers.oracle.com shows &lt;code&gt;sites/jobsearch&lt;/code&gt;, while the page itself loads from &lt;code&gt;eeho.fa.us2.oraclecloud.com&lt;/code&gt;); the API calls go to the &lt;code&gt;oraclecloud.com&lt;/code&gt; host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this the same as Taleo?&lt;/strong&gt;&lt;br&gt;
No. Taleo is Oracle's older recruiting product with a different URL scheme (&lt;code&gt;*.taleo.net&lt;/code&gt;) and none of these endpoints. This guide covers Oracle Recruiting Cloud only.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>webscraping</category>
      <category>jobs</category>
    </item>
    <item>
      <title>One day of Indian job postings: 5,600 new jobs on five boards, and how many show the salary</title>
      <dc:creator>Daemon Data</dc:creator>
      <pubDate>Wed, 28 Oct 2026 10:07:21 +0000</pubDate>
      <link>https://dev.to/datadaemon/one-day-of-indian-job-postings-5600-new-jobs-on-five-boards-and-how-many-show-the-salary-10nk</link>
      <guid>https://dev.to/datadaemon/one-day-of-indian-job-postings-5600-new-jobs-on-five-boards-and-how-many-show-the-salary-10nk</guid>
      <description>&lt;p&gt;How many jobs do Indian job boards post in a day, and how many of them tell you the salary? I pulled every new job from five boards for the 24 hours to Wednesday 28 October 2026: &lt;strong&gt;Apna, foundit (formerly Monster India), IIMJobs, Hirist and Instahyre&lt;/strong&gt;. Together they posted at least &lt;strong&gt;5,600 jobs&lt;/strong&gt;, and only one of the five showed a salary on most of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Board&lt;/th&gt;
&lt;th&gt;New jobs in one day&lt;/th&gt;
&lt;th&gt;Salary shown&lt;/th&gt;
&lt;th&gt;Applicant count shown&lt;/th&gt;
&lt;th&gt;Typical role&lt;/th&gt;
&lt;th&gt;Top city&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apna&lt;/td&gt;
&lt;td&gt;2,533&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Frontline: sales, delivery, back office, support&lt;/td&gt;
&lt;td&gt;Delhi NCR 16%, Bengaluru 15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;foundit&lt;/td&gt;
&lt;td&gt;2,649+&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;All functions and levels&lt;/td&gt;
&lt;td&gt;Bengaluru 23%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hirist&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;Tech, median 6 years' experience&lt;/td&gt;
&lt;td&gt;Bengaluru 47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IIMJobs&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;td&gt;Management and finance, median 9 years&lt;/td&gt;
&lt;td&gt;Bengaluru 29%, Mumbai 27%, Delhi NCR 27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instahyre&lt;/td&gt;
&lt;td&gt;112+&lt;/td&gt;
&lt;td&gt;not shown&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tech at product companies&lt;/td&gt;
&lt;td&gt;Bengaluru 54%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"+" marks a lower bound: the foundit and Instahyre runs stopped at a 15-minute limit before reading everything. foundit counted 2,815 jobs for a full day on 26 October. Shares are of the jobs each board posted that day; a job listed in several cities counts in each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Salary: Apna shows it, the others mostly do not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Every Apna job had a salary range&lt;/strong&gt;, stated per month. The median range was &lt;strong&gt;₹18,000–25,000 a month&lt;/strong&gt;, and 43% of jobs added incentives on top. Apna is a frontline board: 65% of its jobs were office-based, 33% field jobs, 2% work from home, and 71% accepted candidates with no experience.&lt;/p&gt;

&lt;p&gt;The professional boards hide pay. IIMJobs showed a salary on 28 of 140 jobs (20%), Hirist on 10 of 170 (6%), foundit on 50 of 2,649 (2%). Instahyre listings carry no salary field at all. If you are benchmarking pay for white-collar roles, one day of postings gives you a few dozen data points, not thousands; you need a few weeks of history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Competition: how many people apply in the first day
&lt;/h2&gt;

&lt;p&gt;IIMJobs and Hirist show an applicant count on almost every job. Jobs posted in the previous 24 hours already had a median of &lt;strong&gt;14.5 applicants on IIMJobs&lt;/strong&gt; and &lt;strong&gt;11 on Hirist&lt;/strong&gt;. foundit showed a count on 35% of its jobs, with a median of 2. For a recruiter this is a quick read on which roles are crowded; for a job seeker it says that applying on the first day matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  A caveat on "posted today"
&lt;/h2&gt;

&lt;p&gt;Job boards count a job as new when it is posted &lt;strong&gt;or refreshed&lt;/strong&gt;. On Apna, 487 of the 2,533 jobs (19%) were older jobs the employer had refreshed, some first posted in 2021; each keeps its original posting date in &lt;code&gt;postedAt&lt;/code&gt;. foundit's posted-within filter works the same way. If you want only first-time postings, filter on the original date, or keep a list of job ids you have already seen (below).&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the same feed every day
&lt;/h2&gt;

&lt;p&gt;All five boards have a full-board mode in the Apify Actors I maintain: &lt;code&gt;allJobs&lt;/code&gt; reads every job in the posting window, and &lt;code&gt;onlyNewSinceLastRun&lt;/code&gt; makes each daily run return, and charge for, only jobs you have not received before. This script runs all five and writes one CSV:&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="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;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;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;FEEDS&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;apna&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;data_daemon/apna-jobs-scraper&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;allJobs&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;postedWithin&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;24h&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;foundit&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;data_daemon/foundit-jobs-scraper&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;allJobs&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iimjobs&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;data_daemon/iimjobs-jobs-scraper&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;allJobs&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hirist&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;data_daemon/hirist-jobs-scraper&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;allJobs&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;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instahyre&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;data_daemon/instahyre-jobs-scraper&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;allJobs&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="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;board&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;id&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;title&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;company&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;url&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;postedAt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;frames&lt;/span&gt; &lt;span class="o"&gt;=&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;board&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;FEEDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&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="n"&gt;actor&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="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onlyNewSinceLastRun&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;stateName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout_secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&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="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;board&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="n"&gt;board&lt;/span&gt;
    &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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="nf"&gt;reindex&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="n"&gt;COLUMNS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;jobs&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;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ignore_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;jobs&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;new-jobs-india.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;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&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;board&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has many more fields than the six kept here: description, skills, experience range, locations, and salary or applicants where the board shows them. Drop &lt;code&gt;reindex&lt;/code&gt; to keep everything. Instahyre has no date filter, so its first run exports the whole board (about 12,700 jobs, roughly 80 minutes); it stops cleanly at the timeout and the next run continues where it stopped.&lt;/p&gt;

&lt;p&gt;What a daily feed of each board costs, at the volumes above:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Board&lt;/th&gt;
&lt;th&gt;Jobs a day&lt;/th&gt;
&lt;th&gt;Price per job, description included&lt;/th&gt;
&lt;th&gt;Per month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/data_daemon/apna-jobs-scraper" rel="noopener noreferrer"&gt;Apna&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;about 2,000 on average&lt;/td&gt;
&lt;td&gt;$0.0008&lt;/td&gt;
&lt;td&gt;about $47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/data_daemon/foundit-jobs-scraper" rel="noopener noreferrer"&gt;foundit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;about 2,800&lt;/td&gt;
&lt;td&gt;$0.0008&lt;/td&gt;
&lt;td&gt;about $67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper" rel="noopener noreferrer"&gt;IIMJobs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;about 140&lt;/td&gt;
&lt;td&gt;$0.002 from 2 November ($0.004 before)&lt;/td&gt;
&lt;td&gt;about $8.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/data_daemon/hirist-jobs-scraper" rel="noopener noreferrer"&gt;Hirist&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;about 170&lt;/td&gt;
&lt;td&gt;$0.002 from 2 November ($0.004 before)&lt;/td&gt;
&lt;td&gt;about $10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://apify.com/data_daemon/instahyre-jobs-scraper" rel="noopener noreferrer"&gt;Instahyre&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;112+&lt;/td&gt;
&lt;td&gt;$0.0008&lt;/td&gt;
&lt;td&gt;about $3, after a first export of about $10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each run also has a $0.001 start fee (on IIMJobs and Hirist from 2 November). You can narrow any feed to cities, departments, experience bands or keywords to pay for less. Ready-made inputs to try in the browser first: &lt;a href="https://apify.com/data_daemon/apna-jobs-scraper/examples/all-apna-jobs-daily-full-board-feed" rel="noopener noreferrer"&gt;all Apna jobs from the last 24 hours&lt;/a&gt;, &lt;a href="https://apify.com/data_daemon/foundit-jobs-scraper/examples/all-foundit-jobs-full-board-feed" rel="noopener noreferrer"&gt;all foundit jobs posted today&lt;/a&gt;, &lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper/examples/all-iimjobs-jobs-full-board-feed" rel="noopener noreferrer"&gt;all IIMJobs jobs&lt;/a&gt; and &lt;a href="https://apify.com/data_daemon/hirist-jobs-scraper/examples/all-hirist-tech-jobs-full-board-feed" rel="noopener noreferrer"&gt;all Hirist tech jobs&lt;/a&gt;. For keyword alerts to Slack or email on a schedule, the open-source &lt;a href="https://github.com/datadmon/india-job-alerts" rel="noopener noreferrer"&gt;india-job-alerts&lt;/a&gt; template runs from GitHub Actions.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Do Indian job boards have a public API?&lt;/strong&gt;&lt;br&gt;
None of these five publishes a documented public API for job listings. Their websites load the listings from JSON endpoints, which is what the Actors above read, without a login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Indian job board shows salaries?&lt;/strong&gt;&lt;br&gt;
Of the five, Apna: every job in our sample had a monthly salary range. IIMJobs showed salary on about one job in five, Hirist and foundit rarely, Instahyre not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many jobs are posted in India every day?&lt;/strong&gt;&lt;br&gt;
These five boards alone posted at least 5,600 in the 24 hours to 28 October 2026. The largest boards are not in this count, so the national total is much higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are "posted today" jobs really new?&lt;/strong&gt;&lt;br&gt;
Not always. About one Apna job in five was an older job the employer refreshed. Use the original &lt;code&gt;postedAt&lt;/code&gt; date or only-new mode if you need first-time postings.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Counts are for the 24 hours to 28 October 2026 and move with the weekday: Apna posts about 950 jobs after a weekend and about 2,500 midweek.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>india</category>
      <category>datascience</category>
      <category>python</category>
      <category>career</category>
    </item>
  </channel>
</rss>
