{"openapi":"3.1.0","info":{"title":"HubSpot CMS Blog (BYOK) API","version":"0.1.0","description":"HubSpot CMS Blog (BYOK) lets an AI assistant read your own HubSpot CMS Blog data through the HubSpot CMS Blog API with a key you supply (HubSpot private app access token (scope: content)). Read-only: 6 tools (list_blog_posts, get_blog_post, list_blog_post_revisions, list_blog_authors, list_blog_tags, get_blog_tag). 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-hubspot-cms-blog.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-hubspot-cms-blog/docs"},"termsOfService":"https://connectorbay.com/byok-hubspot-cms-blog/terms"},"servers":[{"url":"https://byok-hubspot-cms-blog.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-hubspot-cms-blog/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_blog_posts":{"post":{"operationId":"list_blog_posts","summary":"List blog posts with title, slug, URL, state, publish date, author, tag ids and summary. The post body is not returned. ","description":"List blog posts with title, slug, URL, state, publish date, author, tag ids and summary. The post body is not returned. Use for \"Which blog posts did we publish last month\".","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 items to return (1 to 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: paging.next.after from the previous answer. Leave out for the first page.","title":"After"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of active ones.","title":"Archived"},"created_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only items created after this ISO 8601 time.","title":"Created After"},"updated_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only items updated after this ISO 8601 time.","title":"Updated After"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example 'publishDate' or '-publishDate' for newest first (also name, createdAt, updatedAt).","title":"Sort"}},"title":"list_blog_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_blog_post":{"post":{"operationId":"get_blog_post","summary":"Get one blog post's title, slug, URL, state, publish date, author, tags and summary. The body is not returned. Use for \"","description":"Get one blog post's title, slug, URL, state, publish date, author, tags and summary. The body is not returned. Use for \"What is the status of blog post 9001\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"post_id":{"description":"Id of the blog post (a numeric string such as '9001').","maxLength":200,"title":"Post Id","type":"string"}},"required":["post_id"],"title":"get_blog_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/list_blog_post_revisions":{"post":{"operationId":"list_blog_post_revisions","summary":"List earlier saved versions of a blog post with version id, update time, title, slug and state. Use for \"What earlier ve","description":"List earlier saved versions of a blog post with version id, update time, title, slug and state. Use for \"What earlier versions exist of blog post 9001\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"post_id":{"description":"Id of the blog post (a numeric string such as '9001').","maxLength":200,"title":"Post Id","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100).","title":"Limit"},"before":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor for earlier versions: paging.next.after or paging.prev.before from the previous answer.","title":"Before"}},"required":["post_id"],"title":"list_blog_post_revisionsArguments","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_authors":{"post":{"operationId":"list_blog_authors","summary":"List blog authors with display name, full name, slug and language. Email addresses, bios and social links are not return","description":"List blog authors with display name, full name, slug and language. Email addresses, bios and social links are not returned. Use for \"Who are the blog authors\".","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 items to return (1 to 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: paging.next.after from the previous answer. Leave out for the first page.","title":"After"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of active ones.","title":"Archived"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example 'publishDate' or '-publishDate' for newest first (also name, createdAt, updatedAt).","title":"Sort"}},"title":"list_blog_authorsArguments","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_tags":{"post":{"operationId":"list_blog_tags","summary":"List blog tags with name, language and dates. Use for \"What blog tags do we use\".","description":"List blog tags with name, language and dates. Use for \"What blog tags do we use\".","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 items to return (1 to 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: paging.next.after from the previous answer. Leave out for the first page.","title":"After"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of active ones.","title":"Archived"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example 'publishDate' or '-publishDate' for newest first (also name, createdAt, updatedAt).","title":"Sort"}},"title":"list_blog_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/get_blog_tag":{"post":{"operationId":"get_blog_tag","summary":"Get one blog tag by id: name, language and dates. Use for \"What is blog tag 11\".","description":"Get one blog tag by id: name, language and dates. Use for \"What is blog tag 11\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"tag_id":{"description":"Id of the blog tag (a numeric string such as '11').","maxLength":200,"title":"Tag Id","type":"string"}},"required":["tag_id"],"title":"get_blog_tagArguments","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}}}}