{"openapi":"3.1.0","info":{"title":"Blogger (BYOK) API","version":"0.1.0","description":"Blogger (BYOK) lets an AI assistant read your own Blogger data through the Blogger API with a key you supply (Google API key (Blogger API v3 enabled)). Read-only: 9 tools (get_blog, get_blog_by_url, list_posts, get_post, search_posts, list_pages, get_page, list_post_comments, list_blog_comments). The BYOK key travels with each request, is used for that one call only and is never stored, logged or...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-blogger.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-blogger/docs"},"termsOfService":"https://connectorbay.com/byok-blogger/terms"},"servers":[{"url":"https://byok-blogger.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-blogger/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_blog":{"post":{"operationId":"get_blog","summary":"Get a public blog by id: name, description, URL, published and updated dates, post count, page count and locale. Use for","description":"Get a public blog by id: name, description, URL, published and updated dates, post count, page count and locale. Use for \"How many posts does the Blogger blog 2399953 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"}},"required":["blog_id"],"title":"get_blogArguments","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_blog_by_url":{"post":{"operationId":"get_blog_by_url","summary":"Look up a public blog from its address (for example https://buzz.blogger.com/) and return its id, name, description and ","description":"Look up a public blog from its address (for example https://buzz.blogger.com/) and return its id, name, description and counts. Use for \"What is the Blogger blog id of buzz.blogger.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full address of the blog, for example 'https://buzz.blogger.com/'.","maxLength":300,"title":"Url","type":"string"}},"required":["url"],"title":"get_blog_by_urlArguments","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_posts":{"post":{"operationId":"list_posts","summary":"List posts of a public blog, newest first by default, with title, URL, author, labels, dates and comment count. Bodies a","description":"List posts of a public blog, newest first by default, with title, URL, author, labels, dates and comment count. Bodies are left out unless asked for. Use for \"What are the latest posts on Blogger blog 2399953\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"labels":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated labels the post must have, for example 'news,updates'.","title":"Labels"},"order_by":{"anyOf":[{"enum":["published","updated"],"type":"string"},{"type":"null"}],"default":"published","description":"Sort by publish date or last update.","title":"Order By"},"start_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only posts published after this RFC 3339 time, for example 2026-01-01T00:00:00Z.","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only posts published before this RFC 3339 time.","title":"End Date"},"status":{"anyOf":[{"enum":["live","draft","scheduled"],"type":"string"},{"type":"null"}],"default":null,"description":"Post status: live is the public default; draft and scheduled need authorization the key lacks.","title":"Status"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many items to return per page (1 to 100).","title":"Max Results"},"page_token":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"The nextPageToken from the previous answer, to get the following page.","title":"Page Token"},"fetch_bodies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include each item's full HTML body; false (default here) keeps answers short.","title":"Fetch Bodies"}},"required":["blog_id"],"title":"list_postsArguments","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_post":{"post":{"operationId":"get_post","summary":"Get one post of a public blog by id, including its HTML body, labels, author, URL and comment count. Use for \"Show Blogg","description":"Get one post of a public blog by id, including its HTML body, labels, author, URL and comment count. Use for \"Show Blogger post 6755709643044947005 on blog 2399953\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"post_id":{"description":"Numeric id of the post, as returned by list_posts.","maxLength":30,"title":"Post Id","type":"string"}},"required":["blog_id","post_id"],"title":"get_postArguments","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_posts":{"post":{"operationId":"search_posts","summary":"Search the posts of one public blog for text and return matching titles, URLs, authors and dates. Use for \"Search Blogge","description":"Search the posts of one public blog for text and return matching titles, URLs, authors and dates. Use for \"Search Blogger blog 2399953 for posts about 'search'\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"q":{"description":"Words to search for in the blog's posts.","maxLength":200,"title":"Q","type":"string"},"order_by":{"anyOf":[{"enum":["published","updated"],"type":"string"},{"type":"null"}],"default":"published","description":"Sort by publish date or last update.","title":"Order By"},"fetch_bodies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include each item's full HTML body; false (default here) keeps answers short.","title":"Fetch Bodies"}},"required":["blog_id","q"],"title":"search_postsArguments","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_pages":{"post":{"operationId":"list_pages","summary":"List the static pages of a public blog (About, Contact and similar) with title, URL, author and dates. Use for \"What sta","description":"List the static pages of a public blog (About, Contact and similar) with title, URL, author and dates. Use for \"What static pages does Blogger blog 2399953 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"fetch_bodies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include each item's full HTML body; false (default here) keeps answers short.","title":"Fetch Bodies"}},"required":["blog_id"],"title":"list_pagesArguments","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_page":{"post":{"operationId":"get_page","summary":"Get one static page of a public blog by its id, including the HTML body. Use for \"Show page 123 of Blogger blog 2399953\"","description":"Get one static page of a public blog by its id, including the HTML body. Use for \"Show page 123 of Blogger blog 2399953\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"page_id":{"description":"Numeric id of the page, as returned by list_pages.","maxLength":30,"title":"Page Id","type":"string"}},"required":["blog_id","page_id"],"title":"get_pageArguments","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_post_comments":{"post":{"operationId":"list_post_comments","summary":"List the public comments on one post with author, date, text and the parent comment when it is a reply. Use for \"What co","description":"List the public comments on one post with author, date, text and the parent comment when it is a reply. Use for \"What comments does post 6755709643044947005 on blog 2399953 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"post_id":{"description":"Numeric id of the post, as returned by list_posts.","maxLength":30,"title":"Post Id","type":"string"},"start_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only comments after this RFC 3339 time.","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only comments before this RFC 3339 time.","title":"End Date"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many comments to return per page (1 to 100).","title":"Max Results"},"page_token":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"The nextPageToken from the previous answer, to get the following page.","title":"Page Token"},"fetch_bodies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True (default) to include comment text.","title":"Fetch Bodies"}},"required":["blog_id","post_id"],"title":"list_post_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_blog_comments":{"post":{"operationId":"list_blog_comments","summary":"List the latest public comments across a whole blog, with author, date, text and the post they belong to. Use for \"What ","description":"List the latest public comments across a whole blog, with author, date, text and the post they belong to. Use for \"What are the newest comments on Blogger blog 2399953\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_id":{"description":"Numeric Blogger blog id (shown in the blog's dashboard URL or returned by get_blog_by_url).","maxLength":30,"title":"Blog Id","type":"string"},"max_results":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many comments to return per page (1 to 100).","title":"Max Results"},"page_token":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"The nextPageToken from the previous answer, to get the following page.","title":"Page Token"},"fetch_bodies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True (default) to include comment text.","title":"Fetch Bodies"}},"required":["blog_id"],"title":"list_blog_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}}}}