OpenSooq Scraper - Sale & Rent Property Listings avatar

OpenSooq Scraper - Sale & Rent Property Listings

Pricing

from $2.20 / 1,000 results

Go to Apify Store
OpenSooq Scraper - Sale & Rent Property Listings

OpenSooq Scraper - Sale & Rent Property Listings

Extract OpenSooq property listings across 20 country markets, including prices, bedrooms, locations and photos. Choose sale or rent and pay per delivered listing row plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

2

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

OpenSooq Scraper

Extract OpenSooq sale and rent listings from 20 country markets as property rows you can export and compare.

  • Collect prices, bedrooms, bathrooms, floor area, locations and photos when available.
  • Search by country, city and property category, or supply OpenSooq URLs.
  • Include descriptions and advertiser information with optional detail collection.
  • Download rows or use them in scheduled reports and AI tools.
  • Pay $3.00 per 1,000 rows on the Free plan, plus a small start fee.

What does OpenSooq Scraper do?

OpenSooq Scraper collects property listings from OpenSooq country sites. Each row represents one listing, whether it is a home for sale, a rental, land or commercial property. Multiple countries and property categories can be included in one run.

  • Property search: choose market, markets or location, with channel set to BUY or RENT.
  • Supplied URLs: use startUrls for property search pages or individual listing pages.
  • Detail collection: scrapeDetails defaults to true, adding available descriptions, attributes and advertiser information to the same row, not a separately billed row.
  • Listing status: postStatus selects active or sold listings. Sold searches cannot be combined with location.

Configured markets are United Arab Emirates (AE), Bahrain (BH), Algeria (DZ), Egypt (EG), Iraq (IQ), Jordan (JO), Kuwait (KW), Lebanon (LB), Libya (LY), Morocco (MA), Mauritania (MR), Oman (OM), Palestine (PS), Qatar (QA), Saudi Arabia (SA), Sudan (SD), Syria (SY), Tunisia (TN), Turkey (TR) and Yemen (YE). Availability and field coverage vary by market; this list is not a guarantee that every search returns rows.

What data can you extract from OpenSooq?

Listing rows

FieldDescriptionExample
listingIdOpenSooq listing identifier100000001
rowTypeKind of rowlisting
urlListing pagehttps://jo.opensooq.com/en/search/100000001
titleAdvertised property titleApartment for sale in Amman
marketCountry codeJO
channelSale or rentBUY
priceDisplayed price85,000 JOD
priceAmountNumeric price85000
currencyPrice currencyJOD
numBedroomsBedroom count or label3
numBathroomsBathroom count or label2
sizeProperty area150
sizeUnitArea unitm2
categoryListing's own property categoryapartment
requestedPropertyTypeCategory requested in the inputapartment
cityCity nameAmman
neighborhoodArea within the city, if shownnull
addressArea-level location object{"locality":"Amman","country":"Jordan"}
geoCoordinates when available{"lat":null,"lng":null}
furnishedFurnishing labelUnfurnished
rentalPeriodRental interval when shownMonthly
descriptionListing descriptionThree-bedroom apartment
imagesPhoto URLs[]
phonesVisible masked phone snippets[{"value":"+1 555 01XX","type":"mobile","partial":true}]
personIndividual advertiser information{"name":"Jane Doe","role":"owner"}
orgProperty agency or shop information{"name":null}
leadAbsencesReasons contact information is missing{"emails":"本站无"}
listingStatusSource listing statusnull
postedAtPublication timestamp, when availablenull
scrapedAtCollection timestamp2026-10-24T00:00:00+00:00

Rows can also include floor, attributes, ownerName, ownerListings and imageCount. Do not confuse requestedPropertyType with the listing's own category. Some values are absent on search pages and require scrapeDetails: true.

leadAbsences may contain source reason labels: 本站无 means not offered by the site, 闸门锁 means restricted contact access, and 未验证 means unverified. leadReveal: "click" describes the site's contact control; it does not mean the Actor retrieved a full phone number.

How to scrape OpenSooq

  1. Open OpenSooq Scraper in Apify Console.
  2. Fill a target field, such as market: "JO".
  3. Set maxItems to 3 for a small first run. If maxResults is also filled, clear it or use the same value because it takes precedence.
  4. Click Start and wait for completion.
  5. Open the dataset and download rows, or read them through the API.

An empty input starts an example search for apartments for sale in Amman, Jordan, limited to 3 rows. Normal event prices apply. Filling any target field selects the single search mode automatically.

Choose a country and BUY or RENT. Use a city slug such as amman in location; leave it empty for a national search. With only location filled, the country is Jordan. A nonempty markets list overrides market.

Use propertyType for one category or propertyTypes for several. Categories include apartments, villas, land, offices, shops and warehouses. hotel-apartment and shared-rooms are rent-only. all selects the broad property category; expandAllCategories: true expands its categories. Selected categories share each market's row allowance.

Search or listing URLs

Put OpenSooq URLs into startUrls. These take precedence over generated country and category searches. A search URL returns matching listings; an individual listing URL requests that property. Other page types, such as advertiser profiles, are not supported inputs.

What to fill in

Defaults below describe an ordinary targeted run; the empty-input example uses the form's sample values instead.

FieldWhat to enterDefault
startUrlsOpenSooq property search or listing URLsEmpty
marketCountry code, or allJO when omitted
marketsCountry codes; overrides marketEmpty
locationCity slug within the chosen countryNational search
channelBUY or RENTBUY
propertyTypeOne categoryall
propertyTypesCategories; overrides propertyType[]
expandAllCategoriesExpand all into supported categoriesfalse
localeen, ar, or empty for market defaulten
postStatusactive or sold; omit city for sold searchesactive
maxItemsRows per URL or market, from 1 to 2,00070
maxResultsAlternative row limit; overrides maxItemsUnset; form sample 3
maxPagesSearch pages per search URL, from 1 to 1001
maxSearchUrlsMaximum generated searches, from 1 to 50060
scrapeDetailsAdd available listing detail fieldstrue
failOnPartialRequest failure when collection is flagged incompletefalse
requestDelayMillisPause between requests, in milliseconds800
maxConcurrencyConcurrent detail requests, from 1 to 82

Search example:

{
"market": "JO",
"location": "amman",
"channel": "BUY",
"propertyType": "apartment",
"maxItems": 3
}

Multiple markets, sharing the same search settings:

{
"markets": ["JO", "AE"],
"channel": "RENT",
"propertyType": "apartment",
"maxItems": 2
}

URL input:

{
"startUrls": [{"url": "https://jo.opensooq.com/en/property/apartments-for-sale"}],
"maxItems": 3
}

maxItems is the per-input limit. maxResults and limit are also accepted; prefer one limit field. Unknown fields do not fail the run: close misspellings can be corrected, and other fields are ignored with a note. Unsupported optional filter values can also be dropped with a warning.

Unrunnable input, such as an invalid market, stops with INVALID_INPUT: followed by the field and correction guidance, before any rows are charged. This does not waive the start fee. The INPUT_REPORT record in the default key-value store shows how the Actor interpreted the input, including corrections, ignored fields and example-run selection. Check it if the output differs from your intended search.

Output example

This illustrative row uses example values, not a live property or advertiser.

{
"id": "100000001",
"listingId": "100000001",
"rowType": "listing",
"url": "https://jo.opensooq.com/en/search/100000001",
"source": "opensooq",
"sourceLayer": "srp+ldp",
"market": "JO",
"channel": "BUY",
"title": "Apartment for sale in Amman",
"category": "apartment",
"price": "85,000 JOD",
"priceAmount": 85000,
"currency": "JOD",
"numBedrooms": 3,
"numBathrooms": 2,
"size": 150,
"sizeUnit": "m2",
"city": "Amman",
"phones": [{"value": "+1 555 01XX", "type": "mobile", "partial": true}],
"emails": [],
"person": {"name": "Jane Doe", "role": "owner"},
"org": {"name": null},
"images": [],
"scrapedAt": "2026-10-24T00:00:00+00:00"
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. OUTPUT and RUN_SUMMARY in the key-value store contain counts, warnings and run information, rather than additional property rows.

Why use this OpenSooq scraper?

  • Pay for delivered rows. Row charges apply to listings written to your dataset, not pages attempted.
  • Keep delivered results. Rows already in the dataset remain available after a stop or timeout. A collection that ends early can also return partial results; inspect RUN_SUMMARY for warnings.
  • Understand failures. Invalid input identifies the field; failed collection writes an ERROR_SUMMARY.
  • Avoid invented details. Missing contact values stay empty, and masked phones remain marked partial.
  • Compare several inputs. Combine countries or URLs, retaining the market and source URL on each row.
  • No proxy configuration. You do not need to set up proxies.

How much does it cost to scrape OpenSooq?

The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with at least one event. At the default 512 MB memory, the start charge is $0.005.

Apify planStart charge at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.003$3.00
Starter$0.005$0.003$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20
Platinum$0.005$0.0020$2.00
Diamond$0.005$0.0016$1.60

Platform usage is included in these prices.

  • maxItems applies to each URL or market, defaults to 70, and accepts up to 2,000. Larger requests are collected in parts of 70; categories share their market's allowance.
  • Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. These are limits set by the Actor developer.
  • The whole run stops at your Maximum cost per run (maxTotalChargeUsd in the API). Page limits, available listings and collection errors can reduce the delivered count.

Example: two markets returning 3 rows each produce 6 billed rows. On the Free plan, at 512 MB, the charge is $0.005 + 6 × $0.003 = $0.023. Detail fields stay in their listing row and do not add another row charge.

What happens when the run timeout is too short

When the Actor expects results after the available run time, it can pause rather than fail. Its status message is "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The estimate replaces N, and the run temporarily shows ABORTED.

When results are ready, the same run resumes automatically, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped rather than delivered or charged twice. No manual restart is needed for this pause.

Automatic re-pausing is limited. Keep the default timeout of 3,600 seconds to reduce interruptions. Other failures and a manual abort are not the same as this automatic pause.

Synchronous API calls (run-sync and run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset while the run is paused. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.

Use with AI agents and the API

Apify MCP server

Add this remote server in Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:

https://mcp.apify.com?tools=lentic_clockss/opensooq-real-estate-scraper

Sign in with Apify through OAuth, or provide Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can then read rows with get-dataset-items.

For clients without remote MCP support, run npx @apify/actors-mcp-server --tools lentic_clockss/opensooq-real-estate-scraper with APIFY_TOKEN set.

Example prompt: "Find three apartments for sale in Amman, Jordan. Include prices, bedrooms and listing URLs."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/opensooq-real-estate-scraper").call(
run_input={"market": "JO", "propertyType": "apartment", "maxItems": 3}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/opensooq-real-estate-scraper')
.call({ market: 'JO', propertyType: 'apartment', maxItems: 3 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~opensooq-real-estate-scraper/runs with the Authorization: Bearer <YOUR_APIFY_TOKEN> header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Integrations

Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or your webhook. Apify Schedules can start recurring runs.

FAQ

The Actor collects publicly visible listing information. You are responsible for complying with OpenSooq's terms and applicable data protection law. Public personal data still needs a lawful basis for collection and use; seek legal advice if unsure.

Why did my run end as ABORTED?

Check its status message. The automatic pause described above resumes the same run when results are ready. A manually aborted run is different; rows already delivered remain in the dataset.

How many results can I get?

Up to maxItems per URL or market, subject to available listings, maxPages, maxSearchUrls and your spending limit. The default is 70. Free-plan runs stop at 200 rows in total.

Why are some fields empty?

Listings do not all show the same attributes. Detail collection can add fields missing from search results, but it cannot supply information absent from the listing or reveal restricted contact details.

Can I scrape Jordan apartments for sale?

Yes. Use market: "JO", channel: "BUY" and propertyType: "apartment". Add location: "amman" for Amman, or leave it empty for national results.

Can I search UAE, Egypt or Saudi Arabia together?

Use markets: ["AE", "EG", "SA"]. Leave location empty unless the same location input is appropriate for every selected country. Each market receives its own row allowance.

Can I get full phone numbers and email addresses?

No full-phone reveal is provided. The Actor records visible masked snippets as phones with partial: true. Email lists are empty; advertiser names may be available in person or org.

Why did my free-plan runs stop after 10 runs?

The developer's Free-plan allowance is 10 runs of this Actor, not 10 per day. The run reports FREE_TIER_LIMIT when that allowance is exhausted. Paid-plan runs remain subject to their spending limit.

Limitations

  • Supported inputs are property searches and listing URLs, not seller profiles, chats or unrelated OpenSooq categories.
  • postStatus: "sold" cannot be combined with location. It is not a guarantee of a complete historical archive.
  • Addresses are area-level; street, unit and postal-code values are not supplied. Coordinates may be missing.
  • Advertiser classification as an individual or agency is an estimate, not verified business identity.
  • Websites, social links and complete phone numbers are not supplied. Detail collection does not remove those limits.
  • A configured country or category may have no matching or accessible listings. A genuine empty search can succeed with zero rows.

More real estate and property data scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.