<?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: Mohamed Senator</title>
    <description>The latest articles on DEV Community by Mohamed Senator (@s3nafps).</description>
    <link>https://dev.to/s3nafps</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%2F4165217%2F19ec0537-cd23-4719-b434-84ff66d83855.jpg</url>
      <title>DEV Community: Mohamed Senator</title>
      <link>https://dev.to/s3nafps</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/s3nafps"/>
    <language>en</language>
    <item>
      <title>How to get Aqar.fm property listings into Google Sheets (Riyadh, Jeddah, any Saudi city)</title>
      <dc:creator>Mohamed Senator</dc:creator>
      <pubDate>Sat, 17 Oct 2026 01:52:49 +0000</pubDate>
      <link>https://dev.to/s3nafps/how-to-get-aqarfm-property-listings-into-google-sheets-riyadh-jeddah-any-saudi-city-2bpi</link>
      <guid>https://dev.to/s3nafps/how-to-get-aqarfm-property-listings-into-google-sheets-riyadh-jeddah-any-saudi-city-2bpi</guid>
      <description>&lt;p&gt;Aqar.fm is the biggest property site in Saudi Arabia, but it has no export button. If you want to compare rents across Riyadh districts or spot under-priced listings, you end up copying listings by hand.&lt;/p&gt;

&lt;p&gt;Here's how to get clean listings into a spreadsheet in about two minutes, with no code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Open the scraper&lt;/strong&gt;&lt;br&gt;
Go to &lt;a href="https://apify.com/s3nafps/aqar-scraper" rel="noopener noreferrer"&gt;Aqar.fm Scraper on Apify&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Pick your search&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;City: Riyadh, Jeddah, Dammam, Al Khobar, Mecca, Medina and more&lt;/li&gt;
&lt;li&gt;Category: apartments, villas, land or buildings, for rent or for sale&lt;/li&gt;
&lt;li&gt;Optional filters: district, price range, area, minimum bedrooms&lt;/li&gt;
&lt;li&gt;Max results: how many listings you want&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Run it and export&lt;/strong&gt;&lt;br&gt;
Click &lt;strong&gt;Start&lt;/strong&gt;. When the run finishes, open &lt;strong&gt;Storage → Dataset&lt;/strong&gt; and export to CSV or Excel, then import the file into Google Sheets. To refresh automatically, add a schedule (for example, daily at 8:00).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get for each listing&lt;/strong&gt;&lt;br&gt;
English and Arabic title and description, price in SAR, rent period, area (m²), price per m², bedrooms, bathrooms, district, map coordinates, photos, and advertiser type.&lt;/p&gt;

&lt;p&gt;The column most people miss is &lt;strong&gt;&lt;code&gt;priceVsDistrictMedianPct&lt;/code&gt;&lt;/strong&gt;: how far a listing's price per m² is above or below the median for its district.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; in my test, a 203 m² three-bedroom apartment for rent in Al Malqa, Riyadh, came in at SAR 369/m². The district median was SAR 622/m², so it was &lt;strong&gt;40.6% below median&lt;/strong&gt;. Sort by that column and the deals are at the top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; you pay per listing, and there's no subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want alerts instead of exports?&lt;/strong&gt; &lt;a href="https://apify.com/s3nafps/aqar-monitor" rel="noopener noreferrer"&gt;Aqar.fm Monitor&lt;/a&gt; runs on a schedule and reports only new listings and price drops.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>realestate</category>
      <category>saudiarabia</category>
      <category>googlesheets</category>
    </item>
    <item>
      <title>Turn any web page into typed JSON for your AI agent (with a source quote for every value)</title>
      <dc:creator>Mohamed Senator</dc:creator>
      <pubDate>Sat, 17 Oct 2026 01:48:24 +0000</pubDate>
      <link>https://dev.to/s3nafps/turn-any-web-page-into-typed-json-for-your-ai-agent-with-a-source-quote-for-every-value-39lb</link>
      <guid>https://dev.to/s3nafps/turn-any-web-page-into-typed-json-for-your-ai-agent-with-a-source-quote-for-every-value-39lb</guid>
      <description>&lt;p&gt;LLM agents are great at reasoning and bad at reading messy HTML. The usual fix is a custom scraper per site, which breaks every time the site changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/s3nafps/webpage-to-json-for-ai-agents" rel="noopener noreferrer"&gt;Webpage to JSON for AI Agents&lt;/a&gt; takes a URL and a plain-English description of the fields you want, and returns typed JSON. Every value comes with a quote from the page, so you can check it isn't made up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instruction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extract the book title, price as a number, currency code, and whether it is in stock."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output (real run):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A Light in the Attic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currencyCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"inStock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# A Light in the Attic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"£51.77"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"unverifiedFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Useful options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON schema:&lt;/strong&gt; pass &lt;code&gt;extractionSchema&lt;/code&gt; when you need an exact shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List mode:&lt;/strong&gt; set &lt;code&gt;listMode: true&lt;/code&gt; to get many records from one page, such as product grids or job boards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict evidence:&lt;/strong&gt; &lt;code&gt;requireEvidence&lt;/code&gt; is on by default. A value without a source quote is flagged in &lt;code&gt;unverifiedFields&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Call it from code&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;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&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;s3nafps/webpage-to-json-for-ai-agents&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;urls&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;https://example.com/pricing&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;instruction&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;List each plan with name, monthly price and included seats.&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use it as an MCP tool:&lt;/strong&gt; add &lt;code&gt;https://mcp.apify.com/?actors=s3nafps/webpage-to-json-for-ai-agents&lt;/code&gt; to Claude, Cursor or any MCP client, and your agent can call it directly.&lt;/p&gt;

&lt;p&gt;The LLM cost is included. You pay $0.03 per page with data and nothing for pages where no data was found.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
