Skip to main content
New toolsNew endpointsFixes

MCP Server

Released the Lofty MCP server — connect Claude, or any other Model Context Protocol client, to the Lofty API with nothing to install and no generated SDK:
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 or an OAuth 2.0 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 as a direct REST request.See the MCP Server documentation 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 V2startAt / 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).
New endpointsField 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 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).
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.
New endpointsWebhooksField changesFixes
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).
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.
New endpointsField changesNew tools

Lofty CLI

Released @loftyai/lofty-cli — a command-line tool for the Lofty API. Manage leads, agents, listings, tasks, transactions, and more from your terminal.
See the Lofty CLI documentation for setup and command reference.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 V2startTime / 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.
New endpointsNew featuresAuthentication

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