Import spreadsheet
import_fileImport an entire spreadsheet of pins in ONE call — the direct replacement for looping add_comp/bulk_add_comps row by row. Also imports map overlays from KML/KMZ/GeoJSON files (fileUrl ending in .kml/.kmz/.geojson): lines such as thoroughfare plans / MTPs, utility runs and polygons keep their real shape and draw in the layer color; MultiGeometry is merged, KML style junk is dropped, and road names like 'Friendship Rd (4/120)' get Lanes and ROW (ft) customFields. Give either fileUrl (a downloadable CSV/XLSX/KML/KMZ/GeoJSON link) or csvText (the raw CSV content pasted as a string). The server parses it, auto-detects the header row and columns (name, lat/lng, address parts, price, acreage, notes, record #), keeps every other column as filterable customFields, geocodes rows that only have addresses (rows whose address is not found are skipped with a reason), and upserts by externalId so a re-run updates instead of duplicating. Rows are comps; they become Listings only with asListings:true, which you set only when the Broker says these are their listings — never infer it from the columns. Start with dryRun:true to see the detected column mapping and a sample before writing anything. Up to 2000 rows per call.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sheet | No | XLSX only: sheet name to import. Default: first sheet. | |
| dryRun | No | If true, parse and return the detected column mapping + 3 sample rows WITHOUT writing. Recommended first step. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| csvText | No | Raw CSV content as a string (paste the file contents). Provide this OR fileUrl. | |
| fileUrl | No | Public downloadable URL of a .csv, .xlsx, .kml, .kmz or .geojson file. Provide this OR csvText. | |
| layerId | No | Target layer for every imported row. Provide this OR newLayerName. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| offerType | No | With asListings: the Offer type for every row. An "Offer type" column in the file wins. | |
| asListings | No | true only when the Broker said this file is their listings: every row becomes a Listing (Active, confirmed today, the caller as Listing broker). Default false: rows are comps and are never inferred as listings. | |
| assetClass | No | With asListings: the Asset class for every row. An "Asset class" column in the file wins. | |
| newLayerName | No | Create a new layer with this name and import into it. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |