> ## Documentation Index
> Fetch the complete documentation index at: https://developer.lofty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026

<Update label="September 2026" tags={["New tools", "New endpoints", "Fixes"]}>
  ## MCP Server

  Released the Lofty MCP server — connect Claude, or any other [Model Context Protocol](https://modelcontextprotocol.io) client, to the Lofty API with nothing to install and no generated SDK:

  ```
  https://mcp.lofty.com/mcp
  ```

  Rather than one tool per endpoint, the server exposes four tools that cover the entire API: **`search_apis`** to find the operation matching an intent, **`describe_api`** to get that operation's parameter schema, **`invoke_api`** to call it, and **`list_custom_fields`** to look up your team's custom lead fields (which aren't in any static schema). The tool list stays the same size as the API grows.

  Authentication uses your existing credentials — an [API key](/authentication/api-keys) or an [OAuth 2.0](/authentication/oauth2) access token, with nothing to register specifically for MCP. Note that the MCP transport requires **`Authorization: Bearer <token>`** for both kinds, including API keys, which use the `token` prefix on the direct REST API. Calls run as the authenticated caller under the same permissions, scopes, and [rate limits](/authentication/overview#rate-limiting) as a direct REST request.

  See the [MCP Server documentation](/mcp/overview) to get connected.

  ## Leads — Saved searches

  Added **`GET /v1.0/leads/{leadId}/savedSearches`** — returns every saved property search of a lead, including its conditions and alert delivery settings.

  * **`source`** — comma-separated origins to keep: `AGENT_CREATED`, `LEAD_CREATED`, `SYSTEM_CREATED`. Defaults to all. When migrating to another system, exclude `SYSTEM_CREATED` — the target usually generates its own, and importing ours duplicates the alerts.
  * **`includeInactive`** (default `false`) — include searches whose alerts are switched off. An `INSTANTLY` cadence counts as active, not off.

  Returns an empty array when the lead has no saved searches, and `403` when the token's user can't access the lead.

  ## Fixes

  * **Tasks V2 / Calendar V2** — `startAt` / `endAt` are now parsed correctly when the time zone is supplied separately as `timeZoneCode`. A bare ISO timestamp such as `2026-03-01T15:00:00` sent alongside a `timeZoneCode` previously failed to parse and returned HTTP `500` (`20005`); timestamps carrying their own offset were unaffected. An offset in the string still takes precedence over `timeZoneCode`.
  * **Time parameters** — a timestamp that can't be parsed now returns HTTP `400` (`20012 INVALID_PARAMETER`), with a message naming the offending value and the expected format, instead of HTTP `500` (`20005`).
</Update>

<Update label="August 2026" tags={["New endpoints", "Field changes"]}>
  ## Agents V2 — Deactivate / Reactivate

  Added two endpoints for managing an agent's lifecycle without losing their data:

  * **`POST /v2.0/agents/{agentId}/deactivate`** — Releases the agent's license seat and revokes all sessions and access tokens, while leaving their leads, deals, and data untouched. The caller needs `MANAGE_TEAM_AGENT` (or `MANAGE_TEAM_AGENT_DEPARTMENT`); the target can't be the team owner, an office owner, or the caller.
  * **`POST /v2.0/agents/{agentId}/reactivate`** — Restores a deactivated agent's access and re-occupies a seat (fails with `SEAT_INSUFFICIENT` if none are free).

  Both endpoints always return HTTP `200` once authenticated — check the response body's `code` field (absent or `0` means success) rather than the status. See [Error Codes](/authentication/error-codes#agent-lifecycle-errors-200-with-error-code) for the full list of failure codes.

  ## Agents — Multi-license support

  Agents can now hold up to 5 real estate license entries instead of one:

  * **`licenses`** (array of `{label, value}`) is now returned on **`GET /v1.0/me`**, **`GET /v1.0/users/{userId}`**, and **`GET /v1.0/members`** (both the paginated list and single-account lookup).
  * **`licenseId`** is now deprecated in favor of `licenses`.

  ## Transactions V2 — Pipeline discovery & type filtering

  * Added **`GET /v2.0/transactions/pipelines`** — Returns each transaction type's (Purchase, Listing, Lease, Other) configured stages, so you can look up valid status values instead of hardcoding team-specific stage names.
  * **`GET /v2.0/transactions`** gains a **`transactionType`** query parameter to filter by type, or `All` to return every type in one call. Defaults to `Purchase`; an unrecognized value now returns `400` (`20012 INVALID_PARAMETER`).
</Update>

<Update label="July 2026" tags={["Field changes"]}>
  ## Leads — remove tags on Update Lead

  **`PUT /v1.0/leads/{leadId}`** gains two request fields for removing tags without resending the full list:

  * **`tagsRemove`** (string array) — removes the named tags from the lead. Names are matched literally; a name not currently on the lead is ignored. Applied after `tags` / `tagsAdd`.
  * **`clearAllTags`** (boolean, default `false`) — set to `true` to remove **all** tags from the lead. Takes precedence over `tags` / `tagsAdd` / `tagsRemove`.

  Previously, removing a tag required replacing the entire tag set via `tags`.
</Update>

<Update label="June 2026" tags={["New endpoints", "Webhooks", "Field changes", "Fixes"]}>
  ## Communications — Cursor-paged search

  Added **`GET /v2.0/communication/agent`** — cursor-paginated search of an agent's communications. Supports `type=ALL` to merge calls, texts, and emails; a query window of up to 90 days; and `search_after`-based pagination via an opaque `cursor` (replacing offset paging). The response includes `data`, `nextCursor`, `hasMore`, `limit`, and `totalCount`.

  ## Webhooks — Ownership-based delivery

  Added a **`permissionMode`** field on `POST /v1.0/webhook`:

  * **`0`** (default) — assignment-based delivery; unchanged behavior.
  * **`1`** — ownership-based delivery; the subscriber also receives callbacks for any lead within their ownership scope (team, office, or personally owned), not only assigned leads.

  ## Field Changes

  * **System Logs** (`GET /v1.0/systemLogs`) — each entry now includes **`timelineTypeDesc`**, a human-readable event name paired with the integer `timelineType`, so you no longer need to map the integer yourself.

  ## Fixes

  * **Leads** (`GET /v1.0/leads`) — the **`opportunity`** field is now correctly populated (it previously always returned empty).
</Update>

<Update label="May 2026" tags={["New endpoints"]}>
  ## Communications — single-record lookups

  Added v2 endpoints to fetch a single communication by ID:

  * **`GET /v2.0/communication/call/{communicationId}`**
  * **`GET /v2.0/communication/text/{communicationId}`**
  * **`GET /v2.0/communication/email/{communicationId}`**

  Single-record responses also surface manually-logged calls and their text content.
</Update>

<Update label="April 2026" tags={["New endpoints", "Field changes", "New tools"]}>
  ## Lofty CLI

  Released [`@loftyai/lofty-cli`](https://www.npmjs.com/package/@loftyai/lofty-cli) — a command-line tool for the Lofty API. Manage leads, agents, listings, tasks, transactions, and more from your terminal.

  ```bash theme={null}
  npm install -g @loftyai/lofty-cli
  lofty-cli auth login
  lofty-cli leads list --limit 10
  ```

  See the [Lofty CLI documentation](/cli/install) for setup and command reference.

  ## Transaction V2 Search

  Added `GET /v2.0/transactions` — paginated transaction search with keyword, lead, and date filters.

  ## Lead Query Enhancements

  New parameters for `GET /v1.0/leads`:

  * **`returnFields`**: Specify which fields to return (comma-separated), reducing payload size.
  * **`otherFilters`**: Pass custom LeadFilter overrides for advanced filtering.
  * **`key`**: Fuzzy search by name, phone, or email in a single parameter.

  ## Field Changes

  * **Calendar V2** — `startTime` / `endTime` now accept millisecond timestamps in addition to ISO 8601.
  * **Manual Log** (`POST /v1.0/logType`) — Added `emailSubject`, `toEmail`, `fromEmail` fields for email log entries.
  * **Manual Log** (`POST /v1.0/logType`) — The response now returns the created entry's `id`.
  * **Manual Log** (`GET /v1.0/logType`) — Added `sort` / `order` parameters to control result ordering, and the response now includes the `content` field.
</Update>

<Update label="March 2026" tags={["New endpoints", "New features", "Authentication"]}>
  ## Sales Agents & AI

  8 new endpoints for managing Sales Agent workflows:

  * **`GET /v2.0/sales-agents/by-lead`** — Get Sales Agent by lead ID
  * **`GET /v2.0/sales-agents/quota`** — Get current user's quota
  * **`GET /PUT /v2.0/sales-agent/settings`** — Query and update settings
  * **`PUT /v2.0/sales-agents/working-lead/{leadId}/mute`** — Mute a working lead
  * **`POST /v2.0/working-leads/add`** — Batch add leads to working pool
  * **`POST /v2.0/plan-tasks/create`** — Batch create plan tasks

  ## Intelligent Features (AI)

  6 new AI-powered endpoints:

  * **`POST /v2.0/ai/call-script`** — Generate call script
  * **`GET /POST /v2.0/ai/call-summary`** — Get or trigger call summary generation
  * **`POST /v2.0/ai/prepare-insight`** — Generate prepare insight
  * **`GET /POST /v2.0/ai/lead-analysis`** — List or create lead analysis tasks

  ## Calendar V2

  Full CRUD + lifecycle management for calendar events:

  * **`GET /POST /v2.0/calendar`** — List and create events
  * **`PUT /DELETE /v2.0/calendar/{calendarId}`** — Update and delete events
  * **`POST finish/unfinish`** — Mark events as completed or reopen
  * **`GET /v2.0/calendar/meetings/available`** — List available meeting slots

  ## Tasks V2 Enhancements

  * **`GET /v2.0/tasks/my-tasks`** — List tasks and appointments assigned to the current user
  * **`POST finish/unfinish`** — Mark tasks as completed or reopen

  ## Lead Activity V2

  * **`GET /v2.0/leads/{leadId}/activities`** — Unified timeline with calls, texts, and emails in chronological order

  ## Notifications

  * **`POST /v2.0/sales-agent/notification/app-push/send-task-reminder`** — Task reminder push
  * **`POST send-to-agent`** — Send system SMS or email to agent
  * **`POST /v2.0/sales-agent/ai-number/send-sms-to-agent`** — Send SMS via AI number

  ## Agent Tags

  * **`POST /v1.0/agent/{agentId}/tag/add`** — Batch add tags with autoCreate support

  ## Field Changes

  * **Listing** — Added `propertyTypePrimary` and `propertyTypeSecondary` to response
  * **Note** — Added `noteId`, `noteType`, `idOfType` fields
  * **Calendar V2** — Added `taskId` field to calendar items

  ## Authentication

  * Added OAuth 2.0 Client Credentials flow (`/oauth/token`) for server-to-server integrations
  * Added per-app rate limiting and token scope enforcement
</Update>
