Skip to content
Scrappa Get API key
Fincaraiz API 1 credit/request

Fincaraiz Map Pins API Documentation

GET https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2

Scrappa's GET /api/fincaraiz/map-pins returns the coordinates of every listing matching a filter — one pin per listing, with its id.

This is the platform's only map layer. Unlike search, it is not paginated in the way you would expect: it returns the full spread of pins for the filter rather than a page of them, so responses are large.

Each pin carries the listing id and its coordinates, so you can fetch full detail for the ones a user actually clicks rather than paying for every listing up front.

A multi-valued filter is all or nothing here: property_type_id=2,notanumber is rejected with a 422 and never billed, rather than answered as property_type_id=2. Silently narrowing a filter would return pins the customer did not ask for and charge them for the narrower answer. The same rule applies on search.

Fincaraiz Map Pins API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "returned": 2,
    "applied_filters": {
        "operation_type_id": 1,
        "property_type_id": [
            2
        ]
    },
    "pins": [
        {
            "id": "191347339",
            "project_id": null,
            "latitude": 10.4236,
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

This endpoint has no required query parameters.

4 optional filters available.

operation_type_id integer Optional

1 for sale (default) or 2 for rent.

Example value 1
property_type_id integer Optional

One or more of 1 house, 2 apartment, 3 lot, 4 commercial premises.

Example value 2
rows integer Optional

Pins per page, 1-200 (default 100). Echoed back as rows exactly as applied.

Example value 10
page integer Optional

Result page, 1-based. Echoed back as page exactly as applied.

Example value 1

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
PHP
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2"
C#
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/fincaraiz/map-pins?operation_type_id=1&property_type_id=2")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

success returned applied_filters pins meta

Common pins fields

id project_id latitude longitude
JSON Response
200 OK
{
    "success": true,
    "returned": 2,
    "applied_filters": {
        "operation_type_id": 1,
        "property_type_id": [
            2
        ]
    },
    "pins": [
        {
            "id": "191347339",
            "project_id": null,
            "latitude": 10.4236,
            "longitude": -75.5478,
            "point_type": "property",
            "md5": "..."
        }
    ],
    "meta": {
        "billable": true,
        "endpoint_family": "map-pins",
        "attempts": 1
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Unsupported Filter

A filter this endpoint cannot apply, or a list with any unusable entry, was supplied (`unknown_filter`). Non-billable.

{
    "meta": {
        "billable": false,
        "retryable": false,
        "endpoint_family": "map-pins"
    },
    "error": {
        "code": "unknown_filter",
        "message": "property_type_id must be a comma list of numeric type ids, for example property_type_id=1,2. A partial list is rejected rather than silently narrowed."
    },
    "success": false
}
503

Upstream Unavailable

The upstream request failed after retries. Retryable and never billed.

{
    "meta": {
        "billable": false,
        "retryable": true,
        "endpoint_family": "map-pins"
    },
    "error": {
        "code": "upstream_unavailable",
        "message": "Fincaraiz is temporarily unavailable. Please retry."
    },
    "success": false
}
503

Unreadable Response

Fincaraiz answered 200 with something other than a list of pins — an envelope, an empty object, or a list holding a non-record (`parser_drift`). Nothing is charged for it; an unreadable body is never published as an empty map. Retryable.

{
    "meta": {
        "billable": false,
        "retryable": true,
        "endpoint_family": "map-pins"
    },
    "error": {
        "code": "parser_drift",
        "message": "Fincaraiz returned an unreadable response. Please retry."
    },
    "success": false
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Related Endpoints

Fincaraiz API FAQ

Is there a limit on map pins?

No hard limit, but broad filters return a large payload — roughly a megabyte for a national sale search. Narrow by property type or location when you can.

Try It Live

Test this endpoint in our interactive playground with real data.