Fazaa APIfazaa.com ↗
Access Fazaa.ae offers, categories, cities, membership tiers, used cars, leases, daily rentals, and Amakin venues via 10 structured endpoints.
What is the Fazaa API?
The Fazaa API exposes 10 endpoints covering the full range of content on Fazaa.ae, the UAE employee benefits platform. You can search and filter offers by keyword, city, category, or coordinates using search_offers, fetch full offer details by slug with get_offer_details, retrieve car listings across three transaction types, and look up nearby partners by latitude and longitude — all returning structured JSON with localized English and Arabic fields.
curl -X GET 'https://api.parse.bot/scraper/eabc774a-c7ce-4288-8e49-0d748c9ead62/search_offers?page=0&size=20&query=restaurant' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fazaa-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Fazaa API Client - Parse.bot Integration
Access offers, categories, locations, and special services on Fazaa.ae.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Dict, List, Optional
class ParseClient:
"""Client for Fazaa API via Parse.bot scraper service."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse client.
Args:
api_key: API key for Parse.bot. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "d0159518-70f3-455a-ad7a-d2cb5f42cc2e"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Set PARSE_API_KEY environment variable or pass api_key parameter."
)
def _call(
self, endpoint: str, method: str = "POST", **params
) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'search_offers')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters
Returns:
Response JSON as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
else:
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
def search_offers(
self,
category: Optional[str] = None,
query: Optional[str] = None,
city_id: Optional[str] = None,
latitude: Optional[float] = None,
longitude: Optional[float] = None,
page: int = 0,
size: int = 20,
) -> Dict[str, Any]:
"""
Search for offers with filters like category, city, keyword, and coordinates.
Args:
category: Category slug (e.g., 'new-offers', 'dining')
query: Search keyword
city_id: City ID for filtering
latitude: Latitude for geolocation search
longitude: Longitude for geolocation search
page: Page number (0-indexed)
size: Results per page
Returns:
Dictionary with 'content' (list of offers) and 'total' count
"""
params = {
k: v
for k, v in {
"category": category,
"query": query,
"city_id": city_id,
"latitude": latitude,
"longitude": longitude,
"page": page,
"size": size,
}.items()
if v is not None
}
return self._call("search_offers", method="GET", **params)
def get_offer_details(self, slug: str) -> Dict[str, Any]:
"""
Get full details of a specific offer using its slug.
Args:
slug: The offer slug (e.g., 'indish-indian-restaurant')
Returns:
Dictionary with offer details including slug, id, partner, and localData
"""
return self._call("get_offer_details", method="GET", slug=slug)
def list_categories(self) -> Dict[str, Any]:
"""
List all available offer categories.
Returns:
Dictionary with 'categories' array containing category objects
"""
return self._call("list_categories", method="GET")
def list_cities(self) -> Dict[str, Any]:
"""
List all available cities grouped by country.
Returns:
Dictionary with 'countries' array containing cities
"""
return self._call("list_cities", method="GET")
def get_membership_benefits(self) -> Dict[str, Any]:
"""
Retrieve membership tiers and their associated benefits.
Returns:
Dictionary with pageName and localData containing benefit details
"""
return self._call("get_membership_benefits", method="GET")
def get_used_cars(self) -> Dict[str, Any]:
"""
Retrieve listings for Fazaa used cars.
Returns:
Dictionary with 'content' array of car listings
"""
return self._call("get_used_cars", method="GET")
def get_long_term_car_lease(self) -> Dict[str, Any]:
"""
Retrieve long-term car lease options.
Returns:
Dictionary with 'content' array of lease options
"""
return self._call("get_long_term_car_lease", method="GET")
def get_daily_rental(self) -> Dict[str, Any]:
"""
Retrieve daily car rental offers.
Returns:
Dictionary with 'content' array of rental offers
"""
return self._call("get_daily_rental", method="GET")
def get_amakin(self) -> Dict[str, Any]:
"""
Retrieve Fazaa Amakin (places/venues) listings.
Returns:
Dictionary with 'content' array of amakin offers
"""
return self._call("get_amakin", method="GET")
def find_on_map(self, latitude: float, longitude: float) -> Dict[str, Any]:
"""
Search for partners/offers near a location.
Args:
latitude: Latitude coordinate
longitude: Longitude coordinate
Returns:
Dictionary with 'results' array of nearby locations/partners
"""
return self._call("find_on_map", method="GET", latitude=latitude, longitude=longitude)
if __name__ == "__main__":
# Initialize client with API key
client = ParseClient()
print("=" * 70)
print("FAZAA API - PRACTICAL WORKFLOW EXAMPLE")
print("=" * 70)
# Step 1: List all categories to understand what's available
print("\n1. Fetching available offer categories...")
categories_response = client.list_categories()
categories = categories_response.get("categories", [])
print(f" Found {len(categories)} categories:")
for cat in categories[:5]: # Show first 5
print(f" - {cat.get('categoryInternalName')} (slug: {cat.get('categorySlug')})")
# Step 2: Get cities to understand location options
print("\n2. Fetching available cities...")
cities_response = client.list_cities()
countries = cities_response.get("countries", [])
uae = next((c for c in countries if "Emirates" in c.get("name", "")), None)
if uae:
cities = uae.get("cities", [])
print(f" Found {len(cities)} cities in UAE:")
for city in cities[:3]: # Show first 3
print(f" - {city.get('internalName')} (id: {city.get('id')})")
dubai_id = cities[0].get("id") if cities else None
else:
dubai_id = None
print(" UAE not found in available countries")
# Step 3: Search for dining offers in Dubai
if dubai_id:
print(f"\n3. Searching for dining offers in Dubai...")
search_response = client.search_offers(
category="dining", city_id=dubai_id, size=5
)
offers = search_response.get("content", [])
total = search_response.get("total", 0)
print(f" Found {total} dining offers (showing {len(offers)}):")
# Step 4: Get detailed information for each offer
print("\n4. Retrieving detailed information for offers...")
for offer in offers:
offer_slug = offer.get("slug")
offer_title = offer.get("title", "Unknown")
partner_name = offer.get("partnerName", "Unknown Partner")
if offer_slug:
try:
details = client.get_offer_details(offer_slug)
local_data = details.get("localData", {})
en_data = local_data.get("en", {})
description = en_data.get("description", "No description")[:60]
partner_info = details.get("partner", {})
partner_link = partner_info.get("partnerLink", "No link")
print(f"\n Offer: {offer_title}")
print(f" Partner: {partner_name}")
print(f" Link: {partner_link}")
print(f" Description: {description}...")
except requests.exceptions.RequestException as e:
print(f"\n Offer: {offer_title}")
print(f" Partner: {partner_name}")
print(f" (Could not retrieve full details: {e})")
# Step 5: Search by location (find offers near specific coordinates)
print("\n5. Finding offers near Dubai coordinates (25.2048, 55.2708)...")
try:
map_response = client.find_on_map(latitude=25.2048, longitude=55.2708)
nearby = map_response.get("results", [])
print(f" Found {len(nearby)} nearby locations/partners:")
for location in nearby[:3]: # Show first 3
name = location.get("name", "Unknown")
lat = location.get("lat", "N/A")
lon = location.get("lon", "N/A")
print(f" - {name} ({lat}, {lon})")
except requests.exceptions.RequestException as e:
print(f" Could not find map results: {e}")
# Step 6: Get membership benefits information
print("\n6. Fetching membership benefits...")
try:
benefits_response = client.get_membership_benefits()
page_name = benefits_response.get("pageName", "Unknown")
print(f" Page: {page_name}")
local_data = benefits_response.get("localData", {})
en_content = local_data.get("en", {}).get("pageContent", "No content")[:100]
print(f" Content: {en_content}...")
except requests.exceptions.RequestException as e:
print(f" Could not fetch benefits: {e}")
print("\n" + "=" * 70)
print("WORKFLOW COMPLETE")
print("=" * 70)Search for offers with filters like category, city, keyword, and coordinates.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed) |
| size | integer | Results per page |
| query | string | Search keyword |
| city_id | string | City ID for filtering |
| category | string | Category slug (e.g., 'new-offers', 'dining') |
| latitude | number | Latitude for geolocation search |
| longitude | number | Longitude for geolocation search |
{
"type": "object",
"fields": {
"total": "total number of results",
"content": "array of offers"
},
"sample": {
"data": {
"total": 433,
"content": [
{
"id": "fb45ee29-b547-4138-b0fb-273d923b7767",
"slug": "smokey-woods-restaurant",
"type": "OFFER",
"title": "25% Discount ",
"imageUri": "/upload/offers/20241007071240_Untitled-1.jpeg",
"subTitle": "Smokey Woods Restaurant",
"locations": [
{
"lat": 0,
"lon": 0,
"geohash": "",
"fragment": true
}
],
"partnerName": "Smokey Woods Restaurant ",
"serviceLink": null,
"serviceType": null,
"serviceSubType": null,
"localizedServiceLink": null,
"localizedMobileServiceLink": null
},
{
"id": "9348db43-b1c8-4a4c-8073-f80786f25be9",
"slug": "beit-el-beiruty-restaurant-and-coffee-shop",
"type": "OFFER",
"title": "20% Discount ",
"imageUri": "/upload/offers/20241205095325_20241205094101_cb6dbe8f-5386-44da-9f41-b9a652388b59.jpg",
"subTitle": "BEIT EL BEIRUTY RESTAURANT AND COFFEE SHOP",
"locations": [
{
"lat": 0,
"lon": 0,
"geohash": "",
"fragment": true
}
],
"partnerName": "BEIT EL BEIRUTY RESTAURANT AND COFFEE SHOP",
"serviceLink": null,
"serviceType": null,
"serviceSubType": null,
"localizedServiceLink": null,
"localizedMobileServiceLink": null
},
{
"id": "1e2b522f-ed8b-4f42-92b8-c8c134c2a167",
"slug": "indira-indian-restaurant",
"type": "OFFER",
"title": "25% Discount",
"imageUri": "/upload/offers/indira-indian-restaurant-holiday-inn-cairo-citystars-hotel-1688462822566.jpg",
"subTitle": " Indira Indian Restaurant- Holiday Inn Cairo - Citystars, hotel",
"locations": [
{
"lat": 30.07430890277261,
"lon": 31.343801212929684,
"geohash": "",
"fragment": true
}
],
"partnerName": " Indira Indian Restaurant",
"serviceLink": null,
"serviceType": null,
"serviceSubType": null,
"localizedServiceLink": null,
"localizedMobileServiceLink": null
}
]
},
"status": "success"
}
}About the Fazaa API
Offers and Search
search_offers accepts a combination of query, city_id, category (e.g. 'dining', 'new-offers'), and geographic coordinates (latitude, longitude) to return a paginated list of offers. Results include a total count and a content array. Pagination is 0-indexed via the page parameter with a configurable size. get_offer_details takes an offer slug and returns a full record including the id, partner object, and localData with both English and Arabic localized content — useful when building bilingual interfaces.
Taxonomy and Geography
list_categories returns all available category objects, which can be passed as slugs to search_offers. list_cities returns countries with their nested city arrays, including the city_id values needed for location-scoped offer searches. Together these two endpoints give you the complete valid parameter space for the search filter dimensions.
Automotive Services
Three dedicated endpoints cover Fazaa's vehicle services: get_used_cars returns car-sale listings, get_long_term_car_lease returns lease options, and get_daily_rental returns short-term rental offers. Each returns a content array of listings. These are separate endpoints reflecting distinct inventory pools rather than a single filterable vehicle catalog.
Membership, Venues, and Map Search
get_membership_benefits returns tier structure and benefit descriptions in localized localData fields, suitable for rendering a membership comparison page. get_amakin retrieves Fazaa Amakin venue and places listings. find_on_map accepts required latitude and longitude values and returns a results array of nearby partners and offers — the geographic complement to the coordinate filtering available in search_offers.
The Fazaa API is a managed, monitored endpoint for fazaa.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fazaa.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fazaa.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a bilingual (EN/AR) UAE deals aggregator using
localDatafields fromget_offer_details - Populate a city-scoped offer feed by combining
list_citiescity IDs with thecity_idfilter insearch_offers - Display a membership tier comparison page using benefit data from
get_membership_benefits - Create a vehicle-finder tool covering used sales, long-term leases, and daily rentals from three dedicated car endpoints
- Show a live map of nearby Fazaa partners using
find_on_mapwith the device's GPS coordinates - Sync offer categories for a UAE employee-benefits app by polling
list_categoriesandsearch_offers - List Amakin venues alongside standard offers in a places-discovery interface using
get_amakin
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Fazaa.ae have an official public developer API?+
What does `get_offer_details` return beyond what `search_offers` provides?+
search_offers returns summary-level offer data in a paginated content array. get_offer_details takes a specific slug and returns the full record, including the partner object with partner-level details and the localData block containing localized text in both English and Arabic — fields that are not necessarily included in the search listing response.Can I filter car listings by make, model, price, or year?+
get_used_cars, get_long_term_car_lease, get_daily_rental) currently accept no filter parameters and return full content arrays. Filtering by attributes like make, price range, or year is not exposed at this time. You can fork this API on Parse and revise it to add filter parameters once you've inspected the fields returned in the content array.How does pagination work in `search_offers`?+
page parameter combined with a size parameter controlling results per page. The response includes a total field indicating the full result count, so you can calculate the number of pages as ceil(total / size).