{"openapi":"3.1.0","info":{"title":"Less Annoying CRM (BYOK) API","version":"0.1.0","description":"Less Annoying CRM (BYOK) lets an AI assistant read your own Less Annoying CRM data through the Less Annoying CRM API with a key you supply (Less Annoying CRM API key). Read-only: 10 tools (get_current_user, list_users, list_teams, list_pipelines, list_pipeline_statuses, list_pipeline_items, list_tasks, list_groups, list_custom_fields, list_calendars). The BYOK key travels with each request, is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-lessannoyingcrm.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-lessannoyingcrm/docs"},"termsOfService":"https://connectorbay.com/byok-lessannoyingcrm/terms"},"servers":[{"url":"https://byok-lessannoyingcrm.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-lessannoyingcrm/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/get_current_user":{"post":{"operationId":"get_current_user","summary":"Show the Less Annoying CRM user the API key belongs to: user ID, name, time zone and email. Use for \"Which Less Annoying","description":"Show the Less Annoying CRM user the API key belongs to: user ID, name, time zone and email. Use for \"Which Less Annoying CRM user is my API key for\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_current_userArguments","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_users":{"post":{"operationId":"list_users","summary":"List the users of the account that the key may see, with ID, name and time zone. Use for \"Who are the users in our Less ","description":"List the users of the account that the key may see, with ID, name and time zone. Use for \"Who are the users in our Less Annoying CRM account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_usersArguments","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_teams":{"post":{"operationId":"list_teams","summary":"List the teams of the account (all teams for an admin key, otherwise the key user's teams) with member user IDs. Use for","description":"List the teams of the account (all teams for an admin key, otherwise the key user's teams) with member user IDs. Use for \"Which teams exist in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_teamsArguments","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_pipelines":{"post":{"operationId":"list_pipelines","summary":"List the pipelines (such as Leads or Deals) with their statuses. This shows how pipelines are set up, not the records in","description":"List the pipelines (such as Leads or Deals) with their statuses. This shows how pipelines are set up, not the records in them. Use for \"What pipelines and statuses are set up in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include deleted (archived) pipelines.","title":"Include Archived"}},"title":"list_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_pipeline_statuses":{"post":{"operationId":"list_pipeline_statuses","summary":"List the statuses of one pipeline, or of all pipelines when no pipeline is given, with active flag and colour. Use for \"","description":"List the statuses of one pipeline, or of all pipelines when no pipeline is given, with active flag and colour. Use for \"What statuses does the Sales Leads pipeline have in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"pipeline_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only statuses of this pipeline ID (from list_pipelines).","title":"Pipeline Id"}},"title":"list_pipeline_statusesArguments","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_pipeline_items":{"post":{"operationId":"list_pipeline_items","summary":"List the items of one pipeline (for example the leads) with status, linked contact name, owner, creation and last update","description":"List the items of one pipeline (for example the leads) with status, linked contact name, owner, creation and last update time, number of updates and the last note. Use for \"Which leads are in our Less Annoying CRM Sales Leads pipeline\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"pipeline_id":{"description":"Pipeline ID (from list_pipelines).","maxLength":60,"title":"Pipeline Id","type":"string"},"sort_by":{"anyOf":[{"enum":["Status","DateCreated","LastUpdate"],"type":"string"},{"type":"null"}],"default":"Status","description":"Sort by Status, DateCreated or LastUpdate.","title":"Sort By"},"sort_direction":{"anyOf":[{"enum":["Ascending","Descending"],"type":"string"},{"type":"null"}],"default":"Ascending","description":"Ascending or Descending.","title":"Sort Direction"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 100, default 50).","title":"Max Results"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Use it when HasMoreResults is true.","title":"Page"}},"required":["pipeline_id"],"title":"list_pipeline_itemsArguments","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_tasks":{"post":{"operationId":"list_tasks","summary":"List tasks due in a date range with name, due date, assignee, linked contact name and completion state. Dates are in YYY","description":"List tasks due in a date range with name, due date, assignee, linked contact name and completion state. Dates are in YYYY-MM-DD form. Use for \"What follow-up tasks are due next week in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_date":{"description":"Earliest due date to include, for example 2026-10-19.","maxLength":30,"title":"Start Date","type":"string"},"end_date":{"description":"Latest due date to include, for example 2026-10-26.","maxLength":30,"title":"End Date","type":"string"},"completion_status":{"anyOf":[{"enum":["Both","Incomplete","Complete"],"type":"string"},{"type":"null"}],"default":"Both","description":"Both, Incomplete or Complete.","title":"Completion Status"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 100, default 50).","title":"Max Results"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Use it when HasMoreResults is true.","title":"Page"}},"required":["start_date","end_date"],"title":"list_tasksArguments","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_groups":{"post":{"operationId":"list_groups","summary":"List the contact groups with name, sharing setting and colour. Member lists are not returned. Use for \"Which contact gro","description":"List the contact groups with name, sharing setting and colour. Member lists are not returned. Use for \"Which contact groups do we have in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 100, default 50).","title":"Max Results"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Use it when HasMoreResults is true.","title":"Page"}},"title":"list_groupsArguments","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_custom_fields":{"post":{"operationId":"list_custom_fields","summary":"List the custom fields of contacts, companies or pipelines with name, type, required flag and options. Use for \"What cus","description":"List the custom fields of contacts, companies or pipelines with name, type, required flag and options. Use for \"What custom fields are defined for contacts in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"record_type":{"anyOf":[{"enum":["Contact","Company","Pipeline"],"type":"string"},{"type":"null"}],"default":null,"description":"Limit to one record type: Contact, Company or Pipeline (default all).","title":"Record Type"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 100, default 50).","title":"Max Results"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Use it when HasMoreResults is true.","title":"Page"}},"title":"list_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_calendars":{"post":{"operationId":"list_calendars","summary":"List the calendars the key can see with owner user ID, primary flag and visibility. Use for \"Which calendars exist in Le","description":"List the calendars the key can see with owner user ID, primary flag and visibility. Use for \"Which calendars exist in Less Annoying CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_calendarsArguments","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}}}}