<?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: DataDaemon</title>
    <description>The latest articles on DEV Community by DataDaemon (@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%2Ff91513cf-fe8e-4379-8073-2b358292310b.png</url>
      <title>DEV Community: DataDaemon</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>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>DataDaemon</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>DataDaemon</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>DataDaemon</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>DataDaemon</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>DataDaemon</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>DataDaemon</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>
    <item>
      <title>How accurate is IPO GMP? We checked all 294 Indian IPOs listed in 2026</title>
      <dc:creator>DataDaemon</dc:creator>
      <pubDate>Wed, 28 Oct 2026 09:39:26 +0000</pubDate>
      <link>https://dev.to/datadaemon/how-accurate-is-ipo-gmp-we-checked-all-294-indian-ipos-listed-in-2026-4bdg</link>
      <guid>https://dev.to/datadaemon/how-accurate-is-ipo-gmp-we-checked-all-294-indian-ipos-listed-in-2026-4bdg</guid>
      <description>&lt;p&gt;The grey market premium (GMP) is the unofficial price at which an Indian IPO's shares trade before they list. Investors read it as a forecast of the listing gain: a GMP of ₹50 on a ₹500 issue suggests the stock will open around ₹550, a 10% gain.&lt;/p&gt;

&lt;p&gt;How good is that forecast? I compared the last GMP before listing with the actual listing price for &lt;strong&gt;every IPO that listed on BSE or NSE in 2026 so far: 294 issues (109 mainboard, 185 SME) from 2 January to 28 October&lt;/strong&gt;. Data as of 28 October 2026, 15:37 IST.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GMP is a good guide on average.&lt;/strong&gt; The correlation between the GMP % and the listing gain % is 0.88, and the median miss is zero: about half of the IPOs listed below their GMP and half above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The typical miss is 8.6 percentage points.&lt;/strong&gt; GMP landed within ±5 points of the listing gain for 51% of IPOs and within ±10 points for 69%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mainboard GMP is more accurate than SME GMP.&lt;/strong&gt; Mainboard misses averaged 7.0 points (80% within ±10), SME 9.6 points (63% within ±10). Issues of ₹1,000 crore or more were the most accurate: 6.1 points on average, correlation 0.93.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A GMP above 25% never led to a listing below the issue price in 2026&lt;/strong&gt; (0 of 55 IPOs). A GMP of zero did in 44% of cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today's big listing is a good example. Jio Platforms had a last GMP of ₹250 on a ₹1,119 issue (22.3%), an estimated listing price of ₹1,369. It listed at ₹1,358, a 21.4% gain.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GMP:&lt;/strong&gt; the last grey market premium reported before listing day, from a public IPO GMP report (investorgain's GMP performance table).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listing gain:&lt;/strong&gt; listing-day opening price on BSE/NSE versus the issue price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Miss:&lt;/strong&gt; listing gain % minus GMP % in percentage points. Positive means the IPO listed better than GMP suggested.&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;Group&lt;/th&gt;
&lt;th&gt;IPOs&lt;/th&gt;
&lt;th&gt;Correlation&lt;/th&gt;
&lt;th&gt;Average miss&lt;/th&gt;
&lt;th&gt;Within ±5 pts&lt;/th&gt;
&lt;th&gt;Within ±10 pts&lt;/th&gt;
&lt;th&gt;GMP &amp;gt; 0 and listed above issue price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All IPOs&lt;/td&gt;
&lt;td&gt;294&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;td&gt;8.6 pts&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mainboard&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;0.91&lt;/td&gt;
&lt;td&gt;7.0 pts&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SME&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;0.87&lt;/td&gt;
&lt;td&gt;9.6 pts&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;63%&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issue size ₹1,000 Cr+&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;0.93&lt;/td&gt;
&lt;td&gt;6.1 pts&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;82%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What each GMP level meant in 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Last GMP before listing&lt;/th&gt;
&lt;th&gt;IPOs&lt;/th&gt;
&lt;th&gt;Median GMP&lt;/th&gt;
&lt;th&gt;Median listing gain&lt;/th&gt;
&lt;th&gt;Listed below issue price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;−3.3%&lt;/td&gt;
&lt;td&gt;−9.5%&lt;/td&gt;
&lt;td&gt;94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero (no premium quoted)&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0–10%&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;td&gt;+0.6%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10–25%&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;+16.7%&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25–50%&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;37.3%&lt;/td&gt;
&lt;td&gt;+36.8%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Above 50%&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;69.7%&lt;/td&gt;
&lt;td&gt;+77.1%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The middle bands are where GMP earns its reputation: for IPOs with a 10–50% premium, the median listing gain matched the median GMP almost exactly. The bottom bands are where it does not: a small positive GMP (under 5%) still ended below the issue price in 20 of 64 cases, so a thin premium is closer to a coin toss than a signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GMP gets it wrong
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. SME IPOs at the 90% cap.&lt;/strong&gt; Since July 2024 NSE caps the listing-day opening price of an SME IPO at 90% above the issue price. In 2026, 14 SME IPOs opened at that ceiling (13 at exactly +90%, one at +89.8%), including half of the SMEs whose GMP was 50% or more. When GMP says 120% and the exchange allows 90%, the miss is mechanical, not a forecasting failure. Without those 14 issues the average miss falls from 8.6 to 7.7 points.&lt;/p&gt;

&lt;p&gt;The cap also produced the biggest misses in the other direction: Teja Engineering Industries (GMP 16.4%) and Sollfege Smart Electronics (GMP 18.2%) both opened at the +90% ceiling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Thin premiums on mainboard issues.&lt;/strong&gt; Seven mainboard IPOs with a positive GMP listed below their issue price. Six of them had a GMP under 4%. The exception was Skyways Air: GMP +23.9%, listing −10.1% on 1 September.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Very hot issues.&lt;/strong&gt; IPOs subscribed 50 times or more had the highest median listing gain (+31.8%, against a median GMP of 32.1%) but also the largest average miss, 12 points. Hy-Tech Engineers (GMP 73.6%, listed +41.5%) and Adroit Industries (GMP 41.0%, listed +75.4%) were both in this group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the IPO GMP data as JSON
&lt;/h2&gt;

&lt;p&gt;There is no official IPO GMP API, because GMP is not an exchange price. I collect it, together with live subscription, the IPO calendar and listing results, with the &lt;a href="https://apify.com/data_daemon/india-ipo-tracker" rel="noopener noreferrer"&gt;India IPO Tracker&lt;/a&gt; on Apify. It returns JSON, CSV or Excel, needs no login or proxy, and costs $3 per 1,000 rows. The 324 rows behind this article (30 live GMP rows plus 294 GMP-vs-listing rows) cost about $1.&lt;/p&gt;

&lt;p&gt;Live GMP for every open and upcoming IPO, 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-ipo-tracker/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;'{"reports": ["gmp"]}'&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;"reportType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ipoName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EAAA India Alternatives"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eaaa-india-alternatives-ipo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mainboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusLabel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gmp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"issuePrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1665&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lotSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openDate"&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-26"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"closeDate"&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;"listingDate"&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-11-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subscriptionText"&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.04x"&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 accuracy table, ask for the &lt;code&gt;gmpPerformance&lt;/code&gt; report (last GMP, estimated and actual listing price for every IPO of the year) and group it 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-ipo-tracker&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;reports&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;gmpPerformance&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;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;all&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="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="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;miss&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;listingGainPercent&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;gmpPercent&lt;/span&gt;&lt;span class="sh"&gt;"&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="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&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;category&lt;/span&gt;&lt;span class="sh"&gt;"&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;append&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="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ipos&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;g&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correlation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gmpPercent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;listingGainPercent&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;avg_miss_pp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;miss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;abs&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;within_10pp&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="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;miss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;abs&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;10&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="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;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;rows&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;2&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;    category  ipos  correlation  avg_miss_pp  within_10pp
0  Mainboard   109         0.91         6.97         0.80
1        SME   185         0.87         9.64         0.63
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other reports in the same Actor: &lt;code&gt;subscription&lt;/code&gt; (QIB, NII and retail multiples from BSE/NSE), &lt;code&gt;calendar&lt;/code&gt; (open, close, allotment, refund and listing dates), &lt;code&gt;currentIpos&lt;/code&gt;, &lt;code&gt;ipoList&lt;/code&gt; and &lt;code&gt;listingPerformance&lt;/code&gt;. Every row carries the same &lt;code&gt;slug&lt;/code&gt;, so the reports join without name matching. Ready-made inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-ipo-tracker/examples/live-ipo-gmp-today" rel="noopener noreferrer"&gt;Live IPO GMP today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-ipo-tracker/examples/ipo-gmp-vs-listing-price-tracker" rel="noopener noreferrer"&gt;IPO GMP vs listing price tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-ipo-tracker/examples/sme-ipo-gmp-today" rel="noopener noreferrer"&gt;SME IPO GMP today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/india-ipo-tracker/examples/ipo-subscription-status-live" rel="noopener noreferrer"&gt;IPO subscription status, live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you would rather keep a running CSV with GitHub Actions and get an alert when a GMP moves, the open-source &lt;a href="https://github.com/datadmon/india-ipo-gmp-tracker" rel="noopener noreferrer"&gt;india-ipo-gmp-tracker&lt;/a&gt; template does that on a schedule.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Is IPO GMP reliable?&lt;/strong&gt;&lt;br&gt;
On average, yes: in 2026 the median IPO listed exactly at its GMP and 69% landed within 10 percentage points. Individual IPOs can miss by 30 points or more, and a GMP under 5% says little about direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is IPO GMP official?&lt;/strong&gt;&lt;br&gt;
No. GMP comes from unofficial, unregulated grey-market dealing; exchanges do not publish it. Treat it as sentiment, not a price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does high subscription mean a listing gain?&lt;/strong&gt;&lt;br&gt;
Mostly. IPOs subscribed 50 times or more had a median listing gain of +31.8% in 2026, against about 0% for issues subscribed under 2 times. The misses are also bigger for the hot issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do so many SME IPOs list at +90%?&lt;/strong&gt;&lt;br&gt;
NSE caps the listing-day opening price of SME IPOs at 90% above the issue price (since July 2024). The price can move further during the day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an IPO GMP API?&lt;/strong&gt;&lt;br&gt;
There is no official one. The India IPO Tracker returns GMP, subscription, calendar and listing data as JSON through the Apify API; you can also call it from Python, Node.js, n8n, Make, Zapier or an AI agent through the Apify MCP server.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GMP is an unofficial indicator. Nothing here is investment advice. Numbers are as of 28 October 2026 and change as new IPOs list.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>india</category>
      <category>finance</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>IIMJobs data for recruiters: salary disclosure, applicant counts and who is hiring, in one spreadsheet</title>
      <dc:creator>DataDaemon</dc:creator>
      <pubDate>Sun, 18 Oct 2026 02:56:35 +0000</pubDate>
      <link>https://dev.to/datadaemon/iimjobs-data-for-recruiters-salary-disclosure-applicant-counts-and-who-is-hiring-in-one-f55</link>
      <guid>https://dev.to/datadaemon/iimjobs-data-for-recruiters-salary-disclosure-applicant-counts-and-who-is-hiring-in-one-f55</guid>
      <description>&lt;p&gt;If you recruit for management, finance, consulting or HR roles in India, IIMJobs is one of the boards you already watch. Watching it by hand works for one requisition. It does not work when someone asks you a market question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How many product manager roles opened in Mumbai and Bangalore this week?"&lt;/li&gt;
&lt;li&gt;"Are competitors disclosing salary for talent acquisition leads, and at what band?"&lt;/li&gt;
&lt;li&gt;"How crowded is an investment banking posting? Will we get 50 applicants or 500?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every IIMJobs listing already carries the answer: posting date, experience range, salary (when the recruiter shows it), locations, skills, applicant count and view count. You just need the listings in a spreadsheet instead of a browser tab.&lt;/p&gt;

&lt;p&gt;This post shows how to get that spreadsheet in about five minutes without writing code, how to refresh it every week, and five questions you can answer once you have it. There is an optional Python section at the end for people who want charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a quick pull already tells you
&lt;/h2&gt;

&lt;p&gt;I pulled the first ~50 results for three keywords, limited to jobs posted in the last 7 days, on 18 October 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;Postings in last 7 days&lt;/th&gt;
&lt;th&gt;Salary disclosed&lt;/th&gt;
&lt;th&gt;Median applicants per posting&lt;/th&gt;
&lt;th&gt;Median views&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;product manager&lt;/td&gt;
&lt;td&gt;348&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;291&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;talent acquisition&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;415&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;investment banking&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;241&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things stand out even from a small sample:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Salary disclosure is rare.&lt;/strong&gt; Fewer than one posting in five shows a band. If you publish yours, you stand out; if you benchmark from postings, you are benchmarking from a small, self-selected minority. Treat disclosed bands as a signal, not a market median.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talent acquisition roles get swamped.&lt;/strong&gt; A median of 201 applicants per TA posting means screening capacity matters more than reach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investment banking is a Mumbai market.&lt;/strong&gt; 27 of the 57 IB postings in the sample listed Mumbai; Bangalore was a distant second with 10.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your own numbers will differ by week and keyword. The point is that these are one-click questions once the data is in a sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: get the listings into a spreadsheet (no code)
&lt;/h2&gt;

&lt;p&gt;I use the &lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;IIMJobs Scraper on Apify&lt;/a&gt;. Disclosure: I built it. It reads the same JSON the IIMJobs website loads, so it needs no login, no browser and no proxy, and it returns one clean row per job.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open one of the ready-made examples and click &lt;strong&gt;Run example&lt;/strong&gt; (an Apify account is free and the free plan includes $5 of usage every month):

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper/examples/product-manager-jobs-india?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;Product manager jobs in India&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper/examples/investment-banking-finance-jobs?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;Investment banking and finance jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/data_daemon/iimjobs-jobs-scraper/examples/consulting-jobs-mba?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;Management consulting jobs for MBAs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Change the inputs to your own market:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search keywords&lt;/strong&gt;: one line per role family, for example &lt;code&gt;talent acquisition&lt;/code&gt;, &lt;code&gt;hr business partner&lt;/code&gt;, &lt;code&gt;compensation and benefits&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locations&lt;/strong&gt;: &lt;code&gt;Mumbai&lt;/code&gt;, &lt;code&gt;Bangalore&lt;/code&gt;, &lt;code&gt;Gurgaon&lt;/code&gt;, &lt;code&gt;Remote&lt;/code&gt;, or leave empty for all of India.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum / maximum experience&lt;/strong&gt;: for example 5 to 10 years for mid-level roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posted within (days)&lt;/strong&gt;: &lt;code&gt;7&lt;/code&gt; for a weekly snapshot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include full job description&lt;/strong&gt;: switch it off for benchmarking. You only need it if you want to read or text-mine the JDs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. A few hundred jobs take well under a minute.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Output&lt;/strong&gt; tab and click &lt;strong&gt;Export&lt;/strong&gt;: Excel, CSV or JSON. You can also send results straight to Google Sheets with Apify's Google Sheets integration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; $0.002 per job, plus $0.002 per job if you include the full description. A 500-job weekly snapshot without descriptions costs $1.00, which fits inside the free monthly credit with room to spare. From 2 November 2026 the full description is included in the $0.002 job price (plus $0.001 per run).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: make it weekly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Run example&lt;/strong&gt; already copied the example into your account as a saved task, with your edited input. Add a schedule for it: Apify Console → &lt;strong&gt;Schedules&lt;/strong&gt; → create a schedule such as &lt;em&gt;every Monday 08:00 IST&lt;/em&gt; → add your task. Each run creates a new dataset. If you export each one into a new tab of the same Google Sheet, you get a week-over-week history without any manual work.&lt;/p&gt;

&lt;p&gt;Tip: keep the keywords identical from week to week. Changing them changes the population and breaks your trend lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: five questions to answer from the sheet
&lt;/h2&gt;

&lt;p&gt;The columns you will use most:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the keyword that found the job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;designation&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;job title as posted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;company.name&lt;/code&gt;, &lt;code&gt;company.ambitionBoxRating&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;employer and its AmbitionBox rating, when available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;experienceMinYears&lt;/code&gt;, &lt;code&gt;experienceMaxYears&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;experience range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;salaryMinLpa&lt;/code&gt;, &lt;code&gt;salaryMaxLpa&lt;/code&gt;, &lt;code&gt;salaryHidden&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;band in lakhs per annum, and whether the recruiter hid it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;locations&lt;/code&gt;, &lt;code&gt;remote&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;cities and remote flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;mandatorySkills&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;tagged skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;applicants&lt;/code&gt;, &lt;code&gt;views&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;competition signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;postedAt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;posting timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;1. How much hiring is there, and where?&lt;/strong&gt; Pivot table: rows = &lt;code&gt;query&lt;/code&gt;, columns = first location, values = count of &lt;code&gt;id&lt;/code&gt;. Compare with last week's tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Who is hiring the most?&lt;/strong&gt; Pivot table: rows = &lt;code&gt;company.name&lt;/code&gt;, values = count of &lt;code&gt;id&lt;/code&gt;, sorted descending. Add the AmbitionBox rating column next to it. A company posting ten roles with a 3.1 rating is a different competitor from one posting ten roles with a 4.2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What do disclosed bands look like?&lt;/strong&gt; Filter &lt;code&gt;salaryHidden = FALSE&lt;/code&gt;, then pivot &lt;code&gt;query&lt;/code&gt; × experience bucket with the median of &lt;code&gt;salaryMinLpa&lt;/code&gt; and &lt;code&gt;salaryMaxLpa&lt;/code&gt;. Always show the count next to the median; with 8 to 17% disclosure, a median of three postings is an anecdote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. How crowded is each role?&lt;/strong&gt; Median &lt;code&gt;applicants&lt;/code&gt; per &lt;code&gt;query&lt;/code&gt; and city. A high applicant count with a short posting age means you need screening help, not more sourcing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Which skills are mandatory?&lt;/strong&gt; Split &lt;code&gt;mandatorySkills&lt;/code&gt; into rows and count. When "Workday" or "SuccessFactors" starts showing up as mandatory in HRBP postings, you want to know before your next intake meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: the same analysis in Python
&lt;/h2&gt;

&lt;p&gt;If you prefer pandas over pivot tables:&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;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="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="c1"&gt;# pip install apify-client pandas
&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="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;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/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="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;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;product manager&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;talent acquisition&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;investment banking&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;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;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="c1"&gt;# cheaper; not needed for benchmarking
&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="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;json_normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&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;summary&lt;/span&gt; &lt;span class="o"&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;query&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;postings&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;salary_disclosed&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;salaryHidden&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="mi"&gt;100&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;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bool&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;median_applicants&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;applicants&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_views&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;views&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="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="c1"&gt;# Disclosed bands by experience bucket, with counts so nobody over-reads a median of 3
&lt;/span&gt;&lt;span class="n"&gt;disclosed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;jobs&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="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bool&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;disclosed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exp_bucket&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;cut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disclosed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;experienceMinYears&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="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="mi"&gt;3&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="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                 &lt;span class="n"&gt;labels&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;0-3&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;4-7&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;8-12&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;13+&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;disclosed&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;query&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;exp_bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;observed&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;salaryMinLpa&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;salaryMaxLpa&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="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;median&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="c1"&gt;# Top hiring companies with their AmbitionBox rating
&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;company.name&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;postings&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;rating&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;company.ambitionBoxRating&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;first&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;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;postings&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;15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# City split (a job can list several cities)
&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;explode&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="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="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;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Caveats worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disclosed salary is a biased sample.&lt;/strong&gt; Companies that show bands are often the ones paying at or above market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Applicant counts are IIMJobs-only.&lt;/strong&gt; The same role is usually also on LinkedIn and Naukri, so treat the number as relative competition, not total pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postings are not hires.&lt;/strong&gt; Some listings are evergreen pipelines. Week-over-week deltas are more reliable than absolute counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the data for market intelligence, not mass outreach.&lt;/strong&gt; Respect IIMJobs' terms and India's data-protection rules if anything you store relates to a person.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IT and tech roles instead of management? The sister &lt;a href="https://apify.com/data_daemon/hirist-jobs-scraper?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;Hirist Jobs Scraper&lt;/a&gt; returns the same columns for Hirist.tech.&lt;/li&gt;
&lt;li&gt;Tracking a specific large employer? Many of them run their career site on Oracle Cloud HCM, which this &lt;a href="https://apify.com/data_daemon/oracle-hcm-jobs-scraper?utm_source=devto&amp;amp;utm_campaign=iimjobs-recruiters" rel="noopener noreferrer"&gt;Oracle HCM jobs scraper&lt;/a&gt; reads directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there is a column you need for your reports that is not in the output, leave a comment or open an issue on the Actor page. I read both.&lt;/p&gt;

</description>
      <category>recruiting</category>
      <category>hr</category>
      <category>datascience</category>
      <category>india</category>
    </item>
    <item>
      <title>Indian stock fundamentals as JSON: the Tickertape endpoints that work without a login</title>
      <dc:creator>DataDaemon</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:51:49 +0000</pubDate>
      <link>https://dev.to/datadaemon/indian-stock-fundamentals-as-json-the-tickertape-endpoints-that-work-without-a-login-5ag8</link>
      <guid>https://dev.to/datadaemon/indian-stock-fundamentals-as-json-the-tickertape-endpoints-that-work-without-a-login-5ag8</guid>
      <description>&lt;p&gt;If you have ever tried to pull fundamentals for Indian stocks programmatically, you know the pain: NSE sits behind Akamai and blocks anything that isn't a browser, BSE is worse, Screener.in needs a login for anything useful, and the paid vendors want an enterprise contract for what is essentially public data.&lt;/p&gt;

&lt;p&gt;There is a quieter option. &lt;a href="https://www.tickertape.in" rel="noopener noreferrer"&gt;Tickertape&lt;/a&gt; renders its stock pages from a set of JSON endpoints that answer plain HTTP requests, no cookies, no token. I spent a day mapping them. This post documents what I found, with working Python, and then shows the hosted version I built for people who would rather not maintain scrapers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoints
&lt;/h2&gt;

&lt;p&gt;All of these live on &lt;code&gt;https://api.tickertape.in&lt;/code&gt; and only need a normal browser user agent and a &lt;code&gt;Referer&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search a ticker or name to get Tickertape's internal id (&lt;code&gt;sid&lt;/code&gt;):&lt;/strong&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;H&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="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="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Referer&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;https://www.tickertape.in/&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="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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.tickertape.in/search&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;text&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;reliance&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;types&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;stock&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="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stocks&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;data&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;stocks&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;stocks&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;sid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;stocks&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;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;stocks&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;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# RELI RELIANCE /stocks/reliance-industries-RELI
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key ratios and company info:&lt;/strong&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="n"&gt;info&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.tickertape.in/stocks/info/RELI&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="n"&gt;H&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;data&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;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;info&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;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ratios&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;pe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ratios&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;mrktCapf&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;&lt;code&gt;ratios&lt;/code&gt; includes P/E, P/B, EPS, book value, dividend yield, ROE, beta, 52-week range, market-cap rank and the industry averages for P/E, P/B and yield.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quarterly shareholding history (promoter, pledged, FII, DII, mutual funds, retail):&lt;/strong&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="n"&gt;holdings&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.tickertape.in/stocks/holdings/RELI&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="n"&gt;H&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;data&lt;/span&gt;&lt;span class="sh"&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;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;holdings&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="n"&gt;h&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&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;h&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="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;promoter&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;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;pmPctT&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FII&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;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;fiPctT&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MF&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;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;mfPctT&lt;/span&gt;&lt;span class="sh"&gt;"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Index constituents:&lt;/strong&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="n"&gt;nifty&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.tickertape.in/indices/constituents/.NSEI&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="n"&gt;H&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;data&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;nifty&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constituents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;nifty&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constituents&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&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;&lt;code&gt;.NSEI&lt;/code&gt; is NIFTY 50; &lt;code&gt;.NSEBANK&lt;/code&gt;, &lt;code&gt;.NIFTY500&lt;/code&gt; and friends work the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The screener&lt;/strong&gt; is a POST with a filter object. &lt;code&gt;g&lt;/code&gt; means greater than, &lt;code&gt;l&lt;/code&gt; means less than:&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;body&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;match&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;mrktCapf&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;g&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apef&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;l&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;divYield&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;g&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;divYield&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;sortOrder&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&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;subindustry&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;mrktCapf&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;lastPrice&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;apef&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;divYield&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;pr1y&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;offset&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="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="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sids&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="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;res&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.tickertape.in/screener/query&lt;/span&gt;&lt;span class="sh"&gt;"&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="n"&gt;body&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="n"&gt;H&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;data&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;results&lt;/span&gt;&lt;span class="sh"&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="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;res&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;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stock&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;info&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;ticker&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stock&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;advancedRatios&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;divYield&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;h2&gt;
  
  
  The financial statements
&lt;/h2&gt;

&lt;p&gt;The statements aren't on the API host. They're embedded in the stock page's Next.js payload. Fetch the page, pull the &lt;code&gt;__NEXT_DATA__&lt;/code&gt; script tag, and you get ten years of income statement, balance sheet and cash flow, plus quarterly results, dividends, corporate actions, analyst forecasts and the mutual funds holding the stock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;html&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.tickertape.in/stocks/reliance-industries-RELI&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="n"&gt;H&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;data&lt;/span&gt; &lt;span class="o"&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;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;&amp;lt;script id=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__NEXT_DATA__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;/script&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;html&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="n"&gt;S&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;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;props&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;pageProps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;income&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;income-normal-annual&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="c1"&gt;# list of yearly rows
&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;income&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;displayPeriod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;income&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incTrev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;income&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incNinc&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;Field names are codes (&lt;code&gt;incTrev&lt;/code&gt; is total revenue, &lt;code&gt;incNinc&lt;/code&gt; net income). The page also ships a &lt;code&gt;labels&lt;/code&gt; object mapping every code to its display name under the &lt;code&gt;frontL&lt;/code&gt; key, so you can translate them in one pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that bit me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The screener returns at most 100 rows per call; paginate with &lt;code&gt;offset&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Statement values are in ₹ crore.&lt;/li&gt;
&lt;li&gt;The page payload is about 1.2 MB per stock. Cache it.&lt;/li&gt;
&lt;li&gt;Nothing here is documented or guaranteed. Tickertape can rename a field any day, and their terms of use apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you'd rather not maintain this
&lt;/h2&gt;

&lt;p&gt;I packaged all of the above as a pay-per-result actor on Apify, so the endpoint mapping is my problem, not yours: &lt;a href="https://apify.com/data_daemon/tickertape-stocks-scraper" rel="noopener noreferrer"&gt;Tickertape India Stocks Scraper&lt;/a&gt;. It has three modes: a list of tickers, a whole index, or a screener query, and it returns the statements with readable field names. A full profile costs two cents; all of NIFTY 50 with ten years of financials is about a dollar. There are runnable examples in Python, Node and n8n in &lt;a href="https://github.com/datadmon/apify-data-actors-examples" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're after IPO data instead, Chittorgarh and InvestorGain have similar hidden report endpoints; that mapping is &lt;a href="https://apify.com/data_daemon/india-ipo-tracker" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Questions or a field you need that isn't there? Comments are open.&lt;/p&gt;

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