Access verified comp data, transaction histories, mortgage records, and neighborhood analytics directly from Panama's Registro Público via a clean, versioned REST API.
14
Endpoints
3
Resource Groups
9,000+
Verified Comps
86
Neighborhoods
https://api.panacomps.com/api/v1v1 · HTTPS onlyThree steps from receiving your key to querying live registry data.
Contact us to request access. Keys are issued to verified partners and enterprise clients. We'll confirm your access tier and send credentials securely.
Include your key as a Bearer token in the Authorization header, or pass it via the X-API-Key header. All requests must use HTTPS.
Use standard GET requests against any endpoint. Responses are JSON with a consistent envelope. Paginate large result sets with page and limit parameters.
const response = await fetch(
'https://api.panacomps.com/api/v1/buildings',
{
headers: {
'Authorization': 'Bearer pk_live_YOUR_API_KEY_HERE'
}
}
);
const { data } = await response.json();
// data → array of building objects
console.log(data[0].name);
// → "P.H. BIJAO BEACH CLUB & RESIDENCES"Every request must include your API key. Two equivalent methods are supported.
GET /api/v1/buildings HTTP/1.1 Host: api.panacomps.com Authorization: Bearer pk_live_YOUR_API_KEY_HERE
GET /api/v1/buildings HTTP/1.1 Host: api.panacomps.com X-API-Key: pk_live_YOUR_API_KEY_HERE
Requests are rate-limited per API key using a sliding one-minute window. Default limit is 100 requests per minute. Exceeded limits return HTTP 429 with code RATE_LIMIT_EXCEEDED.
RateLimit-LimitYour key's limit per minute
RateLimit-RemainingRequests left in current window
RateLimit-ResetUnix timestamp when window resets
All endpoints are read-only GET requests. Path parameters are shown as :param.
350+ tracked buildings — stats, properties, liens, and foreclosures
/buildings/buildings/:building/buildings/:building/properties/buildings/:building/mortgages/buildings/:building/foreclosuresIndividual units — transactions, valuations, ownership, and legal documents
/properties/properties/:folio/properties/:folio/history/properties/:folio/mortgages/properties/:folio/foreclosures/properties/:folio/documents86 neighborhoods — browse areas and find buildings by location
/neighborhoods/neighborhoods/:id/neighborhoods/:id/buildingsAll responses follow the same envelope structure, making it easy to handle lists, single objects, and errors uniformly.
{
"data": [ ... ],
"meta": {
"page": 1,
"limit": 20,
"total": 684,
"totalPages": 35
}
}{
"data": {
"folio": "331717",
"edificio": "P.H. ELEMENT",
"unit": "INTERIOR DEPTO.-E",
"owner": "DANIELLE FERRANDO",
"saleDate": "2011-02-18",
"saleAmount": 164492.54,
"squareMeters": 113.25,
"pricePerSqm": 1452.47
}
}| Parameter | Default | Description |
|---|---|---|
| page | 1 | Page number (1-indexed) |
| limit | 20 | Items per page (max 100) |
/properties and /buildings/:building/properties| Parameter | Type | Description |
|---|---|---|
| building | string | Filter by building technical name |
| folio | string | Exact folio number lookup |
| neighborhood | integer | Filter by neighborhood ID |
| unit | string | Filter by unit identifier |
| sort | string | date-desc · date-asc · price-desc · price-asc |
| dateFrom / dateTo | ISO date | Filter by sale date range (YYYY-MM-DD) |
| priceMin / priceMax | number | Filter by sale amount in USD |
| sqmMin / sqmMax | number | Filter by property size in square meters |
Copy-ready examples for the most common languages. Replace pk_live_YOUR_API_KEY_HERE with your issued key.
const BASE = 'https://api.panacomps.com/api/v1';
const KEY = 'pk_live_YOUR_API_KEY_HERE';
const headers = { 'Authorization': 'Bearer ' + KEY };
// List properties in a building, sorted by recent sales
const res = await fetch(
BASE + '/buildings/BIJAO_BEACH_CLUB/properties' +
'?sort=date-desc&limit=50',
{ headers }
);
const { data, meta } = await res.json();
console.log('Showing ' + data.length + ' of ' + meta.total + ' properties');
data.forEach(p => {
console.log(p.unit, '#x27; + p.saleAmount, p.saleDate);
});import requests
BASE = "https://api.panacomps.com/api/v1"
KEY = "pk_live_YOUR_API_KEY_HERE"
headers = {"Authorization": f"Bearer {KEY}"}
# Search properties with price and size filters
params = {
"building": "BIJAO_BEACH_CLUB",
"sort": "price-desc",
"priceMin": 200000,
"sqmMin": 80,
"limit": 25,
}
r = requests.get(f"{BASE}/properties", headers=headers, params=params)
r.raise_for_status()
result = r.json()
print(f"Found {result['meta']['total']} matching properties")
for prop in result["data"]:
sqm = prop["squareMeters"]
ppsqm = prop["pricePerSqm"]
print(f"{prop['unit']} {sqm}m2 ${ppsqm}/m2")All errors return a JSON body with a machine-readable code and a human-readable message.
| HTTP | Code | Meaning |
|---|---|---|
| 401 | MISSING_API_KEY | No Authorization or X-API-Key header |
| 401 | INVALID_API_KEY | Key not recognised |
| 403 | API_KEY_DISABLED | Key has been deactivated |
| 403 | BUILDING_ACCESS_DENIED | Key is not authorised for this building |
| 400 | INVALID_ID | Non-numeric ID parameter |
| 404 | BUILDING_NOT_FOUND | Building identifier not found |
| 404 | PROPERTY_NOT_FOUND | Folio number not found |
| 404 | NEIGHBORHOOD_NOT_FOUND | Neighborhood ID not found |
| 404 | NOT_FOUND | Endpoint does not exist |
| 429 | RATE_LIMIT_EXCEEDED | Too many requests — slow down |
| 500 | INTERNAL_ERROR | Server error — contact support |
// HTTP 401
{
"error": {
"code": "INVALID_API_KEY",
"message": "The provided API key was not recognised."
}
}
// HTTP 429
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after the RateLimit-Reset time."
}
}API access is available for verified partners and enterprise clients. Contact us for pricing, key issuance, and onboarding support.