openapi: 3.1.0 info: title: Novu Activity Layouts API description: Novu REST API. Please see https://docs.novu.co/api-reference for more details. version: 3.15.0 contact: name: Novu Support url: https://discord.gg/novu email: support@novu.co termsOfService: https://novu.co/terms license: name: MIT url: https://opensource.org/license/mit servers: - url: https://api.novu.co - url: https://eu.api.novu.co security: - secretKey: [] tags: - name: Layouts description: Layouts are reusable wrappers for your email notifications. externalDocs: url: https://docs.novu.co/platform/workflow/layouts paths: /v2/layouts: post: operationId: LayoutsController_create summary: Novu Create a Layout description: Creates a new layout in the Novu Cloud environment parameters: [] requestBody: required: true description: Layout creation details content: application/json: schema: $ref: '#/components/schemas/CreateLayoutDto' responses: '201': description: Created headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/LayoutResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] get: operationId: LayoutsController_list summary: Novu List All Layouts description: Retrieves a list of layouts with optional filtering and pagination parameters: - name: limit required: false in: query description: Number of items to return per page example: 10 schema: type: number - name: offset required: false in: query description: Number of items to skip before starting to return results example: 0 schema: type: number - name: orderDirection required: false in: query description: Direction of sorting schema: $ref: '#/components/schemas/DirectionEnum' - name: orderBy required: false in: query description: Field to sort the results by schema: $ref: '#/components/schemas/LayoutResponseDtoSortField' - name: query required: false in: query description: Search query to filter layouts schema: type: string responses: '200': description: OK headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/ListLayoutResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] /v2/layouts/{layoutId}: put: operationId: LayoutsController_update summary: Novu Update a Layout description: Updates the details of an existing layout, here **layoutId** is the identifier of the layout parameters: - name: layoutId required: true in: path schema: type: string requestBody: required: true description: Layout update details content: application/json: schema: $ref: '#/components/schemas/UpdateLayoutDto' responses: '200': description: OK headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/LayoutResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] get: operationId: LayoutsController_get summary: Novu Retrieve a Layout description: Fetches details of a specific layout by its unique identifier **layoutId** parameters: - name: layoutId required: true in: path schema: type: string responses: '200': description: OK headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/LayoutResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] delete: operationId: LayoutsController__delete summary: Novu Delete a Layout description: Removes a specific layout by its unique identifier **layoutId** parameters: - name: layoutId required: true in: path description: The unique identifier of the layout schema: type: string responses: '204': description: '' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] /v2/layouts/{layoutId}/duplicate: post: operationId: LayoutsController_duplicate x-speakeasy-name-override: duplicate summary: Novu Duplicate a Layout description: Duplicates a layout by its unique identifier **layoutId**. This will create a new layout with the content of the original layout. parameters: - name: layoutId required: true in: path schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DuplicateLayoutDto' responses: '201': description: Created headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/LayoutResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] /v2/layouts/{layoutId}/preview: post: operationId: LayoutsController_generatePreview x-speakeasy-name-override: generatePreview summary: Novu Generate Layout Preview description: Generates a preview for a layout by its unique identifier **layoutId** parameters: - name: layoutId required: true in: path schema: type: string requestBody: required: true description: Layout preview generation details content: application/json: schema: $ref: '#/components/schemas/LayoutPreviewRequestDto' responses: '201': description: Created headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/GenerateLayoutPreviewResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] /v2/layouts/{layoutId}/usage: get: operationId: LayoutsController_getUsage x-speakeasy-name-override: usage summary: Novu Get Layout Usage description: Retrieves information about workflows that use the specified layout by its unique identifier **layoutId** parameters: - name: layoutId required: true in: path schema: type: string responses: '200': description: OK headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: properties: data: $ref: '#/components/schemas/GetLayoutUsageResponseDto' '400': description: Bad Request headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '401': description: Unauthorized headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '403': description: Forbidden headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '404': description: Not Found headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '405': description: Method Not Allowed headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '409': description: Conflict headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '413': description: Payload Too Large headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '414': description: URI Too Long content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '415': description: Unsupported Media Type headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '422': description: Unprocessable Entity headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ValidationErrorDto' '429': description: 'The client has sent too many requests in a given amount of time. ' headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: API rate limit exceeded '500': description: Internal Server Error headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' content: application/json: schema: $ref: '#/components/schemas/ErrorDto' '503': description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. headers: Content-Type: $ref: '#/components/headers/Content-Type' RateLimit-Limit: $ref: '#/components/headers/RateLimit-Limit' RateLimit-Remaining: $ref: '#/components/headers/RateLimit-Remaining' RateLimit-Reset: $ref: '#/components/headers/RateLimit-Reset' RateLimit-Policy: $ref: '#/components/headers/RateLimit-Policy' Idempotency-Key: $ref: '#/components/headers/Idempotency-Key' Idempotency-Replay: $ref: '#/components/headers/Idempotency-Replay' Retry-After: $ref: '#/components/headers/Retry-After' content: application/json: schema: type: string example: Please wait some time, then try again. tags: - Layouts security: - secretKey: [] components: schemas: UiSchema: type: object properties: group: $ref: '#/components/schemas/UiSchemaGroupEnum' properties: type: object description: Properties of the UI Schema additionalProperties: $ref: '#/components/schemas/UiSchemaProperty' ResourceTypeEnum: type: string description: Type of the layout enum: - REGULAR - ECHO - BRIDGE ChannelSettingsDto: type: object properties: providerId: $ref: '#/components/schemas/ChatOrPushProviderEnum' integrationIdentifier: type: string description: The integration identifier credentials: description: Credentials payload for the specified provider allOf: - $ref: '#/components/schemas/ChannelCredentials' _integrationId: type: string description: The unique identifier of the integration associated with this channel. required: - providerId - credentials - _integrationId UpdateLayoutDto: type: object properties: name: type: string description: Name of the layout isTranslationEnabled: type: boolean description: Enable or disable translations for this layout default: false controlValues: description: Control values for the layout. Omit to leave unchanged, or set to null to clear stored control values. allOf: - $ref: '#/components/schemas/LayoutControlValuesDto' required: - name LayoutResponseDto: type: object properties: _id: type: string description: Unique internal identifier of the layout layoutId: type: string description: Unique identifier for the layout slug: type: string description: Slug of the layout name: type: string description: Name of the layout isDefault: type: boolean description: Whether the layout is the default layout isTranslationEnabled: type: boolean description: Whether the layout translations are enabled updatedAt: type: string description: Last updated timestamp updatedBy: description: User who last updated the layout allOf: - $ref: '#/components/schemas/UserResponseDto' createdAt: type: string description: Creation timestamp origin: $ref: '#/components/schemas/ResourceOriginEnum' type: $ref: '#/components/schemas/ResourceTypeEnum' variables: type: - object - 'null' description: The variables JSON Schema for the layout additionalProperties: true controls: description: Controls metadata for the layout allOf: - $ref: '#/components/schemas/LayoutControlsDto' required: - _id - layoutId - slug - name - isDefault - isTranslationEnabled - updatedAt - createdAt - origin - type - controls DuplicateLayoutDto: type: object properties: name: type: string description: Name of the layout layoutId: type: string description: Identifier for the duplicated layout. When omitted, it is derived from the name. isTranslationEnabled: type: boolean description: Enable or disable translations for this layout default: false required: - name LayoutPreviewPayloadDto: type: object properties: subscriber: description: Partial subscriber information allOf: - $ref: '#/components/schemas/SubscriberResponseDtoOptional' ConstraintValidation: type: object properties: messages: type: array items: type: string description: List of validation error messages example: - Field is required - Invalid format value: description: Value that failed validation oneOf: - type: - string - 'null' - type: number - type: boolean - type: object - type: array items: anyOf: - type: - string - 'null' - type: number - type: boolean - type: object additionalProperties: true example: 'xx xx xx ' required: - messages UserResponseDto: type: object properties: _id: type: string description: User ID firstName: type: - string - 'null' description: User first name lastName: type: - string - 'null' description: User last name externalId: type: - string - 'null' description: User external ID required: - _id EmailControlsDto: type: object properties: body: type: string description: Body of the layout. editorType: type: string description: Editor type of the layout. enum: - html - block required: - body - editorType UiSchemaGroupEnum: type: string description: Group of the UI Schema enum: - IN_APP - EMAIL - DIGEST - DELAY - THROTTLE - SMS - CHAT - PUSH - SKIP - LAYOUT - HTTP_REQUEST ResourceOriginEnum: type: string description: Origin of the layout enum: - novu-cloud - novu-cloud-v1 - external EmailLayoutRenderOutput: type: object properties: body: type: string description: Content of the email required: - body ListLayoutResponseDto: type: object properties: layouts: description: List of layouts type: array items: $ref: '#/components/schemas/LayoutResponseDto' totalCount: type: number description: Total number of layouts required: - layouts - totalCount ErrorDto: type: object properties: statusCode: type: number description: HTTP status code of the error response. example: 404 timestamp: type: string description: Timestamp of when the error occurred. example: '2024-12-12T13:00:00Z' path: type: string description: The path where the error occurred. example: /api/v1/resource message: description: Value that failed validation oneOf: - type: - string - 'null' - type: number - type: boolean - type: - object - 'null' - type: array items: anyOf: - type: - string - 'null' - type: number - type: boolean - type: object additionalProperties: true example: 'xx xx xx ' ctx: type: object description: Optional context object for additional error details. additionalProperties: true example: workflowId: some_wf_id stepId: some_wf_id errorId: type: string description: "Optional unique identifier for the error, useful for tracking using Sentry and \n New Relic, only available for 500." example: abc123 required: - statusCode - timestamp - path ValidationErrorDto: type: object properties: statusCode: type: number description: HTTP status code of the error response. example: 404 timestamp: type: string description: Timestamp of when the error occurred. example: '2024-12-12T13:00:00Z' path: type: string description: The path where the error occurred. example: /api/v1/resource message: description: Value that failed validation oneOf: - type: - string - 'null' - type: number - type: boolean - type: - object - 'null' - type: array items: anyOf: - type: - string - 'null' - type: number - type: boolean - type: object additionalProperties: true example: 'xx xx xx ' ctx: type: object description: Optional context object for additional error details. additionalProperties: true example: workflowId: some_wf_id stepId: some_wf_id errorId: type: string description: "Optional unique identifier for the error, useful for tracking using Sentry and \n New Relic, only available for 500." example: abc123 errors: type: object description: A record of validation errors keyed by field name additionalProperties: $ref: '#/components/schemas/ConstraintValidation' example: fieldName1: messages: - Field is required - Must be a valid email address value: invalidEmail fieldName2: messages: - Must be at least 18 years old value: 17 fieldName3: messages: - Must be a boolean value value: true fieldName4: messages: - Must be a valid object value: key: value fieldName5: messages: - Field is missing value: null fieldName6: messages: - Undefined value required: - statusCode - timestamp - path - errors LayoutResponseDtoSortField: type: string enum: - createdAt - updatedAt - name GetLayoutUsageResponseDto: type: object properties: workflows: description: Array of workflows that use this layout type: array items: $ref: '#/components/schemas/WorkflowInfoDto' required: - workflows UiSchemaProperty: type: object properties: placeholder: description: Placeholder for the UI Schema Property anyOf: - type: string - type: number - type: boolean - type: object additionalProperties: true - type: array items: anyOf: - type: string - type: number - type: boolean - type: object additionalProperties: true component: $ref: '#/components/schemas/UiComponentEnum' properties: type: object description: Properties of the UI Schema additionalProperties: $ref: '#/components/schemas/UiSchemaProperty' required: - component DirectionEnum: type: string enum: - ASC - DESC LayoutCreationSourceEnum: type: string description: Source of layout creation default: dashboard enum: - dashboard WorkflowInfoDto: type: object properties: name: type: string description: The name of the workflow example: Welcome Email workflowId: type: string description: The unique identifier of the workflow example: welcome-email required: - name - workflowId LayoutControlsDto: type: object properties: dataSchema: type: object description: JSON Schema for data additionalProperties: true uiSchema: description: UI Schema for rendering allOf: - $ref: '#/components/schemas/UiSchema' values: description: Email layout controls allOf: - $ref: '#/components/schemas/LayoutControlValuesDto' required: - values LayoutPreviewRequestDto: type: object properties: controlValues: type: object description: Optional control values for layout preview additionalProperties: true previewPayload: description: Optional payload for layout preview allOf: - $ref: '#/components/schemas/LayoutPreviewPayloadDto' GenerateLayoutPreviewResponseDto: type: object properties: previewPayloadExample: description: Preview payload example allOf: - $ref: '#/components/schemas/LayoutPreviewPayloadDto' schema: type: - object - 'null' description: The payload schema that was used to generate the preview payload example additionalProperties: true result: description: Preview result oneOf: - properties: type: enum: - email preview: $ref: '#/components/schemas/EmailLayoutRenderOutput' required: - previewPayloadExample - result LayoutControlValuesDto: type: object properties: email: description: Email layout controls allOf: - $ref: '#/components/schemas/EmailControlsDto' UiComponentEnum: type: string description: Component type for the UI Schema Property enum: - EMAIL_EDITOR_SELECT - LAYOUT_SELECT - BLOCK_EDITOR - EMAIL_BODY - TEXT_FULL_LINE - TEXT_INLINE_LABEL - IN_APP_BODY - IN_APP_AVATAR - IN_APP_PRIMARY_SUBJECT - IN_APP_BUTTON_DROPDOWN - IN_APP_DISABLE_SANITIZATION_SWITCH - DISABLE_SANITIZATION_SWITCH - URL_TEXT_BOX - DIGEST_AMOUNT - DIGEST_UNIT - DIGEST_TYPE - DIGEST_KEY - DIGEST_CRON - DELAY_AMOUNT - DELAY_UNIT - DELAY_TYPE - DELAY_CRON - DELAY_DYNAMIC_KEY - THROTTLE_TYPE - THROTTLE_WINDOW - THROTTLE_UNIT - THROTTLE_DYNAMIC_KEY - THROTTLE_THRESHOLD - THROTTLE_KEY - EXTEND_TO_SCHEDULE - SMS_BODY - CHAT_BODY - PUSH_BODY - PUSH_SUBJECT - QUERY_EDITOR - DATA - LAYOUT_EMAIL - DESTINATION_METHOD - DESTINATION_URL - DESTINATION_HEADERS - DESTINATION_BODY - DESTINATION_RESPONSE_BODY_SCHEMA - DESTINATION_ENFORCE_SCHEMA_VALIDATION - DESTINATION_CONTINUE_ON_FAILURE - DESTINATION_TIMEOUT CreateLayoutDto: type: object properties: layoutId: type: string description: Unique identifier for the layout name: type: string description: Name of the layout isTranslationEnabled: type: boolean description: Enable or disable translations for this layout default: false __source: $ref: '#/components/schemas/LayoutCreationSourceEnum' required: - layoutId - name ChatOrPushProviderEnum: type: string description: The provider identifier for the credentials enum: - slack - discord - msteams - mattermost - ryver - zulip - grafana-on-call - getstream - rocket-chat - whatsapp-business - chat-webhook - novu-slack - telegram - fcm - apns - expo - one-signal - pushpad - push-webhook - pusher-beams - appio ChannelCredentials: type: object properties: webhookUrl: type: string description: Webhook URL used by chat app integrations. The webhook should be obtained from the chat app provider. example: https://example.com/webhook channel: type: string description: Channel specification for Mattermost chat notifications. example: general deviceTokens: description: Contains an array of the subscriber device tokens for a given provider. Used on Push integrations. example: - token1 - token2 - token3 type: array items: type: string alertUid: type: string description: Alert UID for Grafana on-call webhook payload. example: 12345-abcde title: type: string description: Title to be used with Grafana on-call webhook. example: Critical Alert imageUrl: type: string description: Image URL property for Grafana on-call webhook. example: https://example.com/image.png state: type: string description: State property for Grafana on-call webhook. example: resolved externalUrl: type: string description: Link to upstream details property for Grafana on-call webhook. example: https://example.com/details SubscriberResponseDtoOptional: type: object properties: _id: type: string description: The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. firstName: type: - string - 'null' description: The first name of the subscriber. lastName: type: - string - 'null' description: The last name of the subscriber. email: type: - string - 'null' description: The email address of the subscriber. phone: type: - string - 'null' description: The phone number of the subscriber. avatar: type: - string - 'null' description: The URL of the subscriber's avatar image. locale: type: - string - 'null' description: The locale setting of the subscriber, indicating their preferred language or region. channels: description: An array of channel settings associated with the subscriber. type: array items: $ref: '#/components/schemas/ChannelSettingsDto' topics: description: An array of topics that the subscriber is subscribed to. deprecated: true type: array items: type: string isOnline: type: - boolean - 'null' description: Indicates whether the subscriber is currently online. lastOnlineAt: type: - string - 'null' description: The timestamp indicating when the subscriber was last online, in ISO 8601 format. __v: type: number description: The version of the subscriber document. data: type: - object - 'null' description: Additional custom data for the subscriber additionalProperties: true timezone: type: - string - 'null' description: Timezone of the subscriber headers: RateLimit-Remaining: required: false description: The number of requests remaining until the next window. schema: type: string example: '93' Idempotency-Key: required: false description: The idempotency key used to evaluate the request. schema: type: string example: '8' Idempotency-Replay: required: false description: Whether the request was a replay of a previous request. schema: type: string example: 'true' Retry-After: required: false description: The number of seconds after which the client may retry the request that was previously rejected. schema: type: string example: '8' RateLimit-Limit: required: false description: The number of requests that the client is permitted to make per second. The actual maximum may differ when burst is enabled. schema: type: string example: '100' RateLimit-Reset: required: false description: The remaining seconds until a request of the same cost will be refreshed. schema: type: string example: '8' RateLimit-Policy: required: false description: The rate limit policy that was used to evaluate the request. schema: type: string example: 100;w=1;burst=110;comment="token bucket";category="trigger";cost="single" Content-Type: required: true description: The MIME type of the response body. schema: type: string example: application/json securitySchemes: secretKey: type: apiKey name: Authorization in: header description: 'API key authentication. Allowed headers-- "Authorization: ApiKey ".' x-speakeasy-example: YOUR_SECRET_KEY_HERE externalDocs: description: Novu Documentation url: https://docs.novu.co x-webhooks: message.sent: post: summary: 'Event: message.sent' description: This webhook is triggered when a `message` event (`message.sent`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.sent` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.failed: post: summary: 'Event: message.failed' description: This webhook is triggered when a `message` event (`message.failed`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.failed` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageFailedDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.delivered: post: summary: 'Event: message.delivered' description: This webhook is triggered when a `message` event (`message.delivered`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.delivered` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.seen: post: summary: 'Event: message.seen' description: This webhook is triggered when a `message` event (`message.seen`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.seen` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.read: post: summary: 'Event: message.read' description: This webhook is triggered when a `message` event (`message.read`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.read` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.unread: post: summary: 'Event: message.unread' description: This webhook is triggered when a `message` event (`message.unread`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.unread` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.archived: post: summary: 'Event: message.archived' description: This webhook is triggered when a `message` event (`message.archived`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.archived` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.unarchived: post: summary: 'Event: message.unarchived' description: This webhook is triggered when a `message` event (`message.unarchived`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.unarchived` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.snoozed: post: summary: 'Event: message.snoozed' description: This webhook is triggered when a `message` event (`message.snoozed`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.snoozed` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.unsnoozed: post: summary: 'Event: message.unsnoozed' description: This webhook is triggered when a `message` event (`message.unsnoozed`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.unsnoozed` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks message.deleted: post: summary: 'Event: message.deleted' description: This webhook is triggered when a `message` event (`message.deleted`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `message.deleted` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookMessageDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks workflow.created: post: summary: 'Event: workflow.created' description: This webhook is triggered when a `workflow` event (`workflow.created`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `workflow.created` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookCreatedWorkflowDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks workflow.updated: post: summary: 'Event: workflow.updated' description: This webhook is triggered when a `workflow` event (`workflow.updated`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `workflow.updated` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookUpdatedWorkflowDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks workflow.deleted: post: summary: 'Event: workflow.deleted' description: This webhook is triggered when a `workflow` event (`workflow.deleted`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `workflow.deleted` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookDeletedWorkflowDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks workflow.published: post: summary: 'Event: workflow.published' description: This webhook is triggered when a `workflow` event (`workflow.published`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `workflow.published` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookUpdatedWorkflowDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks preference.updated: post: summary: 'Event: preference.updated' description: This webhook is triggered when a `preference` event (`preference.updated`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `preference.updated` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookPreferenceDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks email.received: post: summary: 'Event: email.received' description: This webhook is triggered when a `email_inbound` event (`email.received`) occurs. The payload contains the details of the event. Configure your webhook endpoint URL in the Novu dashboard. requestBody: description: Webhook payload for the `email.received` event. required: true content: application/json: schema: $ref: '#/components/schemas/WebhookInboundEmailDtoWebhookPayloadWrapper' responses: '200': description: Acknowledges successful receipt of the webhook. No response body is expected. tags: - Webhooks