{"openapi":"3.1.0","info":{"title":"Frill (BYOK) API","version":"0.1.0","description":"Frill (BYOK) lets an AI assistant read your own Frill data through the Frill API with a key you supply (Frill API key). Read-only: 11 tools (list_ideas, get_idea, list_announcements, get_announcement, list_announcement_categories, list_topics, list_statuses, list_comments, list_votes, list_followers, search_followers). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-frill.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-frill/docs"},"termsOfService":"https://connectorbay.com/byok-frill/terms"},"servers":[{"url":"https://byok-frill.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-frill/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_ideas":{"post":{"operationId":"list_ideas","summary":"List feedback ideas with name, status, votes, comment count, flags (pinned, bug, archived, completed), approval status, ","description":"List feedback ideas with name, status, votes, comment count, flags (pinned, bug, archived, completed), approval status, priority score and dates. Use for \"What are the most requested ideas on our Frill board\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass pagination.endCursor from the previous answer.","title":"After"}},"title":"list_ideasArguments","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_idea":{"post":{"operationId":"get_idea","summary":"Get one idea by its idx or slug, including content, status, topics and attachments. Use for \"Show me the Frill idea dark","description":"Get one idea by its idx or slug, including content, status, topics and attachments. Use for \"Show me the Frill idea dark-mode-support\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"idea":{"description":"Idea idx or slug, from list_ideas.","maxLength":200,"title":"Idea","type":"string"}},"required":["idea"],"title":"get_ideaArguments","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_announcements":{"post":{"operationId":"list_announcements","summary":"List announcements (changelog posts) with name, excerpt, published flag and date, and categories. Use for \"What did we a","description":"List announcements (changelog posts) with name, excerpt, published flag and date, and categories. Use for \"What did we announce recently in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass pagination.endCursor from the previous answer.","title":"After"}},"title":"list_announcementsArguments","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_announcement":{"post":{"operationId":"get_announcement","summary":"Get one announcement by its idx, including content, reactions, author, categories and linked ideas. Use for \"Show me Fri","description":"Get one announcement by its idx, including content, reactions, author, categories and linked ideas. Use for \"Show me Frill announcement abc123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"announcement":{"description":"Announcement idx, from list_announcements.","maxLength":100,"title":"Announcement","type":"string"}},"required":["announcement"],"title":"get_announcementArguments","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_announcement_categories":{"post":{"operationId":"list_announcement_categories","summary":"List announcement categories with name, colour and dates. Use for \"What announcement categories do we use in Frill\".","description":"List announcement categories with name, colour and dates. Use for \"What announcement categories do we use in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_announcement_categoriesArguments","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_topics":{"post":{"operationId":"list_topics","summary":"List the topics used to tag ideas, with name, number of ideas and display order. Use for \"What topics are ideas tagged w","description":"List the topics used to tag ideas, with name, number of ideas and display order. Use for \"What topics are ideas tagged with in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_topicsArguments","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_statuses":{"post":{"operationId":"list_statuses","summary":"List idea statuses (such as planned or completed) with name and colour. Use for \"What idea statuses exist in Frill\".","description":"List idea statuses (such as planned or completed) with name and colour. Use for \"What idea statuses exist in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_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_comments":{"post":{"operationId":"list_comments","summary":"List comments on ideas with message, type, private flag, idea id and dates. Use for \"What comments were left on Frill id","description":"List comments on ideas with message, type, private flag, idea id and dates. Use for \"What comments were left on Frill ideas recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass pagination.endCursor from the previous answer.","title":"After"}},"title":"list_commentsArguments","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_votes":{"post":{"operationId":"list_votes","summary":"List votes on ideas with creation time, the voter and the idea. Use for \"Who voted on ideas in Frill\".","description":"List votes on ideas with creation time, the voter and the idea. Use for \"Who voted on ideas in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass pagination.endCursor from the previous answer.","title":"After"}},"title":"list_votesArguments","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_followers":{"post":{"operationId":"list_followers","summary":"List followers (your users who give feedback) with name, email, companies and dates. Contains personal data. Use for \"Wh","description":"List followers (your users who give feedback) with name, email, companies and dates. Contains personal data. Use for \"Who are the followers on our Frill board\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass pagination.endCursor from the previous answer.","title":"After"},"include_attributes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include custom attributes of each follower.","title":"Include Attributes"}},"title":"list_followersArguments","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/search_followers":{"post":{"operationId":"search_followers","summary":"Find a follower by email address and return their name, companies and dates. Use for \"Is ana@example.com a follower in F","description":"Find a follower by email address and return their name, companies and dates. Use for \"Is ana@example.com a follower in Frill\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"email":{"description":"Email address to look up.","maxLength":200,"title":"Email","type":"string"},"include_attributes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include custom attributes.","title":"Include Attributes"}},"required":["email"],"title":"search_followersArguments","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}}}}