# Bproperty Property Search API Documentation

Scrappa's `GET /api/bproperty/search` returns Bproperty listings in Bangladesh as structured JSON, for sale or for rent, with location, price, bedrooms, bathrooms, type and category filters, sort and paging.

## Sale and rent

`status` is required: `sale` or `rent`. Prices are in BDT. A rent price is per month unless `price_postfix` says otherwise.

## What you get

One request returns one page of listings, Bproperty's own match count in `total`, the real `page`, `per_page` and `total_pages`, and `has_more`. Each listing has `id`, `slug`, `bn_id`, `url`, `title`, `description`, `status`, `type`, `price`, `price_postfix`, `negotiable`, `address`, `latitude`, `longitude`, `area`, `category`, `features`, `thumbnail`, `images`, `attributes` (bedrooms, bathrooms, kitchens, size, floors, furnishing and more), `featured`, `premium`, `verified`, `agent` and dates. A field Bproperty does not state is left out. A hidden price is `null` with `price_hidden` true, never 0. Phone numbers in descriptions are masked. Call the listing endpoint for one full record.

## Filters are honoured

Every filter is applied by Bproperty and checked again on each returned listing. A listing that breaks a requested filter is dropped and is never replaced from another page. `meta.excluded_on_page` counts the dropped ones. Bedrooms and bathrooms match the exact number. Unknown parameters and values return `422`. `applied_filters` echoes what was sent.

## Location

Take `area` from `search_params` of `/api/bproperty/location-autocomplete`. Take `city` from `/api/bproperty/cities` and `category` from `/api/bproperty/categories`. A map box needs all of `min_lat`, `max_lat`, `min_lng` and `max_lng`. Many listings state no coordinates and are not found by a map box.

## Sorting and paging

`sort` is `-orderingDate` (default, newest first), `-created`, `price` or `-price`. `page` is 1-based and `per_page` is 1 to 50 (default 20). A page past the last one returns an empty list with the real `total`. It never returns another page's listings.

## Agent listings

Set `agent_id` to list the homes of one agent. Take the id from `agent.id` of a listing.

## Not included

There is no area size filter, because Bproperty offers none. The size of a listing is data only, in `attributes.size`.

- **Documentation:** [https://scrappa.co/docs/bproperty-api/bproperty_search](https://scrappa.co/docs/bproperty-api/bproperty_search)
- **API group:** Bproperty API
- **Endpoint:** `GET https://scrappa.co/api/bproperty/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | string | Yes | sale or rent. |
| `type` | string | No | residential or commercial. |
| `category` | string | No | Category id from the categories endpoint. |
| `area` | string | No | Area id from location-autocomplete. |
| `city` | string | No | City id from the cities endpoint. |
| `agent_id` | string | No | Only listings of this agent (agent.id of a listing). |
| `q` | string | No | Free text in title, address, description, area or city. A listing number such as BN-29192 also works. |
| `min_price` | number | No | Minimum price in BDT. |
| `max_price` | number | No | Maximum price in BDT. |
| `bedrooms` | integer | No | Exact number of bedrooms, 1 to 50. |
| `bathrooms` | integer | No | Exact number of bathrooms, 1 to 50. |
| `verified` | boolean | No | true for verified listings only. |
| `featured` | boolean | No | true for featured listings only. |
| `min_lat` | number | No | South edge of a map box. Needs max_lat, min_lng and max_lng. |
| `max_lat` | number | No | North edge of a map box. |
| `min_lng` | number | No | West edge of a map box. |
| `max_lng` | number | No | East edge of a map box. |
| `sort` | string | No | -orderingDate (default, newest first), -created, price (low to high) or -price (high to low). |
| `page` | integer | No | Result page, 1-based. |
| `per_page` | integer | No | Listings per page, 1 to 50. Default 20. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/bproperty/search?status=rent&min_price=20000&max_price=30000&bedrooms=3&per_page=20"
```

## Example response

```json
{
    "success": true,
    "page": 1,
    "per_page": 20,
    "total": 768,
    "total_pages": 39,
    "has_more": true,
    "applied_filters": {
        "status": "rent",
        "min_price": 20000,
        "max_price": 30000,
        "bedrooms": 3,
        "sort": "-orderingDate"
    },
    "listings": [
        {
            "id": "b2yt0jncuz0teyg",
            "slug": "premium-3-bedroom-residence-in-baridhara-diplomatic-zone-29172",
            "bn_id": 29172,
            "url": "https://www.bproperty.com/property/premium-3-bedroom-residence-in-baridhara-diplomatic-zone-29172",
            "title": "Premium 3-Bedroom Residence in Baridhara Diplomatic Zone",
            "description": "Strategic 3,000 sqft semi-furnished apartment for rent in Baridhara.",
            "status": "Rent",
            "type": "Residential",
            "price": 120000,
            "price_postfix": "Per Month",
            "negotiable": true,
            "address": "Dhaka",
            "area": {
                "id": "ia0k6ykx1x0j9gn",
                "name": "Baridhara Diplomatic Zone",
                "city_id": "eyz5vhrduc9tsk0",
                "city": "Dhaka"
            },
            "category": {
                "id": "1fn9ieyhdl7vgya",
                "name": "Apartment",
                "slug": "apartment",
                "property_type": "Residential"
            },
            "features": [
                {
                    "id": "7ni7mtte612sj9i",
                    "name": "Garage"
                },
                {
                    "id": "fcxyt7qo4bs9u9e",
                    "name": "Parking"
                }
            ],
            "thumbnail": "https://api.bproperty.com/api/files/a4alnectuppemjo/b2yt0jncuz0teyg/img_20261006_115448_028_bunbkzami2.webp?thumb=310x0",
            "images": [
                "https://api.bproperty.com/api/files/a4alnectuppemjo/b2yt0jncuz0teyg/img_20261006_115554_859_iip7nlkegs.webp"
            ],
            "image_count": 12,
            "attributes": {
                "bedrooms": 3,
                "bathrooms": 3,
                "size_raw": "3000",
                "size": 3000,
                "size_unit": "sqft",
                "furnishing": "Semi Furnished"
            },
            "featured": true,
            "premium": true,
            "verified": true,
            "is_project": false,
            "agent": {
                "id": "9tbx5mt7au0r2qp",
                "name": "BestBari",
                "role": "buyer",
                "verified": true
            },
            "created_at": "2026-10-17 18:59:05.922Z",
            "expires_at": "2027-04-17 18:59:47.381Z"
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 1,
        "excluded_on_page": 0
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Filters Rejected | Bproperty refused the filter combination (`upstream_rejected`). Non-billable. |
| 422 | Validation Error | A query parameter is missing, unknown or unusable. Unknown parameters and unknown values are rejected, never ignored. Non-billable. |
| 503 | Upstream Unavailable | Bproperty could not be reached after one retry, answered with an error or changed its format (`upstream_unavailable`, `upstream_blocked`, `parser_drift`). Retryable and never billed. Clients are never rate limited. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
