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

Milanuncios Search API Documentation

GET https://scrappa.co/api/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest

Search live Milanuncios ads. category defaults to 13 (cars); use 131 for flats for sale and 132 for flats for rent, or any id from /categories. Filter by text, province (id from /locations), price range, seller type, bedrooms and surface (real estate) or brand, model, fuel and year (cars). Paginate with limit and offset; the upstream window ends at 10,000 results, so offset + limit may not exceed 10000 and total_hits is a lower bound when total_hits_is_lower_bound is true. sort newest and oldest are not available for real estate categories. A search without matches returns an empty ads array, which is a successful, billable response. Prices are in EUR.

Milanuncios Search API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "data": {
        "ads": [
            {
                "id": "614870125",
                "title": "BMW Serie 1 120d",
                "url": "https://www.milanuncios.com/bmw-de-segunda-mano/bmw-serie-1-120d-614870125.htm",
                "category_ids": [
                    1,
                    13,
                    805
                ],
                "category_names": [
...

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.

15 optional filters available.

category integer Optional

Category id from /categories. 13 cars (default), 131 flats for sale, 132 flats for rent.

Example value 13
query string Optional

Free text, up to 100 characters.

Example value bmw
province integer Optional

Province id from /locations, for example 28 for Madrid.

Example value 10
min_price integer Optional

Minimum price in EUR.

Example value 10
max_price integer Optional

Maximum price in EUR.

Example value 10
seller_type string Optional

professional or private.

Example value example
bedrooms_from integer Optional

Minimum bedrooms (real estate).

Example value 10
surface_from integer Optional

Minimum surface in square metres (real estate).

Example value 10
brand_id integer Optional

Car make id from /car-makes, for example 7 for BMW (cars).

Example value 1234567890
model_id integer Optional

Car model id from /car-models. Requires brand_id.

Example value 1234567890
fuel string Optional

Fuel slug, for example diesel or hybrid (cars).

Example value example
year_from integer Optional

Minimum registration year (cars).

Example value 10
sort string Optional

relevance (default), newest, oldest, cheap, expensive or surface. newest and oldest are rejected for real estate categories.

Example value newest
limit integer Optional

Ads per page, 1 to 100. Defaults to 30.

Example value 3
offset integer Optional

Ads to skip. offset + limit may not exceed 10000. Defaults to 0.

Example value 0

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest",
    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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest');

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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest', 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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest',
    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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest")
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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest", 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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest', 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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest")
        .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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest", 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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest"
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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest"));
            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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest',
            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/milanuncios/search?category=13&query=bmw&limit=3&offset=0&sort=newest")
        .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 data meta
JSON Response
200 OK
{
    "success": true,
    "data": {
        "ads": [
            {
                "id": "614870125",
                "title": "BMW Serie 1 120d",
                "url": "https://www.milanuncios.com/bmw-de-segunda-mano/bmw-serie-1-120d-614870125.htm",
                "category_ids": [
                    1,
                    13,
                    805
                ],
                "category_names": [
                    "Motor",
                    "Coches",
                    "BMW"
                ],
                "price": {
                    "value": 30900,
                    "label": "30.900 \u20ac"
                },
                "attributes": {
                    "kilometers": 9000,
                    "year": 2026,
                    "fuel": "hybrid",
                    "transmission": "AUTOMATIC",
                    "hp": 163,
                    "doors": 5,
                    "color": "blanco"
                },
                "location": {
                    "city": "Ponferrada",
                    "province": "Le\u00f3n",
                    "region": "Castilla y Le\u00f3n"
                },
                "seller_type": "professional",
                "published_at": "2026-09-15T10:02:37Z",
                "updated_at": "2026-10-15T15:29:08Z",
                "images": [
                    "https://images.milanuncios.com/api/v1/ma-ad-media-pro/images/e51e3b1f-2c23-4c97-8b80-b3d99a14d5a5?rule=original"
                ]
            }
        ],
        "total_hits": 10000,
        "total_hits_is_lower_bound": true,
        "offset": 0,
        "limit": 3,
        "has_more": true
    },
    "meta": {
        "endpoint_family": "search",
        "billable": true
    }
}

Errors

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

Not Found

The requested ad or car make was not found or has expired. This response is not billable.

Validation Error

A parameter is invalid, including a sort newest or oldest on a real estate category or an offset + limit above 10000. This response is not billable.

Service Unavailable

The service could not obtain a complete result from Milanuncios. This response is not billable.

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.

Try It Live

Test this endpoint in our interactive playground with real data.