diff --git a/.spectral.yml b/.spectral.yml index d5bed2a..e90b8db 100644 --- a/.spectral.yml +++ b/.spectral.yml @@ -1,451 +1,3 @@ -extends: spectral:oas -functions: - - oasOpIdFormat - - oasOpSdk +rules: {} -aliases: - Operation_List_Schema: - description: The schema of all operations that list resources, e.g. GET /resources - targets: - - formats: - - oas3 - given: - - "#Operation_List.responses[?(@property >= 200 && @property < 300)].content[*].schema" - Operation_List: - description: All operations that list resources, e.g. `GET /resources` - targets: - - formats: - - oas3 - given: - - "$.paths[?(!(@property).endsWith('}'))].get" - -rules: - openapi-tags-alphabetical: off - operation-success-response: error - oas2-operation-formData-consume-check: error - operation-parameters: error - operation-tag-defined: error - contact-properties: error - duplicated-entry-in-enum: error - info-contact: error - info-description: error - info-license: error - license-url: error - no-eval-in-markdown: error - no-script-tags-in-markdown: error - openapi-tags: error - operation-description: error - operation-operationId: error - operation-operationId-valid-in-url: error - operation-singular-tag: error - operation-tags: error - path-declarations-must-exist: error - path-keys-no-trailing-slash: error - path-not-include-query: error - tag-description: error - typed-enum: error - oas2-api-host: error - oas2-api-schemes: error - oas2-host-not-example: error - oas2-host-trailing-slash: error - oas2-parameter-description: error - oas2-operation-security-defined: error - oas2-anyOf: error - oas2-oneOf: error - oas2-unused-definition: error - oas3-api-servers: error - oas3-examples-value-or-externalValue: error - oas3-operation-security-defined: error - oas3-parameter-description: error - oas3-server-not-example.com: error - oas3-server-trailing-slash: error - oas3-unused-component: error - - ### CORE RULES ### - schema-examples: - description: Schemas must have non-empty "x-examples" object. - severity: error - given: $.components.schemas[*] - then: - field: x-examples - function: schema - functionOptions: - dialect: draft7 - schema: - type: object - minProperties: 1 - schema-descriptions: - description: Schemas must have a "description". - severity: error - given: - - $..schemas[*] - - $..responses[*].content[*]..schema - - $..requestBody.content[*]..schema - then: - field: description - function: truthy - schema-property-descriptions: # Note: this rule is not de-duplicated, and will show on parents $ref'ing children with issues until all child issues are resolved. - description: Schema properties must have a "description". - severity: error - given: - - $..schema[*]..properties[*] - - $..responses[*].content[*]..schema..properties[*] - - $..requestBody.content[*]..schema..properties[*] - - $..headers[*] - then: - field: description - function: truthy - schema-property-examples: # Note: this rule is not de-duplicated, and will show on parents $ref'ing children with issues until all child issues are resolved. - description: Schema properties must have an "example". - severity: error - given: - - $..schema[*]..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] - - $..responses[*].content[*]..schema..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] - - $..requestBody.content[*]..schema..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] - - $..headers[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] - then: - field: example - function: defined - payload-examples: - description: Request & response payload content must have non-empty "examples" object. - severity: error - given: - - $..responses[*].content[*] - - $..requestBody.content[*] - then: - field: examples - function: schema - functionOptions: - dialect: draft7 - schema: - type: object - minProperties: 1 - - ### API SPECIFIC RULES ### - required-all-request-headers: - given: - - "$.paths[*][get,put,post,delete,options,head,patch,trace]" - severity: error - then: - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^X-Api-Key$" - field: parameters - description: 'All requests must have the following headers "parameters": "X-Api-Key".' - required-read-request-headers: - given: - - "$.paths[*][get]" - severity: error - then: - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^Accept$" - field: parameters - description: 'Read requests must have the following headers "parameters": "Accept".' - required-write-request-headers: - given: - - "$.paths[*][put,post]" - severity: error - then: - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^Content-Type$" - field: parameters - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^Accept$" - field: parameters - description: - 'Write requests must have the following headers "parameters": "Content-Type", - "Accept".' - required-list-pagination-request-query-parameters: - given: - - "$.paths[?(!/{.*Id}$/i.test(@property))]['get']" - severity: error - then: - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^limit$" - field: parameters - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^offset$" - field: parameters - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^sortOrder$" - field: parameters - - function: schema - functionOptions: - dialect: draft7 - schema: - type: array - contains: - type: object - properties: - name: - type: string - pattern: "^sortFields$" - field: parameters - description: - 'Read list requests must have the following query "parameters": "limit", - "offset", "sortOrder", "sortFields".' - required-all-response-headers: - given: - - "$..responses[*]" - severity: error - then: - function: schema - functionOptions: - dialect: draft7 - schema: - type: object - required: - - Access-Control-Allow-Origin - - Expires - - Cache-Control - field: headers - description: - 'All responses must have the following "headers": "Access-Control-Allow-Origin", - "Expires", "Cache-Control".' - required-content-response-headers: - given: - - "$.paths[*]..responses[?(@property != 204)]" - severity: error - then: - function: schema - functionOptions: - dialect: draft7 - schema: - type: object - required: - - Content-Type - - Content-Length - field: headers - description: - 'Responses with content must have the following "headers": "Content-Type", - "Content-Length".' - required-post-response-headers: - given: - - "$.paths[*][post]..responses[?(@property != 204 && @property >= 200 && @property - < 300)]" - severity: error - then: - function: schema - functionOptions: - dialect: draft7 - schema: - type: object - required: - - Location - field: headers - description: - 'Successful post endpoint responses must have the following "headers": - "Location".' - operation-sdkOperation-format: - given: - - "$" - severity: error - then: - function: oasOpSdk - functionOptions: - exceptions: [] - description: |- - All operations must include an "x-sdkOperation" vendor extension for use in human-readable SDK method names. - - Must start with one of the following values, corresponding to the operation on the resource: - * `create` - `POST /resource` - * `retrieve` - `GET /resource/{resourceId}` - * `update` - `PUT /resource/{resourceId}` - * `delete` - `DELETE /resource/{resourceId}` - * `list` - `GET /resource` - - An optional noun suffix describing any sub-resources may be included as appropriate. - - **Valid Example** - - ```json - { - "x-sdkOperation": "create" - } - // OR - { - "x-sdkOperation": "listWebhookCalls" - } - ``` - - **Invalid Example** - - ```json - { - "x-sdkOperation": "post" - } - // OR - { - "x-sdkOperation": "getWebhookCalls" - } - ``` - message: "{{error}}" - operation-operationId-format: - given: - - "$" - severity: error - then: - function: oasOpIdFormat - functionOptions: - exceptions: [] - description: |- - All operations must include an appropriately named "operationId". - - Must end with one of the following values, corresponding to the operation on the - resource: - * `Create` - `POST /resource` - * `Retrieve` - `GET /resource/{resourceId}` - * `Update` - `PUT /resource/{resourceId}` - * `Delete` - `DELETE /resource/{resourceId}` - * `List` - `GET /resource` - - An optional noun prefix describing any sub-resources - may be included as appropriate. - - **Valid Example** - - ```json - { - "operationId": "messageCreate" - } - // OR - { - "operationId": "webhookCallList" - } - ``` - - **Invalid Example** - - ```json - { - "operationId": "getMessage" - } - // OR - { - "operationId": "getWebhookCalls" - } - ``` - message: "{{error}}" - operation-list-schema-keys: - given: - - "#Operation_List_Schema" - severity: error - then: - function: pattern - functionOptions: - match: Collection$ - field: "$ref" - description: List operation response schema must have key ending with "Collection". - message: List operation response schema must have key ending with "Collection". - operation-list-schema-title: - given: - - "#Operation_List_Schema" - severity: error - then: - function: pattern - functionOptions: - match: Collection$ - field: title - description: |- - List operation response schema must have title ending with "Collection". - - **Valid Example** - - ```json - { - "title": "Message Collection" - } - // OR - { - "title": "Webhook Call Collection" - } - ``` - - **Invalid Example** - - ```json - { - "title": "Message List Response" - } - // OR - { - "title": "Webhook Call List" - } - ``` - message: List operation response schema must have title ending with "Collection". -overrides: - - files: - - "**#/paths/~1auth~1verify/get" - rules: - required-list-pagination-request-query-parameters: "off" - - files: - - "**#/paths/~1auth~1verify/get/operationId" - rules: - operation-operationId-format: "off" - - files: - - "**#/paths/~1auth~1verify/get/x-sdkOperation" - rules: - operation-sdkOperation-format: "off" diff --git a/.stoplight/.spectral.yml_original b/.stoplight/.spectral.yml_original new file mode 100644 index 0000000..d5bed2a --- /dev/null +++ b/.stoplight/.spectral.yml_original @@ -0,0 +1,451 @@ +extends: spectral:oas + +functions: + - oasOpIdFormat + - oasOpSdk + +aliases: + Operation_List_Schema: + description: The schema of all operations that list resources, e.g. GET /resources + targets: + - formats: + - oas3 + given: + - "#Operation_List.responses[?(@property >= 200 && @property < 300)].content[*].schema" + Operation_List: + description: All operations that list resources, e.g. `GET /resources` + targets: + - formats: + - oas3 + given: + - "$.paths[?(!(@property).endsWith('}'))].get" + +rules: + openapi-tags-alphabetical: off + operation-success-response: error + oas2-operation-formData-consume-check: error + operation-parameters: error + operation-tag-defined: error + contact-properties: error + duplicated-entry-in-enum: error + info-contact: error + info-description: error + info-license: error + license-url: error + no-eval-in-markdown: error + no-script-tags-in-markdown: error + openapi-tags: error + operation-description: error + operation-operationId: error + operation-operationId-valid-in-url: error + operation-singular-tag: error + operation-tags: error + path-declarations-must-exist: error + path-keys-no-trailing-slash: error + path-not-include-query: error + tag-description: error + typed-enum: error + oas2-api-host: error + oas2-api-schemes: error + oas2-host-not-example: error + oas2-host-trailing-slash: error + oas2-parameter-description: error + oas2-operation-security-defined: error + oas2-anyOf: error + oas2-oneOf: error + oas2-unused-definition: error + oas3-api-servers: error + oas3-examples-value-or-externalValue: error + oas3-operation-security-defined: error + oas3-parameter-description: error + oas3-server-not-example.com: error + oas3-server-trailing-slash: error + oas3-unused-component: error + + ### CORE RULES ### + schema-examples: + description: Schemas must have non-empty "x-examples" object. + severity: error + given: $.components.schemas[*] + then: + field: x-examples + function: schema + functionOptions: + dialect: draft7 + schema: + type: object + minProperties: 1 + schema-descriptions: + description: Schemas must have a "description". + severity: error + given: + - $..schemas[*] + - $..responses[*].content[*]..schema + - $..requestBody.content[*]..schema + then: + field: description + function: truthy + schema-property-descriptions: # Note: this rule is not de-duplicated, and will show on parents $ref'ing children with issues until all child issues are resolved. + description: Schema properties must have a "description". + severity: error + given: + - $..schema[*]..properties[*] + - $..responses[*].content[*]..schema..properties[*] + - $..requestBody.content[*]..schema..properties[*] + - $..headers[*] + then: + field: description + function: truthy + schema-property-examples: # Note: this rule is not de-duplicated, and will show on parents $ref'ing children with issues until all child issues are resolved. + description: Schema properties must have an "example". + severity: error + given: + - $..schema[*]..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] + - $..responses[*].content[*]..schema..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] + - $..requestBody.content[*]..schema..properties[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] + - $..headers[?(@ && @.type && @.type !== "array" && @.type !== "object" && @.type !== "boolean" && !@.enum)] + then: + field: example + function: defined + payload-examples: + description: Request & response payload content must have non-empty "examples" object. + severity: error + given: + - $..responses[*].content[*] + - $..requestBody.content[*] + then: + field: examples + function: schema + functionOptions: + dialect: draft7 + schema: + type: object + minProperties: 1 + + ### API SPECIFIC RULES ### + required-all-request-headers: + given: + - "$.paths[*][get,put,post,delete,options,head,patch,trace]" + severity: error + then: + function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^X-Api-Key$" + field: parameters + description: 'All requests must have the following headers "parameters": "X-Api-Key".' + required-read-request-headers: + given: + - "$.paths[*][get]" + severity: error + then: + function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^Accept$" + field: parameters + description: 'Read requests must have the following headers "parameters": "Accept".' + required-write-request-headers: + given: + - "$.paths[*][put,post]" + severity: error + then: + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^Content-Type$" + field: parameters + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^Accept$" + field: parameters + description: + 'Write requests must have the following headers "parameters": "Content-Type", + "Accept".' + required-list-pagination-request-query-parameters: + given: + - "$.paths[?(!/{.*Id}$/i.test(@property))]['get']" + severity: error + then: + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^limit$" + field: parameters + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^offset$" + field: parameters + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^sortOrder$" + field: parameters + - function: schema + functionOptions: + dialect: draft7 + schema: + type: array + contains: + type: object + properties: + name: + type: string + pattern: "^sortFields$" + field: parameters + description: + 'Read list requests must have the following query "parameters": "limit", + "offset", "sortOrder", "sortFields".' + required-all-response-headers: + given: + - "$..responses[*]" + severity: error + then: + function: schema + functionOptions: + dialect: draft7 + schema: + type: object + required: + - Access-Control-Allow-Origin + - Expires + - Cache-Control + field: headers + description: + 'All responses must have the following "headers": "Access-Control-Allow-Origin", + "Expires", "Cache-Control".' + required-content-response-headers: + given: + - "$.paths[*]..responses[?(@property != 204)]" + severity: error + then: + function: schema + functionOptions: + dialect: draft7 + schema: + type: object + required: + - Content-Type + - Content-Length + field: headers + description: + 'Responses with content must have the following "headers": "Content-Type", + "Content-Length".' + required-post-response-headers: + given: + - "$.paths[*][post]..responses[?(@property != 204 && @property >= 200 && @property + < 300)]" + severity: error + then: + function: schema + functionOptions: + dialect: draft7 + schema: + type: object + required: + - Location + field: headers + description: + 'Successful post endpoint responses must have the following "headers": + "Location".' + operation-sdkOperation-format: + given: + - "$" + severity: error + then: + function: oasOpSdk + functionOptions: + exceptions: [] + description: |- + All operations must include an "x-sdkOperation" vendor extension for use in human-readable SDK method names. + + Must start with one of the following values, corresponding to the operation on the resource: + * `create` - `POST /resource` + * `retrieve` - `GET /resource/{resourceId}` + * `update` - `PUT /resource/{resourceId}` + * `delete` - `DELETE /resource/{resourceId}` + * `list` - `GET /resource` + + An optional noun suffix describing any sub-resources may be included as appropriate. + + **Valid Example** + + ```json + { + "x-sdkOperation": "create" + } + // OR + { + "x-sdkOperation": "listWebhookCalls" + } + ``` + + **Invalid Example** + + ```json + { + "x-sdkOperation": "post" + } + // OR + { + "x-sdkOperation": "getWebhookCalls" + } + ``` + message: "{{error}}" + operation-operationId-format: + given: + - "$" + severity: error + then: + function: oasOpIdFormat + functionOptions: + exceptions: [] + description: |- + All operations must include an appropriately named "operationId". + + Must end with one of the following values, corresponding to the operation on the + resource: + * `Create` - `POST /resource` + * `Retrieve` - `GET /resource/{resourceId}` + * `Update` - `PUT /resource/{resourceId}` + * `Delete` - `DELETE /resource/{resourceId}` + * `List` - `GET /resource` + + An optional noun prefix describing any sub-resources + may be included as appropriate. + + **Valid Example** + + ```json + { + "operationId": "messageCreate" + } + // OR + { + "operationId": "webhookCallList" + } + ``` + + **Invalid Example** + + ```json + { + "operationId": "getMessage" + } + // OR + { + "operationId": "getWebhookCalls" + } + ``` + message: "{{error}}" + operation-list-schema-keys: + given: + - "#Operation_List_Schema" + severity: error + then: + function: pattern + functionOptions: + match: Collection$ + field: "$ref" + description: List operation response schema must have key ending with "Collection". + message: List operation response schema must have key ending with "Collection". + operation-list-schema-title: + given: + - "#Operation_List_Schema" + severity: error + then: + function: pattern + functionOptions: + match: Collection$ + field: title + description: |- + List operation response schema must have title ending with "Collection". + + **Valid Example** + + ```json + { + "title": "Message Collection" + } + // OR + { + "title": "Webhook Call Collection" + } + ``` + + **Invalid Example** + + ```json + { + "title": "Message List Response" + } + // OR + { + "title": "Webhook Call List" + } + ``` + message: List operation response schema must have title ending with "Collection". +overrides: + - files: + - "**#/paths/~1auth~1verify/get" + rules: + required-list-pagination-request-query-parameters: "off" + - files: + - "**#/paths/~1auth~1verify/get/operationId" + rules: + operation-operationId-format: "off" + - files: + - "**#/paths/~1auth~1verify/get/x-sdkOperation" + rules: + operation-sdkOperation-format: "off" diff --git a/openapi.yaml b/openapi.yaml index cc1d995..1e5f19d 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -11067,11 +11067,15 @@ components: Customers can send templated WhatsApp messages via Whispir's API. - Templates must first be submitted for approval by WhatsApp in your WhatsApp Business Manager account before any template messages can be sent from Whispir. Please reach out to your Whispir account manager to help you get started. + Templates must first be submitted for approval by WhatsApp in your WhatsApp Business Manager account before any template messages can be sent from Whispir. + + Please reach out to your Whispir account manager to help you get started. + + + #### WhatsApp Messages via Rich Message Templates (v2) + Note that from **October 2025** WhatsApp messages can also be configured in Whispir Rich Message Templates. These templates can then be used to send WhatsApp messages via the Whispir API. - #### WhatsApp Messages via Rich Message Templates - Note that from **October 2025** WhatsApp messages can also be configured in Whispir Rich Message Templates and used to send via the Whispir API! Please contact your Whispir account manager to see how you can have this feature enabled. ##### Examples @@ -11086,17 +11090,21 @@ components: **Overriding fields from Rich Message Templates (RMT)** - Customers have the ability to provide the body positional parameters, alias etc. as part of a Rich Message Template (RMT). + Customers have the ability to configure the body positional parameters, alias etc. as part of a Rich Message Template (RMT). By default, when sending via our API with a given RMT, all values will be collected from the provided RMT. (See _WhatsApp Message via WhatsApp Enabled Rich Message Template_ example) - However, these values can also be overriden via the API when sending via the Rich Message Template (see _WhatsApp Message via Rich Message Template with Field Overrides_ example). + However, the platform allows you to include both the Rich Message Template reference **and** a WhatsApp object in the API payload. - In that sample payload, "subject", "features", and "whatsapp" fields will override what is defined in the provided Rich Message Template. + Please note that in this case the platform will give priority to the message configuration in the **WhatsApp object** over the Rich Message Template. (see _WhatsApp Message via Rich Message Template with Field Overrides_ example). - For clarity and simplicity, however, it is recommended to choose to send your WhatsApp message either via: + For clarity and simplicity, it is recommended to choose to send your WhatsApp message via one of: * a WhatsApp enabled Rich Message Template previously defined in our portal * or providing a WhatsApp object in the payload with all the required details + + **v2 compatibility** + + Please note that our WhatsApp v2 version only supports the use of positional body parameters (via the new _parameters_ object). The _content_ object is not supported. x-examples: WhatsApp Message Using an image: to: '61430933333' @@ -11229,7 +11237,7 @@ components: - text: 'https://hsbc.com/renewal' - text: 'https://hsbc.com/terms' - text: 'https://hsbc.com/privacy' - 'WhatsApp Message with Throttling, Alias, Web Link and Body Positional Parameters': + '(V2) WhatsApp Message with Throttling, Alias, Web Link and Body Positional Parameters': to: '61417123121,61417123122,61417123123' subject: WhatsApp Message Subject body: test WhatsApp @@recipient_first_name@@ @@ -11245,12 +11253,13 @@ components: whatsapp: type: en name: onboarding_message + language: en parameters: - '@@first_name@@' - '@@date@@' - '@@sender_full_name@@' - '@@web_link@@' - WhatsApp Bulk Message with Web Link and Body Positional Parameters: + (V2) WhatsApp Bulk Message with Web Link and Body Positional Parameters: resource: resourceId: 422D0A8A4C73BBEA smsMappingField: mobile @@ -11265,16 +11274,16 @@ components: parameters: - '@@firstname@@ and @@date@@' - '@@sender_full_name@@ and @@web_link@@' - WhatsApp Message via WhatsApp Enabled Rich Message Template: + (V2) WhatsApp Message via WhatsApp Enabled Rich Message Template: to: '61417123121,61417123122,61417123123' messageTemplateName: RMT with WhatsApp Channel Enabled - WhatsApp Bulk Message via Rich Message Template: + (V2) WhatsApp Bulk Message via Rich Message Template: resource: resourceId: 422D0A8A4C73BBEA smsMappingField: mobile messageTemplateName: Sample RMT with WhatsApp Channel Enabled subject: WhatsApp Message Subject - WhatsApp Message via Rich Message Template with Field Overrides: + (V2) WhatsApp Message via Rich Message Template with Field Overrides: to: '61417123121,61417123122,61417123123' messageTemplateName: Sample WhatsApp Enabled Rich Message Template subject: WhatsApp Message Subject @@ -11284,6 +11293,7 @@ components: whatsapp: type: en name: onboarding_message + language: en_SG parameters: - '@@first_name@@' - '@@date@@' @@ -11297,17 +11307,28 @@ components: type: string enum: - template - description: |- + description: | The type of WhatsApp message to be sent, e.g. "template". Whispir currently only supports type "template". example: template name: type: string - description: |- + description: | The name of the template to be sent > Must be the same as how it appears in your WhatsApp Business Manager example: account_update_example_image_p + language: + type: string + minLength: 2 + maxLength: 5 + x-stoplight: + id: wxn62vex5hsis + description: |- + The language to use for your WhatsApp Template e.g. "en", "en_AU", "en_SG" etc. + > Must be the same as how it appears in your WhatsApp Business Manager + + > Supported in v2 **only** parameters: type: array x-stoplight: @@ -11320,6 +11341,8 @@ components: would become "Hello John!" if "John" is the first positional parameter + + > Supported in v2 **only** items: x-stoplight: id: knri1ijzksqjx @@ -11376,6 +11399,7 @@ components: - index: '1' sub_type: quick_reply payload: No-Button-Payload + x-internal: false WAContentHeader: title: WAContentHeader x-stoplight: