API REFERENCE

    Panama Real Estate Data, via API

    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.

    Browse Endpoints

    11

    Endpoints

    400+

    Buildings

    9,000+

    Verified Comps

    Base URLhttps://api.panacomps.com/api/v1v1 · HTTPS only
    QUICK START

    Up and running in minutes

    Three steps from receiving your key to querying live registry data.

    01

    Request an API key

    Contact us to request access. Keys are issued to verified partners and enterprise clients. We'll confirm your access tier and send credentials securely.

    02

    Authenticate every request

    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.

    03

    Query the data

    Use standard GET requests against any endpoint. Responses are JSON with a consistent envelope. Paginate large result sets with page and limit parameters.

    javascript
    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"
    AUTHENTICATION

    API Key Authentication

    Every request must include your API key. Two equivalent methods are supported.

    Option A — Bearer Token

    http
    GET /api/v1/buildings HTTP/1.1
    Host: api.panacomps.com
    Authorization: Bearer pk_live_YOUR_API_KEY_HERE

    Option B — X-API-Key Header

    http
    GET /api/v1/buildings HTTP/1.1
    Host: api.panacomps.com
    X-API-Key: pk_live_YOUR_API_KEY_HERE

    Rate Limits

    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

    limit, remaining, and reset (seconds until the window resets)

    RateLimit-Policy

    Your key's limit per 60-second window

    ACCESS

    What your key can access

    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.

    Included with every key

    Registered sales per unit: folio, unit, sale date, price, assessed value, m², $/m², plus building stats, and mortgage and foreclosure records.

    Buyer type, not personal names

    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.

    Documents add-on

    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.

    ENDPOINTS

    14 Endpoints, 3 Resource Groups

    All endpoints are read-only GET requests. Path parameters are shown as :param.

    Buildings

    400+ tracked buildings — stats, properties, liens, and foreclosures

    GET/buildings
    List all buildings with summary statistics.
    GET/buildings/:building
    Get a single building with aggregate stats and property counts.
    GET/buildings/:building/properties
    Paginated list of properties in a building.
    pagelimitsortpriceMinpriceMaxsqmMinsqmMaxdateFromdateTo
    GET/buildings/:building/mortgages
    List active mortgages and liens recorded against units in this building.
    GET/buildings/:building/foreclosures
    List foreclosure actions recorded against units in this building.

    Properties

    Individual units — transactions, valuations, liens, and legal documents

    GET/properties
    Search all properties across buildings, or within one neighborhood.
    buildingneighborhoodfoliounitsortpriceMinpriceMaxsqmMinsqmMaxdateFromdateTopagelimit
    GET/properties/:folio
    Get a single property by its Registro Público folio number.
    GET/properties/:folio/history
    Transaction history, lender and foreclosure records for a property.
    GET/properties/:folio/mortgages
    Mortgages and liens on this property (full legal text with the Documents add-on).
    GET/properties/:folio/foreclosures
    Foreclosure actions on this property (full legal text with the Documents add-on).
    GET/properties/:folio/documents
    All registered documents with OCR-extracted text from Registro Público.Documents add-on

    Neighborhoods

    Every building mapped to the neighborhood buyers know: Costa del Este, Punta Pacífica, Obarrio and more

    GET/neighborhoods
    List neighborhoods with building and property counts, scoped to the buildings your key can access.
    GET/neighborhoods/:id
    Get a single neighborhood by ID, with its building and property counts.
    GET/neighborhoods/:id/buildings
    List all buildings located in a neighborhood.
    REQUEST / RESPONSE

    Consistent JSON format

    All responses follow the same envelope structure, making it easy to handle lists, single objects, and errors uniformly.

    List response

    json
    {
      "data": [ ... ],
      "meta": {
        "page": 1,
        "limit": 20,
        "total": 684,
        "totalPages": 35
      }
    }

    Single object response

    json
    {
      "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.

    Pagination parameters

    ParameterDefaultDescription
    page1Page number (1-indexed)
    limit20Items per page (max 100)

    Filter parameters — /properties and /buildings/:building/properties

    ParameterTypeDescription
    buildingstringFilter by building technical name
    neighborhoodinteger/properties only: filter by neighborhood ID from /neighborhoods (omit for all neighborhoods)
    foliostringExact folio number lookup
    unitstringFilter by unit identifier
    sortstringdate-desc · date-asc · price-desc · price-asc
    dateFrom / dateToISO dateFilter by sale date range (YYYY-MM-DD)
    priceMin / priceMaxnumberFilter by sale amount in USD
    sqmMin / sqmMaxnumberFilter by property size in square meters
    CODE EXAMPLES

    Works with any HTTP client

    Copy-ready examples for the most common languages. Replace pk_live_YOUR_API_KEY_HERE with your issued key.

    JavaScript (fetch)

    javascript
    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); });

    Python (requests)

    python
    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")
    ERROR HANDLING

    Predictable error responses

    All errors return a JSON body with a machine-readable code and a human-readable message.

    HTTPCodeMeaning
    401MISSING_API_KEYNo Authorization or X-API-Key header
    401INVALID_API_KEYKey not recognised
    403API_KEY_DISABLEDKey has been deactivated
    403BUILDING_ACCESS_DENIEDKey is not authorised for this building
    403SCOPE_REQUIREDEndpoint needs an add-on your key doesn't have
    400INVALID_IDNon-numeric ID parameter
    404BUILDING_NOT_FOUNDBuilding identifier not found
    404PROPERTY_NOT_FOUNDFolio number not found
    404NOT_FOUNDEndpoint does not exist
    429RATE_LIMIT_EXCEEDEDToo many requests — slow down
    500INTERNAL_ERRORServer error — contact support

    Error response shape

    json
    // 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

    Ready to integrate?

    API access is available for verified partners and enterprise clients. Contact us for pricing, key issuance, and onboarding support.