# 591 Sale Search API Documentation

<p><strong>591 Sale Search API</strong> searches properties for sale in Taiwan. Each item has the id (S and digits), URL, kind, shape, total price in TWD, unit price per ping in TWD, size and main size in ping, rooms, halls, bathrooms, floor, age, street, district ids, community, parking, photos, posting time and owner or agent type. Paging uses a cursor: pages are irregular, so send <code>next_cursor</code> from the answer. When <code>next_cursor</code> is null there are no more rows. A cursor past the end gives an empty list. Filters are always honoured: a row that breaks a filter is never returned (see <code>meta.filtered_out</code>). New-project cards are dropped. With <code>sort</code>, or with age, bathrooms or an open-ended size, the answer comes from the 591 list page and carries more fields (main size, bathrooms, age). If that page cannot be read, the request fails with 503 and is not billed: you never get an unsorted list under a sort label. Rows that 591 boosts (<code>boosted: true</code>) and a few promoted rows can sit out of order. Without those options the default list is used. It has no age or bathroom count, so those fields are null. Unofficial: Scrappa is not affiliated with 591. Chinese text stays as 591 returns it; numeric fields are parsed next to it, and a value 591 does not give is null, never 0. Failed requests are not billable.</p>

- **Documentation:** [https://scrappa.co/docs/591-api/house591_sale_search](https://scrappa.co/docs/591-api/house591_sale_search)
- **API group:** 591 House API
- **Endpoint:** `GET https://scrappa.co/api/591/sale/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 |
| --- | --- | --- | --- |
| `region_id` | integer | Yes | City or county id from the locations route. 1 is Taipei City, 3 is New Taipei City, 17 is Kaohsiung City. |
| `section_ids` | string | No | Comma separated district ids of the chosen region, from the locations route. Example: 5,7. |
| `kind` | integer | No | 5 shop, 6 office, 7 factory, 8 parking, 9 home, 10 suite, 11 land, 12 home office. One value. Leave empty for all kinds. Shops (5) and land (11) cannot be combined with sort, age_max, bathrooms or an open-ended size. |
| `price_min` | integer | No | Minimum total price in TWD. |
| `price_max` | integer | No | Maximum total price in TWD. |
| `area_min` | number | No | Minimum size in ping. |
| `area_max` | number | No | Maximum size in ping. |
| `shape` | string | No | Comma separated: 1 apartment, 2 elevator building, 3 townhouse, 4 villa, 5 mid-rise. Kinds 6, 9, 10, 12 only. |
| `layout` | string | No | Comma separated room count: 1, 2, 3, 4 or 5 (five or more). Kinds 6, 9, 10, 12 only. |
| `bathrooms` | integer | No | Bathroom count 1 to 4 (4 means four or more). |
| `age_max` | integer | No | Maximum building age in years. |
| `keywords` | string | No | Free text such as a street, station or community name. 591 applies it on its side. |
| `sort` | string | No | price_asc, unit_price_asc, newest or area_asc. Leave empty for the 591 order. |
| `cursor` | integer | No | Row offset. Start at 0 and send next_cursor from the previous answer. Sale pages are irregular, so do not compute offsets. |

## Example response

```json
{
    "data": {
        "items": [
            {
                "id": "S21096373",
                "url": "https://sale.591.com.tw/home/house/detail/2/21096373.html",
                "kind": 9,
                "tags": [
                    "AI\u56de\u8986",
                    "\u5f71\u7247\u8cde\u5c4b",
                    "\u660e\u661f\u5b78\u5340",
                    "\u8fd1\u6377\u904b"
                ],
                "floor": 5,
                "halls": 2,
                "rooms": 2,
                "title": "\u6771\u9580\u751f\u6d3b\u5708\ud83d\ude4f\u6771\u9580\u7ad9\ud83d\ude4f\u7cbe\u7f8e\u98a8\u683c",
                "photos": [
                    "https://img1.591.com.tw/house/2026/10/19/179240012476085802.jpg!1000x.water2.jpg"
                ],
                "region": "\u53f0\u5317\u5e02",
                "street": "\u6c38\u5eb7\u8857",
                "address": "\u53f0\u5317\u5e02\u5927\u5b89\u5340\u6c38\u5eb7\u8857",
                "boosted": false,
                "section": "\u5927\u5b89\u5340",
                "age_years": null,
                "area_ping": 53.4,
                "bathrooms": null,
                "has_video": true,
                "kind_name": "\u4f4f\u5b85",
                "posted_at": "2026-10-17T08:38:34+00:00",
                "region_id": 1,
                "owner_type": "agent",
                "price_text": "6,999\u842c\u5143",
                "section_id": 5,
                "shape_name": "\u96fb\u68af\u5927\u6a13",
                "has_parking": null,
                "layout_text": "2\u623f2\u5ef3",
                "price_value": 69990000,
                "community_id": 6788,
                "total_floors": 9,
                "community_name": "\u5927\u5b89\u6c38\u5eb7",
                "main_area_ping": null,
                "refreshed_text": "3\u5c0f\u6642\u524d",
                "unit_price_per_ping": 1424000,
                "price_includes_parking": true
            },
            {
                "id": "S21107027",
                "url": "https://sale.591.com.tw/home/house/detail/2/21107027.html",
                "kind": 9,
                "tags": [
                    "7\u65e5\u4e0a\u65b0",
                    "\u660e\u661f\u5b78\u5340",
                    "\u8fd1\u6377\u904b"
                ],
                "floor": -1,
                "halls": 3,
                "rooms": 5,
                "title": "\u5927\u5b89\u6211\u6700\u4fd7\u26f5\u4e2d\u6b63\u91d1\u83ef\u5b78\u5340\u26f5\u5ead\u9662\u5927\u8eca\u5eab",
                "photos": [
                    "https://img1.591.com.tw/house/2026/10/19/179240338628180108.jpeg!400x300.jpeg"
                ],
                "region": "\u53f0\u5317\u5e02",
                "street": "\u548c\u5e73\u6771\u8def\u4e00\u6bb5",
                "address": "\u53f0\u5317\u5e02\u5927\u5b89\u5340\u548c\u5e73\u6771\u8def\u4e00\u6bb5",
                "boosted": false,
                "section": "\u5927\u5b89\u5340",
                "age_years": null,
                "area_ping": 60.9,
                "bathrooms": null,
                "has_video": false,
                "kind_name": "\u4f4f\u5b85",
                "posted_at": "2026-10-19T09:43:40+00:00",
                "region_id": 1,
                "owner_type": "agent",
                "price_text": "5,988\u842c\u5143",
                "section_id": 5,
                "shape_name": "\u516c\u5bd3",
                "has_parking": null,
                "layout_text": "5\u623f3\u5ef3",
                "price_value": 59880000,
                "community_id": null,
                "total_floors": 5,
                "community_name": "\u548c\u5e73\u6771\u8def\u4e00\u6bb5",
                "main_area_ping": null,
                "refreshed_text": "7\u5929\u524d",
                "unit_price_per_ping": 984000,
                "price_includes_parking": false
            }
        ],
        "pagination": {
            "total": 710,
            "cursor": 0,
            "has_next": true,
            "next_cursor": 24
        },
        "filters_applied": {
            "kind": 9,
            "region_id": 1,
            "section_ids": [
                5
            ]
        }
    },
    "meta": {
        "billable": true,
        "endpoint_family": "sale_search"
    },
    "success": true
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | A required parameter is missing or a value or combination is not allowed. This response is not billable. |
| 503 | Upstream Unavailable | 591 could not be reached or returned data that does not match the request. This response is not billable and is retryable. |

## 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)
