| 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": ["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 to cap a filter-based export at 1 to 1,000,000 file rows. For example, {"anchor":"person","limit":100} selects at most 100 person rows. When chargeable property fields are included, property credits use the properties associated with that limited contact selection, after deduplication and redaction. They are not selected independently from the full property search. Explicit ID selections keep their existing scope.| 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.