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.
Run this endpoint
Endpoint
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.
integer
Optional
1 for sale (default) or 2 for rent.
1
integer
Optional
One or more of 1 house, 2 apartment, 3 lot, 4 commercial premises.
2
integer
Optional
Pins per page, 1-200 (default 100). Echoed back as rows exactly as applied.
10
integer
Optional
Result page, 1-based. Echoed back as page exactly as applied.
1
Request Examples
<?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
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();
}
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));
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);
}
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
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()
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}")
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());
}
}
}
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))
}
#!/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"
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}");
}
}
}
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();
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
{
"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.
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
}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
}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.