| Endpoint | Description |
| Export Properties | Export properties matching your location and filter criteria |
| Export People | Export people/contacts matching your location and filter criteria |
| List Exports | List past exports with pagination and status filtering |
| Get Export | Retrieve a single export by ID to check status or re-download |
| Language / Tool | Configuration |
| cURL | --max-time 120 |
| Node.js (fetch) | signal: AbortSignal.timeout(120_000) |
| Python (requests) | timeout=120 |
| Go (http.Client) | client.Timeout = 120 * time.Second |
12345curl -X POST "https://api.v2.dealmachine.com/v1/properties/export" \ -H "Authorization: Bearer dm_sk_live_xxx" \ -H "Content-Type: application/json" \ --max-time 120 \ -d '{ "locations": [{ "type": "state", "code": "TX" }] }'
1234567891011121314151617import requests response = requests.post( "https://api.v2.dealmachine.com/v1/properties/export", headers={"Authorization": "Bearer dm_sk_live_xxx"}, json={ "locations": [{"type": "state", "code": "TX"}], "filters": [ {"filter_id": "estimated_value", "operator": "range", "value": {"min": 200000, "max": 500000}} ] }, timeout=120 ) export = response.json() for file in export["download_urls"]: print(f"Download: {file['url']}")
12345678910111213141516171819const response = await fetch("https://api.v2.dealmachine.com/v1/properties/export", { method: "POST", headers: { "Authorization": "Bearer dm_sk_live_xxx", "Content-Type": "application/json", }, body: JSON.stringify({ locations: [{ type: "state", code: "TX" }], filters: [ { filter_id: "estimated_value", operator: "range", value: { min: 200000, max: 500000 } } ], }), signal: AbortSignal.timeout(120_000), }); const export = await response.json(); for (const file of export.download_urls) { console.log(`Download: ${file.url}`); }
1234567{ "locations": [], "include_lists": { "property_list_ids": [123] }, "exclude_lists": { "property_list_ids": [456] }, "exclude_previously_exported": true, "fields": ["property_full_address", "estimated_value"] }
people_list_ids on people exports. For advanced export exclusion, pass a full exclude_previously_exported object with properties, people, or companies criteria.| Limit | Value |
| Max records per export | 1,000,000 |
| Max locations per request | 15 |
| Max filters per request | 50 |
400 error with the actual record count. Narrow your filters or break the export into smaller location-based chunks.credits object showing exactly what was charged:123456{ "credits": { "used": 15432, "properties": 15432 } }
429 error before any data is exported. No credits are consumed in this case.download_urls array in the response contains one or more signed URLs. Each URL points to a gzip-compressed CSV file (.csv.gz).123456789{ "download_urls": [ { "filename": "properties_export_2026-02-17.csv.gz", "url": "https://storage.googleapis.com/...", "size": 2457600 } ] }
| Tool | How to open |
| Python (pandas) | pd.read_csv("export.csv.gz") — pandas decompresses automatically |
| Excel | Decompress first with a tool like 7-Zip, then open the .csv |
| Google Sheets | Upload the .csv.gz file directly — Sheets decompresses it |
| Command line | gunzip export.csv.gz to decompress, then open the .csv |
anchor parameter lets you change what each row represents:| Anchor | Available On | Description |
property | Properties | One row per property (default for property exports) |
person | Properties, People | One row per unique person |
phone | Properties, People | One row per phone number |
email | Properties, People | One row per email address |
anchor: "person" produces two rows — one for each owner. Exporting with anchor: "phone" produces one row per phone number across all contacts.429 error with the code export_in_progress. Wait for the first export to complete before starting another.pending, processing, completed, failed), record count, file size, download URLs, and timestamps. Download URLs are time-limited — expired URLs require a new export.