One key, many sources
Use the same credential across supported operations and check capabilities for each source.
Collect up to five supported source listings with individual outcomes. Get structured JSON through one RealtyCrawl API key.
Send items as one to five supported canonical source URLs or native IDs. Existing account-retention and market requirements apply to every selector. Each indexed outcome contains its selector, listing or null, and a sanitized failure code; successful details cost 50 credits each. This operation requests source data through its enabled adapter. Preserve observation times, source warnings and any idempotent-replay metadata. Check live capabilities for accepted inputs and availability before running your request.
Collect up to five supported source listings with individual outcomes.
Example request
curl --request POST 'https://realtycrawl.dev/v1/propertyguru/listings/batch' \
--header "x-api-key: $REALTYCRAWL_API_KEY" \
--header 'X-Max-Credits: 50' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: YOUR_IDEMPOTENCY_KEY' \
--data '{"items":[{"url":"https://www.propertyguru.com.sg/listing/for-rent-synthetic-home-101"}]}'import os
import json
import requests
headers = {
"X-Max-Credits": "50",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_IDEMPOTENCY_KEY"
}
headers["x-api-key"] = os.environ["REALTYCRAWL_API_KEY"]
payload = json.loads("{\"items\":[{\"url\":\"https://www.propertyguru.com.sg/listing/for-rent-synthetic-home-101\"}]}")
response = requests.request("POST", "https://realtycrawl.dev/v1/propertyguru/listings/batch",
headers=headers, json=payload, timeout=60)
response.raise_for_status()
print(json.dumps(response.json(), indent=2))const response = await fetch("https://realtycrawl.dev/v1/propertyguru/listings/batch", {
method: "POST",
headers: {
"x-api-key": process.env.REALTYCRAWL_API_KEY,
...{
"X-Max-Credits": "50",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_IDEMPOTENCY_KEY"
}
},
body: JSON.stringify({
"items": [
{
"url": "https://www.propertyguru.com.sg/listing/for-rent-synthetic-home-101"
}
]
})
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
console.log(await response.json());| Parameter | Required | Description |
|---|---|---|
| items | Yes | One to five unique source listing selectors. Each item contains one supported canonical URL or retained native_id; the existing detail contract and source limits apply. |
Send items as one to five supported canonical source URLs or native IDs. Existing account-retention and market requirements apply to every selector. Each indexed outcome contains its selector, listing or null, and a sanitized failure code; successful details cost 50 credits each.
The response includes an array of indexed source-detail outcomes in data, plus source outcomes and request metadata. Explore the structure below before making a call.
{
"data": [
{
"index": 0,
"selector": {
"url": "https://www.propertyguru.com.sg/listing/for-rent-synthetic-home-101"
},
"status": "success",
"listing": {
"id": "example_listing",
"source": {
"platform": "propertyguru",
"provider": "example",
"native_id": null,
"url": "https://www.propertyguru.com.sg/listing/for-rent-synthetic-home-101",
"observed_at": "2026-01-01T12:00:00Z",
"access_class": "public_portal"
},
"transaction": "sale",
"status": "unknown",
"property": {
"id": null,
"address": {
"country": "SG"
},
"property_type": "unknown"
},
"price": {
"amount": null,
"currency": null,
"kind": "unknown"
},
"observed_at": "2026-01-01T12:00:00Z",
"native_id": null
},
"error_code": null
}
],
"meta": {
"request_id": "example_request",
"schema_version": "1.0.0",
"generated_at": "2026-01-01T12:00:00Z",
"completeness": "unknown",
"sources": []
}
}Schema example with placeholder values; not a live source result. Actual fields, values, and completeness vary by source and request.
Send a POST request with your API key and accepted inputs. RealtyCrawl returns structured JSON and preserves the source context for your application.
Method
POST
Response
JSON · CSV · NDJSON
POST /v1/propertyguru/listings/batchKeep source collection behind a shared interface so you can focus on the product you’re building.
Use familiar HTTP requests, inspect a common schema, and connect the results to the tools your team already uses.
Use the same credential across supported operations and check capabilities for each source.
Keep currencies, area units, source identifiers, and observation times with your results.
Call the API with cURL, Python, TypeScript, or any backend that can send an HTTP request.
import requests
# Check current source availability before collecting.
response = requests.get(
'https://realtycrawl.dev/v1/meta/capabilities',
params={'platform': 'zillow'}
)
response.raise_for_status()
capabilities = response.json()// Check current source availability before collecting.
const response = await fetch(
'https://realtycrawl.dev/v1/meta/capabilities?platform=zillow'
);
if (!response.ok) throw new Error('Request failed');
const capabilities = await response.json();curl 'https://realtycrawl.dev/v1/meta/capabilities?platform=zillow'import requests
# Check current source availability before collecting.
response = requests.get(
'https://realtycrawl.dev/v1/meta/capabilities',
params={'platform': 'redfin'}
)
response.raise_for_status()
capabilities = response.json()// Check current source availability before collecting.
const response = await fetch(
'https://realtycrawl.dev/v1/meta/capabilities?platform=redfin'
);
if (!response.ok) throw new Error('Request failed');
const capabilities = await response.json();curl 'https://realtycrawl.dev/v1/meta/capabilities?platform=redfin'import requests
# Check current source availability before collecting.
response = requests.get(
'https://realtycrawl.dev/v1/meta/capabilities',
params={'platform': 'realtor'}
)
response.raise_for_status()
capabilities = response.json()// Check current source availability before collecting.
const response = await fetch(
'https://realtycrawl.dev/v1/meta/capabilities?platform=realtor'
);
if (!response.ok) throw new Error('Request failed');
const capabilities = await response.json();curl 'https://realtycrawl.dev/v1/meta/capabilities?platform=realtor'import requests
# Check current source availability before collecting.
response = requests.get(
'https://realtycrawl.dev/v1/meta/capabilities',
params={'platform': 'rightmove'}
)
response.raise_for_status()
capabilities = response.json()// Check current source availability before collecting.
const response = await fetch(
'https://realtycrawl.dev/v1/meta/capabilities?platform=rightmove'
);
if (!response.ok) throw new Error('Request failed');
const capabilities = await response.json();curl 'https://realtycrawl.dev/v1/meta/capabilities?platform=rightmove'import requests
# Check current source availability before collecting.
response = requests.get(
'https://realtycrawl.dev/v1/meta/capabilities',
params={'platform': 'idealista'}
)
response.raise_for_status()
capabilities = response.json()// Check current source availability before collecting.
const response = await fetch(
'https://realtycrawl.dev/v1/meta/capabilities?platform=idealista'
);
if (!response.ok) throw new Error('Request failed');
const capabilities = await response.json();curl 'https://realtycrawl.dev/v1/meta/capabilities?platform=idealista'{
"platform": "zillow",
"operation": "searchPlatformListings",
"status": "active",
"geographies": [
"US"
],
"execution": "sync"
}{
"platform": "redfin",
"operation": "searchPlatformListings",
"status": "active",
"geographies": [
"US"
],
"execution": "sync"
}{
"platform": "realtor",
"operation": "searchPlatformListings",
"status": "active",
"geographies": [
"US"
],
"execution": "sync"
}{
"platform": "rightmove",
"operation": "searchPlatformListings",
"status": "active",
"geographies": [
"GB"
],
"execution": "sync"
}{
"platform": "idealista",
"operation": "searchPlatformListings",
"status": "active",
"geographies": [
"ES"
],
"execution": "sync"
}Find answers to common questions about PropertyGuru Singapore requests, responses, and credits.
Contact usCreate an account for 500 trial credits, check live capabilities for PropertyGuru Singapore, and use the example request above with your API key. This operation lists 50 credits per successful item.
The JSON response contains an array of indexed source-detail outcomes in data. The meta object carries request diagnostics and source outcomes. CSV/NDJSON exports contain data records with request and credit metadata in headers.
Send items as one to five supported canonical source URLs or native IDs. Existing account-retention and market requirements apply to every selector. Each indexed outcome contains its selector, listing or null, and a sanitized failure code; successful details cost 50 credits each.
Availability is operation-specific. Check /v1/meta/capabilities for the platform’s live status, accepted selectors, and markets. Unavailable requests are not charged.
RealtyCrawl is an independent real estate data API and is not affiliated with PropertyGuru Singapore.
Get your API key and start building a source-linked property workflow.
50 credits per successful item · Failed calls are refunded