DriveArabia APIdrivearabia.com ↗
Access DriveArabia car makes, models, specs, trims, and pricing for the Middle East market via a structured REST API. Covers UAE and KSA regional data.
What is the DriveArabia API?
The DriveArabia API exposes 5 endpoints covering car makes, models, detailed specifications, trim-level pricing, and body type filtering for the Middle East market. The get_car_detail endpoint returns pros, cons, safety information, engine specs, fuel efficiency, and named trims with prices for a given vehicle URL. Lookups can be scoped to UAE or KSA regional pricing via the search_cars country parameter.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/93e063b6-7250-466e-9a6b-1de12619db39/get_makes' \ -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 drivearabia-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.
"""
DriveArabia API Client
Get your API key from: https://parse.bot/settings
A comprehensive client for searching and analyzing car inventory from DriveArabia.com,
including make/model browsing, vehicle search with filters, and detailed specifications.
"""
import os
import requests
from typing import Optional, Dict, Any, List
class ParseClient:
"""Client for interacting with the DriveArabia API via Parse."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API 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 = "93e063b6-7250-466e-9a6b-1de12619db39"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
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., 'get_makes')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters
Returns:
JSON response from the API
"""
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)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def get_makes(self) -> List[Dict[str, Any]]:
"""
List all available car makes/brands.
Returns:
List of car makes with id and English name
"""
result = self._call("get_makes", method="GET")
return result.get("data", [])
def get_models_by_make(self, make_id: int) -> List[Dict[str, Any]]:
"""
List all car models for a specific make.
Args:
make_id: The internal ID of the car make
Returns:
List of car models for the given make
"""
result = self._call("get_models_by_make", method="GET", make_id=str(make_id))
return result.get("data", [])
def search_cars(
self,
country: str = "uae",
body_type: Optional[str] = None,
page: int = 1
) -> Dict[str, Any]:
"""
Search for cars with optional filters.
Args:
country: Country code (e.g., 'uae', 'ksa')
body_type: Filter by body type (e.g., 'Sedan', 'SUV')
page: Page number for pagination
Returns:
Dictionary with 'cars' list and 'page' info
"""
params = {
"country": country,
"page": str(page)
}
if body_type:
params["body_type"] = body_type
response = self._call("search_cars", method="GET", **params)
return response.get("data", {})
def get_car_detail(self, url: str) -> Dict[str, Any]:
"""
Get full details for a specific car.
Args:
url: The car detail page URL (from search_cars)
Returns:
Dictionary with model details, specs, trims, pros, overview, etc.
"""
response = self._call("get_car_detail", method="GET", url=url)
return response.get("data", {})
def get_body_types(self) -> List[str]:
"""
List all available body types.
Returns:
List of body type strings
"""
result = self._call("get_body_types", method="GET")
return result.get("data", {}).get("body_types", [])
if __name__ == "__main__":
client = ParseClient()
print("\n" + "=" * 70)
print("🚗 DriveArabia Vehicle Research Workflow")
print("=" * 70)
# Step 1: Get available body types and display options
print("\n📋 Step 1: Fetching available body types...")
body_types = client.get_body_types()
print(f" ✓ Found {len(body_types)} body types: {', '.join(body_types)}")
# Step 2: Search for SUVs and Sedans in UAE
search_params = [
("SUV", "uae"),
("Sedan", "uae")
]
all_results = {}
for body_type, country in search_params:
print(f"\n🔍 Step 2: Searching for {body_type}s in {country.upper()}...")
search_result = client.search_cars(country=country, body_type=body_type, page=1)
cars = search_result.get("cars", [])
print(f" ✓ Found {len(cars)} {body_type}s on page {search_result.get('page', '1')}")
if cars:
all_results[body_type] = cars
# Display first 3 cars from this category
for i, car in enumerate(cars[:3], 1):
name = car.get("name", "Unknown")
price = car.get("price", "N/A")
print(f" {i}. {name:30} - {price}")
# Step 3: Get detailed information for selected vehicles
print("\n📊 Step 3: Analyzing detailed specifications...")
for body_type, cars in all_results.items():
print(f"\n {body_type} Analysis:")
print(" " + "-" * 50)
for i, car in enumerate(cars[:2], 1): # Analyze first 2 per category
car_name = car.get("name", "Unknown")
car_url = car.get("url")
car_price = car.get("price", "N/A")
print(f"\n Vehicle {i}: {car_name}")
print(f" Price: {car_price}")
if car_url:
try:
details = client.get_car_detail(car_url)
# Extract key information
brand = details.get("brand", "N/A")
model = details.get("model", "N/A")
year = details.get("year", "N/A")
overview = details.get("overview", "No overview available")
specs = details.get("specs", {})
trims = details.get("trims", [])
pros = details.get("pros", [])
cons = details.get("cons", [])
reliability = details.get("reliability", {})
# Display parsed information
print(f" Brand: {brand} | Model: {model} | Year: {year}")
# Overview (truncated)
if overview:
print(f" Overview: {overview[:85]}...")
# Key specs
if specs:
print(f" Key Specs:")
for spec_key, spec_value in list(specs.items())[:4]:
print(f" • {spec_key}: {spec_value}")
# Trims and pricing
if trims:
print(f" Available Trims: {len(trims)}")
for trim in trims[:2]:
trim_name = trim.get("name", "Unknown")
trim_price = trim.get("price", "N/A")
print(f" • {trim_name}: {trim_price}")
# Pros and cons
if pros or cons:
print(f" Pros: {', '.join(pros[:2]) if pros else 'N/A'}")
print(f" Cons: {', '.join(cons[:2]) if cons else 'N/A'}")
# Reliability score
if reliability.get("score"):
print(f" Reliability Score: {reliability.get('score')}/5")
except Exception as e:
print(f" ⚠ Error fetching details: {e}")
# Step 4: Compare makes and their models
print("\n\n🏭 Step 4: Exploring car makes and their models...")
print(" " + "-" * 50)
makes = client.get_makes()
popular_makes = ["Toyota", "Honda", "BMW", "Mercedes-Benz", "Nissan"]
for make_name in popular_makes:
make_obj = next((m for m in makes if m.get("car_make_en") == make_name), None)
if make_obj:
make_id = make_obj.get("id")
models = client.get_models_by_make(make_id)
print(f"\n {make_name}: {len(models)} models available")
if models:
sample_models = [m.get("car_model_en") for m in models[:3]]
print(f" Sample models: {', '.join(sample_models)}")
print("\n" + "=" * 70)
print("✅ Workflow completed successfully!")
print("=" * 70 + "\n")List all available car makes/brands from DriveArabia. Returns an array of make objects with id and English name.
No input parameters required.
{
"type": "object",
"fields": {
"data": "array of make objects, each with id (integer) and car_make_en (string)"
},
"sample": {
"data": [
{
"id": 1725,
"car_make_en": "Abarth"
},
{
"id": 1726,
"car_make_en": "Acura"
}
],
"status": "success"
}
}About the DriveArabia API
Browsing Makes, Models, and Body Types
The get_makes endpoint returns an array of make objects, each with an integer id and an English name (car_make_en). Pass that id to get_models_by_make to retrieve model records that include both English (car_model_en) and Arabic (car_model_ar) names, plus a slug field (car_model_sk). The get_body_types endpoint returns the full list of body type strings — Sedan, SUV, Hatchback, Pickup, Van, Coupe, Convertible — which map directly to the body_type filter on search_cars.
Searching and Filtering Cars
search_cars accepts three optional parameters: page for pagination, country (accepted values: uae, ksa) for regional pricing, and body_type for segment filtering. Each result in the cars array includes the car name, a detail page URL, price, and additional attributes. The returned page field confirms which page of results is active, making it straightforward to iterate through large result sets.
Detailed Vehicle Data
get_car_detail takes a URL sourced from search_cars results and returns a structured object with brand, model, year, title, a specs object (covering fields such as Transmission, Engine Type, Fuel Efficiency, and Origin), and a trims array where each trim has a name and price. The endpoint also returns pros and cons arrays and a safety object, giving a full picture of a vehicle's positioning within a model range.
The DriveArabia API is a managed, monitored endpoint for drivearabia.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when drivearabia.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 drivearabia.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 Middle East new-car price tracker comparing trim-level pricing across UAE and KSA using
search_carsandget_car_detail. - Populate a vehicle selector UI with make and model dropdowns sourced from
get_makesandget_models_by_make. - Generate pros/cons summaries for a car-buying guide app using the
prosandconsarrays fromget_car_detail. - Filter SUV or Sedan inventory by body type and country to feed a regional car comparison tool.
- Extract engine type, transmission, and fuel efficiency specs from
get_car_detailfor a fuel cost calculator. - Track price changes across trims over time by periodically calling
get_car_detailand storing thetrimsarray. - Localize a car listings page by using Arabic model names (
car_model_ar) returned byget_models_by_make.
| 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 DriveArabia have an official developer API?+
What regional markets does the `search_cars` endpoint cover?+
country parameter currently accepts uae and ksa, returning pricing relevant to those markets. Other GCC markets such as Qatar, Bahrain, Kuwait, or Oman are not covered by the current endpoints. You can fork this API on Parse and revise it to add support for additional country codes if DriveArabia surfaces that data.What does the `specs` object in `get_car_detail` contain?+
specs object is a set of key-value pairs drawn from the vehicle's specification sheet. Documented fields include Transmission, Engine Type, Fuel Efficiency, and Origin. The exact keys present vary by vehicle; not every car will have all fields populated.Does the API return user reviews or ratings for vehicles?+
pros and cons arrays and a safety object from get_car_detail, but does not expose user-submitted review scores or review text. You can fork this API on Parse and revise it to add a review-fetching endpoint if that data is accessible on the site.How does pagination work in `search_cars`?+
page parameter to retrieve successive pages of results. The response includes a page field confirming the current page. There is no total-count or total-pages field returned, so you iterate until a page returns an empty cars array.