{"openapi":"3.1.0","info":{"title":"Lofty (BYOK) API","version":"0.1.0","description":"Lofty (BYOK) lets an AI assistant read your own Lofty data through the Lofty API with a key you supply (Lofty API key). Read-only: 9 tools (list_transactions, list_transaction_pipelines, list_lead_pipelines, list_lead_ponds, list_lead_tags, list_lead_custom_fields, list_team_members, get_organization, list_available_meetings). The BYOK key travels with each request, is used for that one call only...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-lofty.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-lofty/docs"},"termsOfService":"https://connectorbay.com/byok-lofty/terms"},"servers":[{"url":"https://byok-lofty.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-lofty/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_transactions":{"post":{"operationId":"list_transactions","summary":"List real estate transactions (purchase, listing, lease, other) with property, status, price, commission rate, GCI, team","description":"List real estate transactions (purchase, listing, lease, other) with property, status, price, commission rate, GCI, team and agent revenue and milestone dates. Lead names are not returned. Use for \"Which purchase transactions are under contract and what is the GCI\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"transaction_type":{"anyOf":[{"enum":["Purchase","Listing","Lease","Other","All"],"type":"string"},{"type":"null"}],"default":null,"description":"Transaction type filter.","title":"Transaction Type"},"query_key":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Keyword matched against the transaction name (first 15 characters).","title":"Query Key"},"page_num":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page Num"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Page size (1 to 100).","title":"Page Size"}},"title":"list_transactionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_transaction_pipelines":{"post":{"operationId":"list_transaction_pipelines","summary":"List the transaction pipelines for each transaction type with ordered stage ids and names. Use for \"What stages does my ","description":"List the transaction pipelines for each transaction type with ordered stage ids and names. Use for \"What stages does my purchase transaction pipeline have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_transaction_pipelinesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_lead_pipelines":{"post":{"operationId":"list_lead_pipelines","summary":"List the lead pipelines configured on the team with their ids and names. Use for \"What lead pipelines does my team have\"","description":"List the lead pipelines configured on the team with their ids and names. Use for \"What lead pipelines does my team have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Substring filter on the pipeline name.","title":"Name"},"curr_page":{"anyOf":[{"maximum":10000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Zero-based page index.","title":"Curr Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"Entries per page.","title":"Page Size"}},"title":"list_lead_pipelinesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_lead_ponds":{"post":{"operationId":"list_lead_ponds","summary":"List the lead ponds (shared lead pools) the key owner can see with pond name, owner user id and agent ids. Use for \"Whic","description":"List the lead ponds (shared lead pools) the key owner can see with pond name, owner user id and agent ids. Use for \"Which lead ponds exist on my team\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_lead_pondsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_lead_tags":{"post":{"operationId":"list_lead_tags","summary":"List the lead tag definitions visible to the key owner with tag id, name and visibility. Use for \"What lead tags are in ","description":"List the lead tag definitions visible to the key owner with tag id, name and visibility. Use for \"What lead tags are in use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_lead_tagsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_lead_custom_fields":{"post":{"operationId":"list_lead_custom_fields","summary":"List the lead custom field definitions of the team with field name, type and select options. Use for \"Which custom field","description":"List the lead custom field definitions of the team with field name, type and select options. Use for \"Which custom fields can I set on a lead\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_lead_custom_fieldsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_team_members":{"post":{"operationId":"list_team_members","summary":"List team members with role, office, admin flag, status and counts of new and assigned leads. Contact details are not re","description":"List team members with role, office, admin flag, status and counts of new and assigned leads. Contact details are not returned. Use for \"How many assigned leads does each agent on my team have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Zero-based index of the first entry.","title":"Offset"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Entries per page.","title":"Limit"}},"title":"list_team_membersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_organization":{"post":{"operationId":"get_organization","summary":"Get the organization structure of the account: organization type, enterprise sub-organizations or multi-team group. Use ","description":"Get the organization structure of the account: organization type, enterprise sub-organizations or multi-team group. Use for \"What organization structure is my Lofty account part of\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_organizationArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_available_meetings":{"post":{"operationId":"list_available_meetings","summary":"List open meeting time slots on the key owner's calendar within a time range, sorted by start time. Use for \"What meetin","description":"List open meeting time slots on the key owner's calendar within a time range, sorted by start time. Use for \"What meeting slots are open next Monday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Range start, ISO 8601 with offset, for example 2026-10-19T09:00:00-07:00.","title":"Start Time"},"end_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Range end, ISO 8601 with offset.","title":"End Time"},"time_zone_code":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"IANA time zone such as America/Los_Angeles.","title":"Time Zone Code"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"Maximum slots to return.","title":"Limit"}},"title":"list_available_meetingsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}