Access verified comp data, transaction histories, mortgage records, and building-level statistics directly from Panama's Registro Público via a clean, versioned REST API.
11
Endpoints
400+
Buildings
9,000+
Verified Comps
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.
RateLimitlimit, remaining, and reset (seconds until the window resets)
RateLimit-PolicyYour key's limit per 60-second window
Every key is read-only and scoped to the buildings in your plan. Legal-document text is a separate add-on, enabled per key. Names of individuals are masked unless your account is approved under a signed data-use agreement.
Registered sales per unit: folio, unit, sale date, price, assessed value, m², $/m², plus building stats, and mortgage and foreclosure records.
Company owners, lenders and parties are returned by name. Individuals are returned as "Individual" with ownerType: "individual", and ID numbers (cédulas) are withheld, in line with Panama's Ley 81 de 2019. Approved accounts under a signed data-use agreement receive the full registry record.
OCR text of registered documents and the legal text attached to mortgage and foreclosure records, with individuals' names and ID numbers redacted.
Calling an add-on endpoint without the add-on returns HTTP 403 with code SCOPE_REQUIRED; on other endpoints the add-on fields are simply left out.
All endpoints are read-only GET requests. Path parameters are shown as :param.
400+ tracked buildings — stats, properties, liens, and foreclosures
/buildings/buildings/:building/buildings/:building/properties/buildings/:building/mortgages/buildings/:building/foreclosuresIndividual units — transactions, valuations, liens, and legal documents
/properties/properties/:folio/properties/:folio/history/properties/:folio/mortgages/properties/:folio/foreclosures/properties/:folio/documentsEvery building mapped to the neighborhood buyers know: Costa del Este, Punta Pacífica, Obarrio and more
/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",
"building": "P.H. ELEMENT",
"unit": "INTERIOR DEPTO.-E",
"owner": "INVERSIONES EJEMPLO, S.A.",
"ownerType": "company",
"saleDate": "2011-02-18",
"saleAmount": 164492.54,
"squareMeters": 113.25,
"pricePerSqm": 1452.47
}
}owner is returned as-is for companies. For individuals it reads "Individual" (or "Persona natural" with ?lang=es) and ownerType is "individual". Mortgage and foreclosure parties follow the same rule and cédulas are omitted, unless your key is approved for full registry data.
| 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 |
| neighborhood | integer | /properties only: filter by neighborhood ID from /neighborhoods (omit for all neighborhoods) |
| folio | string | Exact folio number lookup |
| 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 |
| 403 | SCOPE_REQUIRED | Endpoint needs an add-on your key doesn't have |
| 400 | INVALID_ID | Non-numeric ID parameter |
| 404 | BUILDING_NOT_FOUND | Building identifier not found |
| 404 | PROPERTY_NOT_FOUND | Folio number 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 is not valid."
}
}
// HTTP 429
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "You have exceeded your rate limit. Please wait a moment and try again."
}
}API access is available for verified partners and enterprise clients. Contact us for pricing, key issuance, and onboarding support.