Scrappa's GET /api/aqarmap/search returns Egyptian properties for sale (section=sale, the default) or rent (section=rent) from Aqarmap as structured JSON.
What you get
One request returns one page of listings and Aqarmap's own match count in meta.pagination.total. Each listing has id, url, title, description, price (a number in EGP), area in square metres, address, latitude, longitude, the location chain, rooms, baths, floor, year_built, finish_type, amenities, the payment method and payment_plans, price and sale flags, photo URLs, published_at, updated_at and a seller summary. Phone numbers are never returned.
Filters are honoured
Every filter is applied by Aqarmap and checked again before the response is built: section, price range, area range, exact rooms, exact baths, finish_type and payment_method. A listing that breaks a filter is dropped and counted in meta.filtered_out. Unknown parameters are rejected with 422, never ignored. property_type is checked against Aqarmap's property type list; an unknown id returns 422 (INVALID_PROPERTY_TYPE).
Property types
property_type is a roll-up: type 1 (apartments) also returns its sub types. Common ids: 1 apartments, 8 furnished apartments, 7 chalets, 16 villas, 11 land, 5 buildings, 14 commercial, 13 administrative, 47 medical.
Sorting and paging
sort is date-desc (newest first, the default), price-asc or price-desc. Price order is Aqarmap's and is not guaranteed to be strict across pages. page is 1 to 500 and limit 1 to 50 (default 22). meta.pagination.page is the real page Aqarmap served. A page past 500 returns 422 without any upstream request. A search with no match is a valid, billable empty result.
Data quality
Values pass through as sellers entered them, so a few listings show unrealistic prices or areas. The location ids come from /api/aqarmap/locations.
Run this endpoint
Endpoint
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
This endpoint has no required query parameters.
18 optional filters available.
string
Optional
sale (default) or rent.
rent
integer
Optional
Location id from the locations endpoint, for example 36 for Maadi.
36
integer
Optional
Property type id, for example 1 (apartments) or 16 (villas). Sub types are included.
1
integer
Optional
Exact room count.
3
integer
Optional
Exact bathroom count.
10
integer
Optional
Minimum price in EGP (monthly rent for rent).
10000
integer
Optional
Maximum price in EGP (monthly rent for rent).
30000
integer
Optional
Minimum area in square metres.
10
integer
Optional
Maximum area in square metres.
10
string
Optional
One of SEMI_FINISHED, SUPER_LUX or WITHOUT_FINISH.
example
integer
Optional
1, 2 or 3. The label of each listing is in payment_method.label.
10
boolean
Optional
true for listings posted by the owner.
true
boolean
Optional
true for listings with a video.
true
string
Optional
Free text matched against the listing, for example garden.
running shoes
string
Optional
date-desc (default), price-asc or price-desc.
relevance
integer
Optional
Page number, 1 to 500.
1
integer
Optional
Listings per page, 1 to 50 (default 22).
10
string
Optional
en (default) or ar. Sets the language of titles, labels and the listing url.
example
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/aqarmap/search?section=rent&location=36&property_type=1&rooms=3&price_min=10000&price_max=30000&limit=10")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
success
data
meta
{
"success": true,
"data": {
"listings": [
{
"id": "7360411",
"slug": "for-rent-cairo-helwan",
"url": "https://aqarmap.com.eg/en/listing/7360411/",
"reference_id": 7360411,
"title": "Apartment for rent in front of the Japanese Garden, 125 m",
"description": "Apartment for rent facing the Japanese Garden, 3 bedrooms, 2 bathrooms.",
"section": {
"id": 2,
"key": "rent",
"title": "For rent"
},
"property_type": {
"id": 1,
"name": "Apartment",
"plural_name": "Apartments",
"slug": "apartment"
},
"price": {
"amount": 10000,
"currency": "EGP"
},
"area": {
"value": 125,
"unit": "sqm"
},
"address": "Helwan",
"location": {
"id": 67,
"name": "Helwan",
"slug": "cairo/helwan",
"full_path": "Greater Cairo / Helwan",
"type": null,
"parent": {
"id": 1,
"name": "Greater Cairo",
"slug": "cairo",
"full_path": "Greater Cairo",
"type": null,
"parent": null
}
},
"rooms": 3,
"baths": 2,
"floor": 1,
"year_built": 2020,
"finish_type": "SUPER_LUX",
"finish_type_label": "Super lux",
"amenities": [
"ELEVATOR",
"SECURITY"
],
"payment_method": {
"id": 1,
"key": "from_owner_cash",
"label": "From owner cash"
},
"payment_plans": [
{
"price": 10000,
"down_payment": null,
"down_payment_percentage": null,
"total_down_payment": 0,
"total_remaining_amount": 10000,
"over_price": null,
"security_deposit": null,
"duration": 30
}
],
"property_view": {
"id": 1
},
"is_price_negotiable": false,
"is_resale": false,
"is_primary": false,
"is_mortgage": false,
"is_featured": false,
"main_photo": {
"id": 47478477,
"caption": null,
"order": 1,
"thumb_url": "https://img-1.aqarmap.com.eg/new-aqarmap-media/search-thumb-webp/2610/6adba8e739dc7555414291.jpg",
"small_url": "https://img-1.aqarmap.com.eg/new-aqarmap-media/small/2610/6adba8e739dc7555414291.jpg",
"large_url": "https://img-1.aqarmap.com.eg/new-aqarmap-media/large/2610/6adba8e739dc7555414291.jpg"
},
"photos": [],
"photo_count": 5,
"published_at": "2026-10-26T01:42:07+03:00",
"updated_at": "2026-10-26T01:42:07+03:00",
"latitude": 29.821,
"longitude": 31.317,
"featured_type": "not_featured",
"has_video": false,
"similar_listings_count": 0,
"similar_listing_ids": [],
"registration_status": null,
"mortgage_options": [],
"seller": {
"id": 4746422,
"name": "Al Hoda Real Estate",
"role": "broker",
"logo": null
}
}
]
},
"meta": {
"endpoint_family": "search",
"billable": true,
"duration_ms": 640,
"filtered_out": 0,
"pagination": {
"page": 1,
"limit": 10,
"total": 413,
"total_pages": 42,
"has_more": true,
"next_page": 2,
"truncated": false
}
}
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Unknown Property Type
The `property_type` is not an Aqarmap property type id (`INVALID_PROPERTY_TYPE`). Aqarmap would ignore it and return every property, so the request is rejected. Non-billable.
{
"meta": {
"billable": false,
"retryable": false,
"endpoint_family": "search"
},
"error": {
"code": "INVALID_PROPERTY_TYPE",
"message": "The property_type is not an Aqarmap property type id. Use an id such as 1 (apartments) or 16 (villas)."
},
"success": false
}Validation Error
A query parameter is missing, unknown or unusable. Unknown parameters are rejected, never ignored. Non-billable.
{
"errors": {
"section": [
"The selected section is invalid."
]
},
"message": "The selected section is invalid."
}Upstream Unavailable
Aqarmap could not be reached after retries, refused the request or answered with a body this API cannot read safely (`UPSTREAM_UNAVAILABLE`). Never billed. Retry when `meta.retryable` is true.
{
"meta": {
"billable": false,
"retryable": true,
"endpoint_family": "search"
},
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The Aqarmap API is temporarily unavailable. Please retry."
},
"success": false
}Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Try It Live
Test this endpoint in our interactive playground with real data.