Add many pins
bulk_add_compsAdd many comps in one call instead of calling add_comp repeatedly — use this for CSV-style bulk imports (tens to thousands of rows). Pass an array of comp objects; each one accepts the same fields as add_comp, INCLUDING customFields (a {column: value} map for any extra spreadsheet columns) and externalId. Give each row an externalId (e.g. its source Record #) so an interrupted import can be safely re-sent — rows whose externalId already exists in the layer are updated in place, not duplicated. latitude+longitude OR address (geocoded automatically; a row whose address is not found fails with a reason). Rows are comps unless asListings is true — never mark rows as listings yourself; set asListings only when the Broker says these are their listings. Split datasets over 1000 rows into multiple calls. Returns per-row results mapping each input index/externalId to its comp id and status (inserted/updated/failed), and with asListings how many are on the Marketplace and which fields keep the rest off.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| comps | Yes | Up to 1000 comps per call. | |
| 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." | |
| layerId | No | Default layer ID for comps that don't specify their own layerId. | |
| 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. A row's own offerType wins. | |
| asListings | No | true only when the Broker said these rows are 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. A row's own assetClass wins. | |
| 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. | |
| upsertOnExternalId | No | Default true. When a row's externalId already exists in the target layer, update it instead of inserting a duplicate. Set false to always insert. |