{"openapi":"3.1.0","info":{"title":"Novu Layouts (BYOK) API","version":"0.1.0","description":"Novu Layouts (BYOK) lets an AI assistant read your own Novu Layouts data through the Novu Layouts API with a key you supply (secret key (US region)). Read-only: 5 tools (list_layouts, get_layout, get_layout_usage, list_contexts, get_context). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever sent to api.novu.co....\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-novu-layouts-contexts.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-novu-layouts-contexts/docs"},"termsOfService":"https://connectorbay.com/byok-novu-layouts-contexts/terms"},"servers":[{"url":"https://byok-novu-layouts-contexts.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-novu-layouts-contexts/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_layouts":{"post":{"operationId":"list_layouts","summary":"List email layouts of the environment with name, slug, origin (novu-cloud or external), default flag and timestamps. The","description":"List email layouts of the environment with name, slug, origin (novu-cloud or external), default flag and timestamps. The layout design and editor values are not returned. Use for \"Which email layouts does my Novu environment have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many layouts to return (default 10).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many layouts to skip.","title":"Offset"},"order_by":{"anyOf":[{"enum":["createdAt","updatedAt","name"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: createdAt, updatedAt or name.","title":"Order By"},"order_direction":{"anyOf":[{"enum":["ASC","DESC"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: ASC or DESC.","title":"Order Direction"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Text to search layouts by.","title":"Query"}},"title":"list_layoutsArguments","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_layout":{"post":{"operationId":"get_layout","summary":"Get one layout by its layout ID: name, slug, default flag, origin, type and timestamps (the design and editor values are","description":"Get one layout by its layout ID: name, slug, default flag, origin, type and timestamps (the design and editor values are not returned). Use for \"Is the Novu layout default-layout the default one\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"layout_id":{"description":"Layout ID (the layoutId field from list_layouts), for example 'default-layout'.","maxLength":120,"title":"Layout Id","type":"string"}},"required":["layout_id"],"title":"get_layoutArguments","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_layout_usage":{"post":{"operationId":"get_layout_usage","summary":"List the workflows that use a layout, by name and workflow ID. Use for \"Which Novu workflows use the layout default-layo","description":"List the workflows that use a layout, by name and workflow ID. Use for \"Which Novu workflows use the layout default-layout\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"layout_id":{"description":"Layout ID (the layoutId field from list_layouts).","maxLength":120,"title":"Layout Id","type":"string"}},"required":["layout_id"],"title":"get_layout_usageArguments","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_contexts":{"post":{"operationId":"list_contexts","summary":"List contexts (shared key/value records attached to triggers, such as a tenant or an app) with type, ID and timestamps. ","description":"List contexts (shared key/value records attached to triggers, such as a tenant or an app) with type, ID and timestamps. Cursor pagination, optional search. Use for \"Which Novu contexts exist\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: pass next from the previous answer to get the next page.","title":"After"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many items to return (default 10).","title":"Limit"},"order_direction":{"anyOf":[{"enum":["ASC","DESC"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: ASC or DESC.","title":"Order Direction"},"id":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Only contexts with this ID.","title":"Id"},"search":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Search contexts by type or ID (partial match).","title":"Search"}},"title":"list_contextsArguments","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_context":{"post":{"operationId":"get_context","summary":"Get one context by type and ID: timestamps (the stored data object is not returned). Use for \"When was the Novu tenant c","description":"Get one context by type and ID: timestamps (the stored data object is not returned). Use for \"When was the Novu tenant context acme created\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"description":"Context type, for example 'tenant'.","maxLength":80,"title":"Type","type":"string"},"id":{"description":"Context ID, for example 'acme'.","maxLength":120,"title":"Id","type":"string"}},"required":["type","id"],"title":"get_contextArguments","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}}}}