{"openapi":"3.1.0","info":{"title":"HubSpot CMS Pages (BYOK) API","version":"0.1.0","description":"HubSpot CMS Pages (BYOK) lets an AI assistant read your own HubSpot CMS Pages data through the HubSpot CMS Pages API with a key you supply (HubSpot private app access token (scope: content)). Read-only: 7 tools (list_site_pages, get_site_page, list_site_page_revisions, list_landing_pages, get_landing_page, list_landing_page_revisions, list_landing_page_folders). The BYOK key travels with each...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-hubspot-cms-pages.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-hubspot-cms-pages/docs"},"termsOfService":"https://connectorbay.com/byok-hubspot-cms-pages/terms"},"servers":[{"url":"https://byok-hubspot-cms-pages.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-hubspot-cms-pages/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_site_pages":{"post":{"operationId":"list_site_pages","summary":"List website pages with name, slug, URL, domain, state, language, publish date and campaign. Page layout and widget cont","description":"List website pages with name, slug, URL, domain, state, language, publish date and campaign. Page layout and widget content are not returned. Use for \"Which website pages were updated in HubSpot this 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 pages 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 pages instead of active ones.","title":"Archived"},"created_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only pages created after this ISO 8601 time.","title":"Created After"},"updated_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only pages 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 'updatedAt' or '-updatedAt' for newest first (also name, createdAt, publishDate).","title":"Sort"}},"title":"list_site_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_site_page":{"post":{"operationId":"get_site_page","summary":"Get one website page's name, slug, URL, state, language, publish date, template path and meta description. Use for \"What","description":"Get one website page's name, slug, URL, state, language, publish date, template path and meta description. Use for \"What is the status of website page 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_id":{"description":"Id of the page (a numeric string such as '123456').","maxLength":200,"title":"Page Id","type":"string"}},"required":["page_id"],"title":"get_site_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_site_page_revisions":{"post":{"operationId":"list_site_page_revisions","summary":"List earlier saved versions of a website page with version id, update time, name, slug and state. Use for \"What earlier ","description":"List earlier saved versions of a website page with version id, update time, name, slug and state. Use for \"What earlier versions exist of website page 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_id":{"description":"Id of the page (a numeric string such as '123456').","maxLength":200,"title":"Page Id","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many pages 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":["page_id"],"title":"list_site_page_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_landing_pages":{"post":{"operationId":"list_landing_pages","summary":"List landing pages with name, slug, URL, domain, state, language, publish date and campaign. Page layout and widget cont","description":"List landing pages with name, slug, URL, domain, state, language, publish date and campaign. Page layout and widget content are not returned. Use for \"Which landing pages are published\".","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 pages 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 pages instead of active ones.","title":"Archived"},"created_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only pages created after this ISO 8601 time.","title":"Created After"},"updated_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only pages 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 'updatedAt' or '-updatedAt' for newest first (also name, createdAt, publishDate).","title":"Sort"}},"title":"list_landing_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_landing_page":{"post":{"operationId":"get_landing_page","summary":"Get one landing page's name, slug, URL, state, language, publish date, template path and meta description. Use for \"What","description":"Get one landing page's name, slug, URL, state, language, publish date, template path and meta description. Use for \"What is the status of landing page 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_id":{"description":"Id of the page (a numeric string such as '123456').","maxLength":200,"title":"Page Id","type":"string"}},"required":["page_id"],"title":"get_landing_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_landing_page_revisions":{"post":{"operationId":"list_landing_page_revisions","summary":"List earlier saved versions of a landing page with version id, update time, name, slug and state. Use for \"What earlier ","description":"List earlier saved versions of a landing page with version id, update time, name, slug and state. Use for \"What earlier versions exist of landing page 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_id":{"description":"Id of the page (a numeric string such as '123456').","maxLength":200,"title":"Page Id","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many pages 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":["page_id"],"title":"list_landing_page_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_landing_page_folders":{"post":{"operationId":"list_landing_page_folders","summary":"List the folders that organize landing pages, with name, parent folder id and dates. Use for \"How are our landing pages ","description":"List the folders that organize landing pages, with name, parent folder id and dates. Use for \"How are our landing pages organized into folders\".","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 pages 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 pages instead of active ones.","title":"Archived"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example 'updatedAt' or '-updatedAt' for newest first (also name, createdAt, publishDate).","title":"Sort"}},"title":"list_landing_page_foldersArguments","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}}}}