curl --request GET \
--url https://devapi.prov.ae/v2/public/locations/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://devapi.prov.ae/v2/public/locations/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devapi.prov.ae/v2/public/locations/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://devapi.prov.ae/v2/public/locations/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://devapi.prov.ae/v2/public/locations/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devapi.prov.ae/v2/public/locations/search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devapi.prov.ae/v2/public/locations/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "22222222-2222-2222-2222-222222222222",
"name": "Dubai Marina",
"level": "2",
"path": "Dubai, Dubai Marina"
},
{
"id": "33333333-3333-3333-3333-333333333333",
"name": "Marina",
"level": "3",
"path": "Ajman, Al Zorah, Marina"
}
],
"meta": {
"limit": 20,
"offset": 0,
"total": 350
}
}{
"statusCode": 401,
"code": "OAUTH_TOKEN_EXPIRED",
"message": "OAuth access token expired",
"path": "/v2/public/projects/filters",
"timestamp": "2026-07-27T06:31:04.512Z"
}{
"statusCode": 422,
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"errors": [
"property page should not exist"
],
"path": "/v2/public/developers?page=1&limit=2",
"timestamp": "2026-08-19T07:20:28.507Z"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too Many Requests",
"path": "/v2/public/leads",
"timestamp": "2026-07-27T06:31:04.512Z"
}Search communities and areas
Type-ahead over the whole location tree, relevance-ranked when a term is given. Omit the term to page the tree. Offset-paged like the developers endpoint; page is rejected with 422.
A lead has no location-id field — areaOfInterest is matched by NAME — so send name, and show path in your picker: hundreds of leaf names repeat across the tree, and an ambiguous name cannot be linked.
curl --request GET \
--url https://devapi.prov.ae/v2/public/locations/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://devapi.prov.ae/v2/public/locations/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devapi.prov.ae/v2/public/locations/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://devapi.prov.ae/v2/public/locations/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://devapi.prov.ae/v2/public/locations/search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devapi.prov.ae/v2/public/locations/search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devapi.prov.ae/v2/public/locations/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "22222222-2222-2222-2222-222222222222",
"name": "Dubai Marina",
"level": "2",
"path": "Dubai, Dubai Marina"
},
{
"id": "33333333-3333-3333-3333-333333333333",
"name": "Marina",
"level": "3",
"path": "Ajman, Al Zorah, Marina"
}
],
"meta": {
"limit": 20,
"offset": 0,
"total": 350
}
}{
"statusCode": 401,
"code": "OAUTH_TOKEN_EXPIRED",
"message": "OAuth access token expired",
"path": "/v2/public/projects/filters",
"timestamp": "2026-07-27T06:31:04.512Z"
}{
"statusCode": 422,
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"errors": [
"property page should not exist"
],
"path": "/v2/public/developers?page=1&limit=2",
"timestamp": "2026-08-19T07:20:28.507Z"
}{
"statusCode": 429,
"code": "RATE_LIMITED",
"message": "Too Many Requests",
"path": "/v2/public/leads",
"timestamp": "2026-07-27T06:31:04.512Z"
}Authorizations
The access_token returned by POST /oauth2/token, sent as Authorization: Bearer <access_token>. It is an opaque string, not a JWT.
Query Parameters
Search term. Aliases q and query are accepted for the same value.
Alias for search.
Alias for search.
Page size, default 50, clamped to 200. meta.limit echoes the value actually applied, not what was asked for.
1 <= x <= 200Records to skip.
x >= 0CSV of sort keys, most significant first; each may carry its own direction (name:desc, -name). Unknown keys are ignored.
"popular:desc,name:asc"
Default direction for sort keys that do not carry one.
asc, desc