Repository: line/line-bot-sdk-go

Issue:
TextMessageV2 Substitution should be interface instead of struct
## Expected Behavior
To use Substitution field in TextMessageV2 should be able to use any of the substition type.

## Current Behavior
Cannot use any of the substitions type (eg. MentionSubstitutionObject) as value in map of Substitution to push message.

## Fix
Change type of Substitution from map[string]SubstitutionObject to map[string]SubstitutionObjectInterface in File: linebot/messaging_api/model_text_message_v2.go Line: 50 (or wherever it's defined) seems to fixed the issue.

Hints from issue comments:
@habara-k: Thank you very much for your report and for using the line-bot-sdk-go.

We have verified the behavior on our side, and indeed, changing the type of Substitution from map[string]SubstitutionObject to map[string]SubstitutionObjectInterface resolves the issue as you described. We will apply this fix accordingly.

We sincerely apologize for any inconvenience this may have caused, and we truly appreciate your feedback. 

Solution patch:
diff --git a/.github/workflows/check-eol-newrelease.yml b/.github/workflows/check-eol-newrelease.yml
index 4f865fd..20fb186 100644
--- a/.github/workflows/check-eol-newrelease.yml
+++ b/.github/workflows/check-eol-newrelease.yml
@@ -15,7 +15,7 @@ jobs:
     if: github.repository == 'line/line-bot-sdk-go'
     steps:
       - name: Check out code
-        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 
       - name: Run EoL & NewRelease check
         uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
diff --git a/.github/workflows/create-draft-release.yml b/.github/workflows/create-draft-release.yml
index 5d4aebf..de5a35e 100644
--- a/.github/workflows/create-draft-release.yml
+++ b/.github/workflows/create-draft-release.yml
@@ -45,7 +45,7 @@ jobs:
     permissions:
       contents: write
     steps:
-      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
       - name: Fetch Latest Release
         id: get-latest-release
         uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
diff --git a/.github/workflows/generate-code.yml b/.github/workflows/generate-code.yml
index d05e837..a5f1dd9 100644
--- a/.github/workflows/generate-code.yml
+++ b/.github/workflows/generate-code.yml
@@ -16,7 +16,7 @@ jobs:
       pull-requests: write
     steps:
       - name: Setup
-        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           submodules: recursive
       - name: Update submodules
diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 9703b5d..dcdbd79 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -18,7 +18,7 @@ jobs:
         - stable
         - oldstable
     steps:
-    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+    - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
       with:
         submodules: true
 
@@ -62,7 +62,7 @@ jobs:
     permissions:
       contents: read
     steps:
-      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
       - name: Run pinact
         uses: suzuki-shunsuke/pinact-action@49cbd6acd0dbab6a6be2585d1dbdaa43b4410133 # v1.0.0
         with:
diff --git a/.github/workflows/label-issue.yml b/.github/workflows/label-issue.yml
index a440f78..5d30e86 100644
--- a/.github/workflows/label-issue.yml
+++ b/.github/workflows/label-issue.yml
@@ -13,7 +13,7 @@ jobs:
     permissions:
       issues: write
     steps:
-      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 
       - name: Add label on issue open
         if: github.event.action == 'opened' || github.event.action == 'reopened'
diff --git a/examples/echo_bot/server.go b/examples/echo_bot/server.go
index 702d18d..601e223 100644
--- a/examples/echo_bot/server.go
+++ b/examples/echo_bot/server.go
@@ -64,6 +64,15 @@ func main() {
 								messaging_api.TextMessage{
 									Text: message.Text,
 								},
+								messaging_api.TextMessageV2{
+									Text: "Hello! {smile}",
+									Substitution: map[string]messaging_api.SubstitutionObjectInterface{
+										"smile": &messaging_api.EmojiSubstitutionObject{
+											ProductId: "5ac1bfd5040ab15980c9b435",
+											EmojiId: "002",
+										},
+									},
+								},
 							},
 						},
 					); err != nil {
diff --git a/generator/pom.xml b/generator/pom.xml
index ad044ae..dffdaa5 100644
--- a/generator/pom.xml
+++ b/generator/pom.xml
@@ -134,13 +134,13 @@
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
-            <version>5.13.3</version>
+            <version>5.13.4</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-engine</artifactId>
-            <version>5.13.3</version>
+            <version>5.13.4</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/generator/src/main/java/line/bot/generator/LineBotSdkGoGeneratorGenerator.java b/generator/src/main/java/line/bot/generator/LineBotSdkGoGeneratorGenerator.java
index 6a4631b..6eca7a7 100644
--- a/generator/src/main/java/line/bot/generator/LineBotSdkGoGeneratorGenerator.java
+++ b/generator/src/main/java/line/bot/generator/LineBotSdkGoGeneratorGenerator.java
@@ -82,6 +82,11 @@ public class LineBotSdkGoGeneratorGenerator extends AbstractGoCodegen {
                         var.getVendorExtensions().put("x-is-discriminator-array", true);
                         model.getVendorExtensions().put("x-has-discriminator", true);
                         System.out.println("UnmarshalJSON[]: " + model.name + " " + var.name + " " + var.baseType + " " + var.complexType);
+                    } else if (var.baseType.equals("map") && discriminators.contains(var.complexType)) {
+                        // TextMessageV2 contains `map[string]SubstitutionObject`.
+                        // in this case, baseType=map, complexType=SubstitutionObject
+                        // UnmarshalJSON is not needed for this case.
+                        var.getVendorExtensions().put("x-is-discriminator-map", true);
                     } else if (discriminators.contains(var.dataType)) {
                         var.getVendorExtensions().put("x-is-discriminator", true);
                         model.getVendorExtensions().put("x-has-discriminator", true);
@@ -96,7 +101,10 @@ public class LineBotSdkGoGeneratorGenerator extends AbstractGoCodegen {
     }
 
     private String type(CodegenModel model, CodegenProperty var) {
-        boolean isDiscriminator = var.vendorExtensions.get("x-is-discriminator-array") != null || var.vendorExtensions.get("x-is-discriminator") != null;
+        boolean isDiscriminator =
+                var.vendorExtensions.get("x-is-discriminator-array") != null ||
+                var.vendorExtensions.get("x-is-discriminator") != null ||
+                var.vendorExtensions.get("x-is-discriminator-map") != null;
 
         if (var.isEnum) {
             return model.classname + var.datatypeWithEnum;
diff --git a/line-openapi b/line-openapi
index 92f9320..b4589bc 160000
--- a/line-openapi
+++ b/line-openapi
@@ -1 +1 @@
-Subproject commit 92f9320b891ee6a071c93220ce4a3e34e1f4d38b
+Subproject commit b4589bc62a4c1a42016a08e2b8945154e10e7193
diff --git a/linebot/messaging_api/.openapi-generator/FILES b/linebot/messaging_api/.openapi-generator/FILES
index a0560e2..0d6bbd4 100644
--- a/linebot/messaging_api/.openapi-generator/FILES
+++ b/linebot/messaging_api/.openapi-generator/FILES
@@ -1,5 +1,7 @@
 api_messaging_api.go
 api_messaging_api_blob.go
+model_acquisition_condition_request.go
+model_acquisition_condition_response.go
 model_action.go
 model_age_demographic.go
 model_age_demographic_filter.go
@@ -18,13 +20,44 @@ model_camera_action.go
 model_camera_roll_action.go
 model_carousel_column.go
 model_carousel_template.go
+model_cash_back_fixed_price_info_request.go
+model_cash_back_fixed_price_info_response.go
+model_cash_back_percentage_price_info_request.go
+model_cash_back_percentage_price_info_response.go
+model_cash_back_price_info_request.go
+model_cash_back_price_info_response.go
 model_chat_reference.go
 model_clipboard_action.go
 model_clipboard_imagemap_action.go
 model_confirm_template.go
+model_coupon_cash_back_reward_request.go
+model_coupon_cash_back_reward_response.go
+model_coupon_create_request.go
+model_coupon_create_response.go
+model_coupon_discount_reward_request.go
+model_coupon_discount_reward_response.go
+model_coupon_free_reward_request.go
+model_coupon_free_reward_response.go
+model_coupon_gift_reward_request.go
+model_coupon_gift_reward_response.go
+model_coupon_list_response.go
+model_coupon_message.go
+model_coupon_others_reward_request.go
+model_coupon_others_reward_response.go
+model_coupon_response.go
+model_coupon_reward_request.go
+model_coupon_reward_response.go
 model_create_rich_menu_alias_request.go
 model_datetime_picker_action.go
 model_demographic_filter.go
+model_discount_explicit_price_info_request.go
+model_discount_explicit_price_info_response.go
+model_discount_fixed_price_info_request.go
+model_discount_fixed_price_info_response.go
+model_discount_percentage_price_info_request.go
+model_discount_percentage_price_info_response.go
+model_discount_price_info_request.go
+model_discount_price_info_response.go
 model_emoji.go
 model_emoji_substitution_object.go
 model_error_detail.go
@@ -83,6 +116,8 @@ model_issue_link_token_response.go
 model_limit.go
 model_location_action.go
 model_location_message.go
+model_lottery_acquisition_condition_request.go
+model_lottery_acquisition_condition_response.go
 model_mark_messages_as_read_request.go
 model_members_ids_response.go
 model_membership.go
@@ -93,9 +128,12 @@ model_message.go
 model_message_action.go
 model_message_imagemap_action.go
 model_message_quota_response.go
+model_messaging_api_pager_coupon_list_response.go
 model_multicast_request.go
 model_narrowcast_progress_response.go
 model_narrowcast_request.go
+model_normal_acquisition_condition_request.go
+model_normal_acquisition_condition_response.go
 model_number_of_messages_response.go
 model_operator_demographic_filter.go
 model_operator_recipient.go
@@ -109,6 +147,7 @@ model_quota_consumption_response.go
 model_quota_type.go
 model_recipient.go
 model_redelivery_recipient.go
+model_referral_acquisition_condition_response.go
 model_reply_message_request.go
 model_reply_message_response.go
 model_rich_menu_alias_list_response.go
diff --git a/linebot/messaging_api/api_messaging_api.go b/linebot/messaging_api/api_messaging_api.go
index 98d7c3a..1446273 100644
--- a/linebot/messaging_api/api_messaging_api.go
+++ b/linebot/messaging_api/api_messaging_api.go
@@ -246,6 +246,141 @@ func (client *MessagingApiAPI) CancelDefaultRichMenuWithHttpInfo() (*http.Respon
 
 }
 
+// CloseCoupon
+//
+// Close coupon
+// Parameters:
+//        couponId
+
+// https://developers.line.biz/en/reference/messaging-api/#discontinue-coupon
+func (client *MessagingApiAPI) CloseCoupon(
+
+	couponId string,
+
+) (struct{}, error) {
+	_, body, error := client.CloseCouponWithHttpInfo(
+
+		couponId,
+	)
+	return body, error
+}
+
+// CloseCoupon
+// If you want to take advantage of the HTTPResponse object for status codes and headers, use this signature.
+//
+// Close coupon
+// Parameters:
+//        couponId
+
+// https://developers.line.biz/en/reference/messaging-api/#discontinue-coupon
+func (client *MessagingApiAPI) CloseCouponWithHttpInfo(
+
+	couponId string,
+
+) (*http.Response, struct{}, error) {
+	path := "/v2/bot/coupon/{couponId}/close"
+
+	path = strings.Replace(path, "{couponId}", couponId, -1)
+
+	req, err := http.NewRequest(http.MethodPut, client.Url(path), nil)
+	if err != nil {
+		return nil, struct{}{}, err
+	}
+
+	res, err := client.Do(req)
+
+	if err != nil {
+		return res, struct{}{}, err
+	}
+
+	if res.StatusCode/100 != 2 {
+		bodyBytes, err := io.ReadAll(res.Body)
+		bodyReader := bytes.NewReader(bodyBytes)
+		if err != nil {
+			return res, struct{}{}, fmt.Errorf("failed to read response body: %w", err)
+		}
+		res.Body = io.NopCloser(bodyReader)
+		return res, struct{}{}, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, string(bodyBytes))
+	}
+
+	defer res.Body.Close()
+
+	return res, struct{}{}, nil
+
+}
+
+// CreateCoupon
+//
+// Create a new coupon. Define coupon details such as type, title, and validity period.
+// Parameters:
+//        couponCreateRequest
+
+// https://developers.line.biz/en/reference/messaging-api/#create-coupon
+func (client *MessagingApiAPI) CreateCoupon(
+
+	couponCreateRequest *CouponCreateRequest,
+
+) (*CouponCreateResponse, error) {
+	_, body, error := client.CreateCouponWithHttpInfo(
+
+		couponCreateRequest,
+	)
+	return body, error
+}
+
+// CreateCoupon
+// If you want to take advantage of the HTTPResponse object for status codes and headers, use this signature.
+//
+// Create a new coupon. Define coupon details such as type, title, and validity period.
+// Parameters:
+//        couponCreateRequest
+
+// https://developers.line.biz/en/reference/messaging-api/#create-coupon
+func (client *MessagingApiAPI) CreateCouponWithHttpInfo(
+
+	couponCreateRequest *CouponCreateRequest,
+
+) (*http.Response, *CouponCreateResponse, error) {
+	path := "/v2/bot/coupon"
+
+	var buf bytes.Buffer
+	enc := json.NewEncoder(&buf)
+	if err := enc.Encode(couponCreateRequest); err != nil {
+		return nil, nil, err
+	}
+	req, err := http.NewRequest(http.MethodPost, client.Url(path), &buf)
+	if err != nil {
+		return nil, nil, err
+	}
+	req.Header.Set("Content-Type", "application/json; charset=UTF-8")
+
+	res, err := client.Do(req)
+
+	if err != nil {
+		return res, nil, err
+	}
+
+	if res.StatusCode/100 != 2 {
+		bodyBytes, err := io.ReadAll(res.Body)
+		bodyReader := bytes.NewReader(bodyBytes)
+		if err != nil {
+			return res, nil, fmt.Errorf("failed to read response body: %w", err)
+		}
+		res.Body = io.NopCloser(bodyReader)
+		return res, nil, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, string(bodyBytes))
+	}
+
+	defer res.Body.Close()
+
+	decoder := json.NewDecoder(res.Body)
+	result := CouponCreateResponse{}
+	if err := decoder.Decode(&result); err != nil {
+		return res, nil, fmt.Errorf("failed to decode JSON: %w", err)
+	}
+	return res, &result, nil
+
+}
+
 // CreateRichMenu
 //
 // Create rich menu
@@ -701,6 +836,74 @@ func (client *MessagingApiAPI) GetBotInfoWithHttpInfo() (*http.Response, *BotInf
 
 }
 
+// GetCouponDetail
+//
+// Get coupon detail
+// Parameters:
+//        couponId
+
+// https://developers.line.biz/en/reference/messaging-api/#get-coupon
+func (client *MessagingApiAPI) GetCouponDetail(
+
+	couponId string,
+
+) (*CouponResponse, error) {
+	_, body, error := client.GetCouponDetailWithHttpInfo(
+
+		couponId,
+	)
+	return body, error
+}
+
+// GetCouponDetail
+// If you want to take advantage of the HTTPResponse object for status codes and headers, use this signature.
+//
+// Get coupon detail
+// Parameters:
+//        couponId
+
+// https://developers.line.biz/en/reference/messaging-api/#get-coupon
+func (client *MessagingApiAPI) GetCouponDetailWithHttpInfo(
+
+	couponId string,
+
+) (*http.Response, *CouponResponse, error) {
+	path := "/v2/bot/coupon/{couponId}"
+
+	path = strings.Replace(path, "{couponId}", couponId, -1)
+
+	req, err := http.NewRequest(http.MethodGet, client.Url(path), nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	res, err := client.Do(req)
+
+	if err != nil {
+		return res, nil, err
+	}
+
+	if res.StatusCode/100 != 2 {
+		bodyBytes, err := io.ReadAll(res.Body)
+		bodyReader := bytes.NewReader(bodyBytes)
+		if err != nil {
+			return res, nil, fmt.Errorf("failed to read response body: %w", err)
+		}
+		res.Body = io.NopCloser(bodyReader)
+		return res, nil, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, string(bodyBytes))
+	}
+
+	defer res.Body.Close()
+
+	decoder := json.NewDecoder(res.Body)
+	result := CouponResponse{}
+	if err := decoder.Decode(&result); err != nil {
+		return res, nil, fmt.Errorf("failed to decode JSON: %w", err)
+	}
+	return res, &result, nil
+
+}
+
 // GetDefaultRichMenuId
 //
 // Gets the ID of the default rich menu set with the Messaging API.
@@ -2943,6 +3146,99 @@ func (client *MessagingApiAPI) LinkRichMenuIdToUsersWithHttpInfo(
 
 }
 
+// ListCoupon
+//
+// Get a paginated list of coupons.
+// Parameters:
+//        status             Filter coupons by their status.
+//        start             Pagination token to retrieve the next page of results.
+//        limit             Maximum number of coupons to return per request.
+
+// https://developers.line.biz/en/reference/messaging-api/#get-coupons-list
+func (client *MessagingApiAPI) ListCoupon(
+
+	status *[]string,
+
+	start string,
+
+	limit int32,
+
+) (*MessagingApiPagerCouponListResponse, error) {
+	_, body, error := client.ListCouponWithHttpInfo(
+
+		status,
+
+		start,
+
+		limit,
+	)
+	return body, error
+}
+
+// ListCoupon
+// If you want to take advantage of the HTTPResponse object for status codes and headers, use this signature.
+//
+// Get a paginated list of coupons.
+// Parameters:
+//        status             Filter coupons by their status.
+//        start             Pagination token to retrieve the next page of results.
+//        limit             Maximum number of coupons to return per request.
+
+// https://developers.line.biz/en/reference/messaging-api/#get-coupons-list
+func (client *MessagingApiAPI) ListCouponWithHttpInfo(
+
+	status *[]string,
+
+	start string,
+
+	limit int32,
+
+) (*http.Response, *MessagingApiPagerCouponListResponse, error) {
+	path := "/v2/bot/coupon"
+
+	req, err := http.NewRequest(http.MethodGet, client.Url(path), nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	query := url.Values{}
+	for _, v := range *status {
+		query.Add("status", v)
+	}
+	if start != "" {
+		query.Add("start", start)
+	}
+	query.Add("limit", strconv.FormatInt(int64(limit), 10))
+
+	req.URL.RawQuery = query.Encode()
+
+	res, err := client.Do(req)
+
+	if err != nil {
+		return res, nil, err
+	}
+
+	if res.StatusCode/100 != 2 {
+		bodyBytes, err := io.ReadAll(res.Body)
+		bodyReader := bytes.NewReader(bodyBytes)
+		if err != nil {
+			return res, nil, fmt.Errorf("failed to read response body: %w", err)
+		}
+		res.Body = io.NopCloser(bodyReader)
+		return res, nil, fmt.Errorf("unexpected status code: %d, %s", res.StatusCode, string(bodyBytes))
+	}
+
+	defer res.Body.Close()
+
+	decoder := json.NewDecoder(res.Body)
+	result := MessagingApiPagerCouponListResponse{}
+	if err := decoder.Decode(&result); err != nil {
+		return res, nil, fmt.Errorf("failed to decode JSON: %w", err)
+	}
+	return res, &result, nil
+
+}
+
 // MarkMessagesAsRead
 //
 // Mark messages from users as read
diff --git a/linebot/messaging_api/model_acquisition_condition_request.go b/linebot/messaging_api/model_acquisition_condition_request.go
new file mode 100644
index 0000000..13b47fa
--- /dev/null
+++ b/linebot/messaging_api/model_acquisition_condition_request.go
@@ -0,0 +1,114 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type AcquisitionConditionRequestInterface interface {
+	GetType() string
+}
+
+func (e AcquisitionConditionRequest) GetType() string {
+	return e.Type
+}
+
+type UnknownAcquisitionConditionRequest struct {
+	AcquisitionConditionRequestInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownAcquisitionConditionRequest) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyAcquisitionConditionRequest(r AcquisitionConditionRequestInterface) AcquisitionConditionRequestInterface {
+	switch v := r.(type) {
+	case *LotteryAcquisitionConditionRequest:
+		if v.Type == "" {
+			v.Type = "lottery"
+		}
+		return v
+	case LotteryAcquisitionConditionRequest:
+		if v.Type == "" {
+			v.Type = "lottery"
+		}
+		return v
+	case *NormalAcquisitionConditionRequest:
+		if v.Type == "" {
+			v.Type = "normal"
+		}
+		return v
+	case NormalAcquisitionConditionRequest:
+		if v.Type == "" {
+			v.Type = "normal"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// AcquisitionConditionRequest
+
+type AcquisitionConditionRequest struct {
+	// Determines how the coupon is distributed or used.
+
+	Type string `json:"type"`
+}
+
+func UnmarshalAcquisitionConditionRequest(data []byte) (AcquisitionConditionRequestInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalAcquisitionConditionRequest: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalAcquisitionConditionRequest: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "lottery":
+		var lottery LotteryAcquisitionConditionRequest
+		if err := json.Unmarshal(data, &lottery); err != nil {
+			return nil, fmt.Errorf("UnmarshalAcquisitionConditionRequest: Cannot read lottery: %w", err)
+		}
+		return lottery, nil
+	case "normal":
+		var normal NormalAcquisitionConditionRequest
+		if err := json.Unmarshal(data, &normal); err != nil {
+			return nil, fmt.Errorf("UnmarshalAcquisitionConditionRequest: Cannot read normal: %w", err)
+		}
+		return normal, nil
+
+	default:
+		var unknown UnknownAcquisitionConditionRequest
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_acquisition_condition_response.go b/linebot/messaging_api/model_acquisition_condition_response.go
new file mode 100644
index 0000000..fb8ebc2
--- /dev/null
+++ b/linebot/messaging_api/model_acquisition_condition_response.go
@@ -0,0 +1,130 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type AcquisitionConditionResponseInterface interface {
+	GetType() string
+}
+
+func (e AcquisitionConditionResponse) GetType() string {
+	return e.Type
+}
+
+type UnknownAcquisitionConditionResponse struct {
+	AcquisitionConditionResponseInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownAcquisitionConditionResponse) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyAcquisitionConditionResponse(r AcquisitionConditionResponseInterface) AcquisitionConditionResponseInterface {
+	switch v := r.(type) {
+	case *LotteryAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "lottery"
+		}
+		return v
+	case LotteryAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "lottery"
+		}
+		return v
+	case *NormalAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "normal"
+		}
+		return v
+	case NormalAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "normal"
+		}
+		return v
+	case *ReferralAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "referral"
+		}
+		return v
+	case ReferralAcquisitionConditionResponse:
+		if v.Type == "" {
+			v.Type = "referral"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// AcquisitionConditionResponse
+
+type AcquisitionConditionResponse struct {
+	// Determines how the coupon is distributed or used.
+
+	Type string `json:"type"`
+}
+
+func UnmarshalAcquisitionConditionResponse(data []byte) (AcquisitionConditionResponseInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalAcquisitionConditionResponse: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalAcquisitionConditionResponse: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "lottery":
+		var lottery LotteryAcquisitionConditionResponse
+		if err := json.Unmarshal(data, &lottery); err != nil {
+			return nil, fmt.Errorf("UnmarshalAcquisitionConditionResponse: Cannot read lottery: %w", err)
+		}
+		return lottery, nil
+	case "normal":
+		var normal NormalAcquisitionConditionResponse
+		if err := json.Unmarshal(data, &normal); err != nil {
+			return nil, fmt.Errorf("UnmarshalAcquisitionConditionResponse: Cannot read normal: %w", err)
+		}
+		return normal, nil
+	case "referral":
+		var referral ReferralAcquisitionConditionResponse
+		if err := json.Unmarshal(data, &referral); err != nil {
+			return nil, fmt.Errorf("UnmarshalAcquisitionConditionResponse: Cannot read referral: %w", err)
+		}
+		return referral, nil
+
+	default:
+		var unknown UnknownAcquisitionConditionResponse
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_cash_back_fixed_price_info_request.go b/linebot/messaging_api/model_cash_back_fixed_price_info_request.go
new file mode 100644
index 0000000..663fa31
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_fixed_price_info_request.go
@@ -0,0 +1,51 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CashBackFixedPriceInfoRequest
+// CashBackFixedPriceInfoRequest
+
+type CashBackFixedPriceInfoRequest struct {
+	CashBackPriceInfoRequest
+
+	/**
+	 * Get FixedAmount
+	 */
+	FixedAmount int64 `json:"fixedAmount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the CashBackFixedPriceInfoRequest struct.
+func (r *CashBackFixedPriceInfoRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias CashBackFixedPriceInfoRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "fixed",
+	})
+}
diff --git a/linebot/messaging_api/model_cash_back_fixed_price_info_response.go b/linebot/messaging_api/model_cash_back_fixed_price_info_response.go
new file mode 100644
index 0000000..ef786b6
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_fixed_price_info_response.go
@@ -0,0 +1,69 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CashBackFixedPriceInfoResponse
+// CashBackFixedPriceInfoResponse
+
+type CashBackFixedPriceInfoResponse struct {
+	CashBackPriceInfoResponse
+
+	/**
+	 * Currency code (e.g., JPY, THB, TWD).
+	 */
+	Currency CashBackFixedPriceInfoResponseCURRENCY `json:"currency,omitempty"`
+
+	/**
+	 * Get FixedAmount
+	 */
+	FixedAmount int64 `json:"fixedAmount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the CashBackFixedPriceInfoResponse struct.
+func (r *CashBackFixedPriceInfoResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias CashBackFixedPriceInfoResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "fixed",
+	})
+}
+
+// CashBackFixedPriceInfoResponseCURRENCY type
+/* Currency code (e.g., JPY, THB, TWD). */
+type CashBackFixedPriceInfoResponseCURRENCY string
+
+// CashBackFixedPriceInfoResponseCURRENCY constants
+const (
+	CashBackFixedPriceInfoResponseCURRENCY_JPY CashBackFixedPriceInfoResponseCURRENCY = "JPY"
+
+	CashBackFixedPriceInfoResponseCURRENCY_THB CashBackFixedPriceInfoResponseCURRENCY = "THB"
+
+	CashBackFixedPriceInfoResponseCURRENCY_TWD CashBackFixedPriceInfoResponseCURRENCY = "TWD"
+)
diff --git a/linebot/messaging_api/model_cash_back_percentage_price_info_request.go b/linebot/messaging_api/model_cash_back_percentage_price_info_request.go
new file mode 100644
index 0000000..c0aa706
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_percentage_price_info_request.go
@@ -0,0 +1,53 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CashBackPercentagePriceInfoRequest
+// CashBackPercentagePriceInfoRequest
+
+type CashBackPercentagePriceInfoRequest struct {
+	CashBackPriceInfoRequest
+
+	/**
+	 * Specifies the cashback rate as a percentage. Must be an integer between 1 and 99.
+	 * minimum: 1
+	 * maximum: 99
+	 */
+	Percentage int32 `json:"percentage,omitempty"`
+}
+
+// MarshalJSON customizes the JSON serialization of the CashBackPercentagePriceInfoRequest struct.
+func (r *CashBackPercentagePriceInfoRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias CashBackPercentagePriceInfoRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "percentage",
+	})
+}
diff --git a/linebot/messaging_api/model_cash_back_percentage_price_info_response.go b/linebot/messaging_api/model_cash_back_percentage_price_info_response.go
new file mode 100644
index 0000000..2111195
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_percentage_price_info_response.go
@@ -0,0 +1,51 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CashBackPercentagePriceInfoResponse
+// CashBackPercentagePriceInfoResponse
+
+type CashBackPercentagePriceInfoResponse struct {
+	CashBackPriceInfoResponse
+
+	/**
+	 * Get Percentage
+	 */
+	Percentage int32 `json:"percentage"`
+}
+
+// MarshalJSON customizes the JSON serialization of the CashBackPercentagePriceInfoResponse struct.
+func (r *CashBackPercentagePriceInfoResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias CashBackPercentagePriceInfoResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "percentage",
+	})
+}
diff --git a/linebot/messaging_api/model_cash_back_price_info_request.go b/linebot/messaging_api/model_cash_back_price_info_request.go
new file mode 100644
index 0000000..081ec7e
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_price_info_request.go
@@ -0,0 +1,112 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type CashBackPriceInfoRequestInterface interface {
+	GetType() string
+}
+
+func (e CashBackPriceInfoRequest) GetType() string {
+	return e.Type
+}
+
+type UnknownCashBackPriceInfoRequest struct {
+	CashBackPriceInfoRequestInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownCashBackPriceInfoRequest) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyCashBackPriceInfoRequest(r CashBackPriceInfoRequestInterface) CashBackPriceInfoRequestInterface {
+	switch v := r.(type) {
+	case *CashBackFixedPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case CashBackFixedPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case *CashBackPercentagePriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+	case CashBackPercentagePriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// CashBackPriceInfoRequest
+
+type CashBackPriceInfoRequest struct {
+	Type string `json:"type"`
+}
+
+func UnmarshalCashBackPriceInfoRequest(data []byte) (CashBackPriceInfoRequestInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCashBackPriceInfoRequest: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCashBackPriceInfoRequest: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "fixed":
+		var fixed CashBackFixedPriceInfoRequest
+		if err := json.Unmarshal(data, &fixed); err != nil {
+			return nil, fmt.Errorf("UnmarshalCashBackPriceInfoRequest: Cannot read fixed: %w", err)
+		}
+		return fixed, nil
+	case "percentage":
+		var percentage CashBackPercentagePriceInfoRequest
+		if err := json.Unmarshal(data, &percentage); err != nil {
+			return nil, fmt.Errorf("UnmarshalCashBackPriceInfoRequest: Cannot read percentage: %w", err)
+		}
+		return percentage, nil
+
+	default:
+		var unknown UnknownCashBackPriceInfoRequest
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_cash_back_price_info_response.go b/linebot/messaging_api/model_cash_back_price_info_response.go
new file mode 100644
index 0000000..c92a787
--- /dev/null
+++ b/linebot/messaging_api/model_cash_back_price_info_response.go
@@ -0,0 +1,112 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type CashBackPriceInfoResponseInterface interface {
+	GetType() string
+}
+
+func (e CashBackPriceInfoResponse) GetType() string {
+	return e.Type
+}
+
+type UnknownCashBackPriceInfoResponse struct {
+	CashBackPriceInfoResponseInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownCashBackPriceInfoResponse) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyCashBackPriceInfoResponse(r CashBackPriceInfoResponseInterface) CashBackPriceInfoResponseInterface {
+	switch v := r.(type) {
+	case *CashBackFixedPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case CashBackFixedPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case *CashBackPercentagePriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+	case CashBackPercentagePriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// CashBackPriceInfoResponse
+
+type CashBackPriceInfoResponse struct {
+	Type string `json:"type"`
+}
+
+func UnmarshalCashBackPriceInfoResponse(data []byte) (CashBackPriceInfoResponseInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCashBackPriceInfoResponse: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCashBackPriceInfoResponse: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "fixed":
+		var fixed CashBackFixedPriceInfoResponse
+		if err := json.Unmarshal(data, &fixed); err != nil {
+			return nil, fmt.Errorf("UnmarshalCashBackPriceInfoResponse: Cannot read fixed: %w", err)
+		}
+		return fixed, nil
+	case "percentage":
+		var percentage CashBackPercentagePriceInfoResponse
+		if err := json.Unmarshal(data, &percentage); err != nil {
+			return nil, fmt.Errorf("UnmarshalCashBackPriceInfoResponse: Cannot read percentage: %w", err)
+		}
+		return percentage, nil
+
+	default:
+		var unknown UnknownCashBackPriceInfoResponse
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_coupon_cash_back_reward_request.go b/linebot/messaging_api/model_coupon_cash_back_reward_request.go
new file mode 100644
index 0000000..a77d939
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_cash_back_reward_request.go
@@ -0,0 +1,85 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponCashBackRewardRequest
+// CouponCashBackRewardRequest
+
+type CouponCashBackRewardRequest struct {
+	CouponRewardRequest
+
+	/**
+	 * Get PriceInfo
+	 */
+	PriceInfo CashBackPriceInfoRequestInterface `json:"priceInfo,omitempty"`
+}
+
+func (cr *CouponCashBackRewardRequest) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["type"] != nil {
+
+		err = json.Unmarshal(raw["type"], &cr.Type)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Type): %w", err)
+		}
+
+	}
+
+	if raw["priceInfo"] != nil {
+
+		if rawpriceInfo, ok := raw["priceInfo"]; ok && rawpriceInfo != nil {
+			PriceInfo, err := UnmarshalCashBackPriceInfoRequest(rawpriceInfo)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in CashBackPriceInfoRequest(discriminator): %w", err)
+			}
+			cr.PriceInfo = PriceInfo
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponCashBackRewardRequest struct.
+func (r *CouponCashBackRewardRequest) MarshalJSON() ([]byte, error) {
+
+	r.PriceInfo = setDiscriminatorPropertyCashBackPriceInfoRequest(r.PriceInfo)
+
+	type Alias CouponCashBackRewardRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "cashBack",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_cash_back_reward_response.go b/linebot/messaging_api/model_coupon_cash_back_reward_response.go
new file mode 100644
index 0000000..86a2943
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_cash_back_reward_response.go
@@ -0,0 +1,85 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponCashBackRewardResponse
+// CouponCashBackRewardResponse
+
+type CouponCashBackRewardResponse struct {
+	CouponRewardResponse
+
+	/**
+	 * Get PriceInfo
+	 */
+	PriceInfo CashBackPriceInfoResponseInterface `json:"priceInfo,omitempty"`
+}
+
+func (cr *CouponCashBackRewardResponse) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["type"] != nil {
+
+		err = json.Unmarshal(raw["type"], &cr.Type)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Type): %w", err)
+		}
+
+	}
+
+	if raw["priceInfo"] != nil {
+
+		if rawpriceInfo, ok := raw["priceInfo"]; ok && rawpriceInfo != nil {
+			PriceInfo, err := UnmarshalCashBackPriceInfoResponse(rawpriceInfo)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in CashBackPriceInfoResponse(discriminator): %w", err)
+			}
+			cr.PriceInfo = PriceInfo
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponCashBackRewardResponse struct.
+func (r *CouponCashBackRewardResponse) MarshalJSON() ([]byte, error) {
+
+	r.PriceInfo = setDiscriminatorPropertyCashBackPriceInfoResponse(r.PriceInfo)
+
+	type Alias CouponCashBackRewardResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "cashBack",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_create_request.go b/linebot/messaging_api/model_coupon_create_request.go
new file mode 100644
index 0000000..2eb2ba2
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_create_request.go
@@ -0,0 +1,331 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponCreateRequest
+// Request object for creating a coupon. Contains all configurable coupon properties.
+
+type CouponCreateRequest struct {
+
+	/**
+	 * Get AcquisitionCondition
+	 */
+	AcquisitionCondition AcquisitionConditionRequestInterface `json:"acquisitionCondition"`
+
+	/**
+	 * URL of the barcode image associated with the coupon. Used for in-store redemption.
+	 */
+	BarcodeImageUrl string `json:"barcodeImageUrl,omitempty"`
+
+	/**
+	 * Unique code to be presented by the user to redeem the coupon. Optional.
+	 */
+	CouponCode string `json:"couponCode,omitempty"`
+
+	/**
+	 * Detailed description of the coupon. Displayed to users.
+	 */
+	Description string `json:"description,omitempty"`
+
+	/**
+	 * Coupon expiration time (epoch seconds). Coupon cannot be used after this time. (Required)
+	 */
+	EndTimestamp int64 `json:"endTimestamp"`
+
+	/**
+	 * URL of the main image representing the coupon. Displayed in the coupon list.
+	 */
+	ImageUrl string `json:"imageUrl,omitempty"`
+
+	/**
+	 * Maximum number of times a single coupon ticket can be used. Use -1 to indicate no limit. (Required)
+	 * maximum: 1
+	 */
+	MaxUseCountPerTicket int32 `json:"maxUseCountPerTicket"`
+
+	/**
+	 * Coupon start time (epoch seconds). Coupon can be used from this time. (Required)
+	 */
+	StartTimestamp int64 `json:"startTimestamp"`
+
+	/**
+	 * Title of the coupon. Displayed in the coupon list. (Required)
+	 */
+	Title string `json:"title"`
+
+	/**
+	 * Conditions for using the coupon. Shown to users.
+	 */
+	UsageCondition string `json:"usageCondition,omitempty"`
+
+	/**
+	 * Get Reward
+	 */
+	Reward CouponRewardRequestInterface `json:"reward,omitempty"`
+
+	/**
+	 * Visibility of the coupon. Determines who can see or acquire the coupon. (Required)
+	 */
+	Visibility CouponCreateRequestVISIBILITY `json:"visibility"`
+
+	/**
+	 * Timezone for interpreting start and end timestamps. (Required)
+	 */
+	Timezone CouponCreateRequestTIMEZONE `json:"timezone"`
+}
+
+func (cr *CouponCreateRequest) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["acquisitionCondition"] != nil {
+
+		if rawacquisitionCondition, ok := raw["acquisitionCondition"]; ok && rawacquisitionCondition != nil {
+			AcquisitionCondition, err := UnmarshalAcquisitionConditionRequest(rawacquisitionCondition)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in AcquisitionConditionRequest(discriminator): %w", err)
+			}
+			cr.AcquisitionCondition = AcquisitionCondition
+		}
+
+	}
+
+	if raw["barcodeImageUrl"] != nil {
+
+		err = json.Unmarshal(raw["barcodeImageUrl"], &cr.BarcodeImageUrl)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(BarcodeImageUrl): %w", err)
+		}
+
+	}
+
+	if raw["couponCode"] != nil {
+
+		err = json.Unmarshal(raw["couponCode"], &cr.CouponCode)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(CouponCode): %w", err)
+		}
+
+	}
+
+	if raw["description"] != nil {
+
+		err = json.Unmarshal(raw["description"], &cr.Description)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Description): %w", err)
+		}
+
+	}
+
+	if raw["endTimestamp"] != nil {
+
+		err = json.Unmarshal(raw["endTimestamp"], &cr.EndTimestamp)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(EndTimestamp): %w", err)
+		}
+
+	}
+
+	if raw["imageUrl"] != nil {
+
+		err = json.Unmarshal(raw["imageUrl"], &cr.ImageUrl)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(ImageUrl): %w", err)
+		}
+
+	}
+
+	if raw["maxUseCountPerTicket"] != nil {
+
+		err = json.Unmarshal(raw["maxUseCountPerTicket"], &cr.MaxUseCountPerTicket)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int32(MaxUseCountPerTicket): %w", err)
+		}
+
+	}
+
+	if raw["startTimestamp"] != nil {
+
+		err = json.Unmarshal(raw["startTimestamp"], &cr.StartTimestamp)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(StartTimestamp): %w", err)
+		}
+
+	}
+
+	if raw["title"] != nil {
+
+		err = json.Unmarshal(raw["title"], &cr.Title)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Title): %w", err)
+		}
+
+	}
+
+	if raw["usageCondition"] != nil {
+
+		err = json.Unmarshal(raw["usageCondition"], &cr.UsageCondition)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(UsageCondition): %w", err)
+		}
+
+	}
+
+	if raw["reward"] != nil {
+
+		if rawreward, ok := raw["reward"]; ok && rawreward != nil {
+			Reward, err := UnmarshalCouponRewardRequest(rawreward)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in CouponRewardRequest(discriminator): %w", err)
+			}
+			cr.Reward = Reward
+		}
+
+	}
+
+	if raw["visibility"] != nil {
+
+		err = json.Unmarshal(raw["visibility"], &cr.Visibility)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Visibility): %w", err)
+		}
+
+	}
+
+	if raw["timezone"] != nil {
+
+		err = json.Unmarshal(raw["timezone"], &cr.Timezone)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Timezone): %w", err)
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponCreateRequest struct.
+func (r *CouponCreateRequest) MarshalJSON() ([]byte, error) {
+
+	r.AcquisitionCondition = setDiscriminatorPropertyAcquisitionConditionRequest(r.AcquisitionCondition)
+
+	r.Reward = setDiscriminatorPropertyCouponRewardRequest(r.Reward)
+
+	type Alias CouponCreateRequest
+	return json.Marshal(&struct {
+		*Alias
+	}{
+		Alias: (*Alias)(r),
+	})
+}
+
+// CouponCreateRequestVISIBILITY type
+/* Visibility of the coupon. Determines who can see or acquire the coupon. */
+type CouponCreateRequestVISIBILITY string
+
+// CouponCreateRequestVISIBILITY constants
+const (
+	CouponCreateRequestVISIBILITY_UNLISTED CouponCreateRequestVISIBILITY = "UNLISTED"
+
+	CouponCreateRequestVISIBILITY_PUBLIC CouponCreateRequestVISIBILITY = "PUBLIC"
+)
+
+// CouponCreateRequestTIMEZONE type
+/* Timezone for interpreting start and end timestamps. */
+type CouponCreateRequestTIMEZONE string
+
+// CouponCreateRequestTIMEZONE constants
+const (
+	CouponCreateRequestTIMEZONE_ETC_GMT_MINUS_12 CouponCreateRequestTIMEZONE = "ETC_GMT_MINUS_12"
+
+	CouponCreateRequestTIMEZONE_ETC_GMT_MINUS_11 CouponCreateRequestTIMEZONE = "ETC_GMT_MINUS_11"
+
+	CouponCreateRequestTIMEZONE_PACIFIC_HONOLULU CouponCreateRequestTIMEZONE = "PACIFIC_HONOLULU"
+
+	CouponCreateRequestTIMEZONE_AMERICA_ANCHORAGE CouponCreateRequestTIMEZONE = "AMERICA_ANCHORAGE"
+
+	CouponCreateRequestTIMEZONE_AMERICA_LOS_ANGELES CouponCreateRequestTIMEZONE = "AMERICA_LOS_ANGELES"
+
+	CouponCreateRequestTIMEZONE_AMERICA_PHOENIX CouponCreateRequestTIMEZONE = "AMERICA_PHOENIX"
+
+	CouponCreateRequestTIMEZONE_AMERICA_CHICAGO CouponCreateRequestTIMEZONE = "AMERICA_CHICAGO"
+
+	CouponCreateRequestTIMEZONE_AMERICA_NEW_YORK CouponCreateRequestTIMEZONE = "AMERICA_NEW_YORK"
+
+	CouponCreateRequestTIMEZONE_AMERICA_CARACAS CouponCreateRequestTIMEZONE = "AMERICA_CARACAS"
+
+	CouponCreateRequestTIMEZONE_AMERICA_SANTIAGO CouponCreateRequestTIMEZONE = "AMERICA_SANTIAGO"
+
+	CouponCreateRequestTIMEZONE_AMERICA_ST_JOHNS CouponCreateRequestTIMEZONE = "AMERICA_ST_JOHNS"
+
+	CouponCreateRequestTIMEZONE_AMERICA_SAO_PAULO CouponCreateRequestTIMEZONE = "AMERICA_SAO_PAULO"
+
+	CouponCreateRequestTIMEZONE_ETC_GMT_MINUS_2 CouponCreateRequestTIMEZONE = "ETC_GMT_MINUS_2"
+
+	CouponCreateRequestTIMEZONE_ATLANTIC_CAPE_VERDE CouponCreateRequestTIMEZONE = "ATLANTIC_CAPE_VERDE"
+
+	CouponCreateRequestTIMEZONE_EUROPE_LONDON CouponCreateRequestTIMEZONE = "EUROPE_LONDON"
+
+	CouponCreateRequestTIMEZONE_EUROPE_PARIS CouponCreateRequestTIMEZONE = "EUROPE_PARIS"
+
+	CouponCreateRequestTIMEZONE_EUROPE_ISTANBUL CouponCreateRequestTIMEZONE = "EUROPE_ISTANBUL"
+
+	CouponCreateRequestTIMEZONE_EUROPE_MOSCOW CouponCreateRequestTIMEZONE = "EUROPE_MOSCOW"
+
+	CouponCreateRequestTIMEZONE_ASIA_TEHRAN CouponCreateRequestTIMEZONE = "ASIA_TEHRAN"
+
+	CouponCreateRequestTIMEZONE_ASIA_TBILISI CouponCreateRequestTIMEZONE = "ASIA_TBILISI"
+
+	CouponCreateRequestTIMEZONE_ASIA_KABUL CouponCreateRequestTIMEZONE = "ASIA_KABUL"
+
+	CouponCreateRequestTIMEZONE_ASIA_TASHKENT CouponCreateRequestTIMEZONE = "ASIA_TASHKENT"
+
+	CouponCreateRequestTIMEZONE_ASIA_COLOMBO CouponCreateRequestTIMEZONE = "ASIA_COLOMBO"
+
+	CouponCreateRequestTIMEZONE_ASIA_KATHMANDU CouponCreateRequestTIMEZONE = "ASIA_KATHMANDU"
+
+	CouponCreateRequestTIMEZONE_ASIA_ALMATY CouponCreateRequestTIMEZONE = "ASIA_ALMATY"
+
+	CouponCreateRequestTIMEZONE_ASIA_RANGOON CouponCreateRequestTIMEZONE = "ASIA_RANGOON"
+
+	CouponCreateRequestTIMEZONE_ASIA_BANGKOK CouponCreateRequestTIMEZONE = "ASIA_BANGKOK"
+
+	CouponCreateRequestTIMEZONE_ASIA_TAIPEI CouponCreateRequestTIMEZONE = "ASIA_TAIPEI"
+
+	CouponCreateRequestTIMEZONE_ASIA_TOKYO CouponCreateRequestTIMEZONE = "ASIA_TOKYO"
+
+	CouponCreateRequestTIMEZONE_AUSTRALIA_DARWIN CouponCreateRequestTIMEZONE = "AUSTRALIA_DARWIN"
+
+	CouponCreateRequestTIMEZONE_AUSTRALIA_SYDNEY CouponCreateRequestTIMEZONE = "AUSTRALIA_SYDNEY"
+
+	CouponCreateRequestTIMEZONE_ASIA_VLADIVOSTOK CouponCreateRequestTIMEZONE = "ASIA_VLADIVOSTOK"
+
+	CouponCreateRequestTIMEZONE_ETC_GMT_PLUS_12 CouponCreateRequestTIMEZONE = "ETC_GMT_PLUS_12"
+
+	CouponCreateRequestTIMEZONE_PACIFIC_TONGATAPU CouponCreateRequestTIMEZONE = "PACIFIC_TONGATAPU"
+)
diff --git a/linebot/messaging_api/model_coupon_create_response.go b/linebot/messaging_api/model_coupon_create_response.go
new file mode 100644
index 0000000..36a3393
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_create_response.go
@@ -0,0 +1,31 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+// CouponCreateResponse
+// Response object returned after creating a coupon. Contains the coupon ID.
+
+type CouponCreateResponse struct {
+
+	/**
+	 * Unique identifier of the coupon. (Required)
+	 */
+	CouponId string `json:"couponId"`
+}
diff --git a/linebot/messaging_api/model_coupon_discount_reward_request.go b/linebot/messaging_api/model_coupon_discount_reward_request.go
new file mode 100644
index 0000000..63e4f93
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_discount_reward_request.go
@@ -0,0 +1,85 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponDiscountRewardRequest
+// CouponDiscountRewardRequest
+
+type CouponDiscountRewardRequest struct {
+	CouponRewardRequest
+
+	/**
+	 * Get PriceInfo
+	 */
+	PriceInfo DiscountPriceInfoRequestInterface `json:"priceInfo,omitempty"`
+}
+
+func (cr *CouponDiscountRewardRequest) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["type"] != nil {
+
+		err = json.Unmarshal(raw["type"], &cr.Type)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Type): %w", err)
+		}
+
+	}
+
+	if raw["priceInfo"] != nil {
+
+		if rawpriceInfo, ok := raw["priceInfo"]; ok && rawpriceInfo != nil {
+			PriceInfo, err := UnmarshalDiscountPriceInfoRequest(rawpriceInfo)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in DiscountPriceInfoRequest(discriminator): %w", err)
+			}
+			cr.PriceInfo = PriceInfo
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponDiscountRewardRequest struct.
+func (r *CouponDiscountRewardRequest) MarshalJSON() ([]byte, error) {
+
+	r.PriceInfo = setDiscriminatorPropertyDiscountPriceInfoRequest(r.PriceInfo)
+
+	type Alias CouponDiscountRewardRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "discount",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_discount_reward_response.go b/linebot/messaging_api/model_coupon_discount_reward_response.go
new file mode 100644
index 0000000..764b675
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_discount_reward_response.go
@@ -0,0 +1,85 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponDiscountRewardResponse
+// CouponDiscountRewardResponse
+
+type CouponDiscountRewardResponse struct {
+	CouponRewardResponse
+
+	/**
+	 * Get PriceInfo
+	 */
+	PriceInfo DiscountPriceInfoResponseInterface `json:"priceInfo,omitempty"`
+}
+
+func (cr *CouponDiscountRewardResponse) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["type"] != nil {
+
+		err = json.Unmarshal(raw["type"], &cr.Type)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Type): %w", err)
+		}
+
+	}
+
+	if raw["priceInfo"] != nil {
+
+		if rawpriceInfo, ok := raw["priceInfo"]; ok && rawpriceInfo != nil {
+			PriceInfo, err := UnmarshalDiscountPriceInfoResponse(rawpriceInfo)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in DiscountPriceInfoResponse(discriminator): %w", err)
+			}
+			cr.PriceInfo = PriceInfo
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponDiscountRewardResponse struct.
+func (r *CouponDiscountRewardResponse) MarshalJSON() ([]byte, error) {
+
+	r.PriceInfo = setDiscriminatorPropertyDiscountPriceInfoResponse(r.PriceInfo)
+
+	type Alias CouponDiscountRewardResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "discount",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_free_reward_request.go b/linebot/messaging_api/model_coupon_free_reward_request.go
new file mode 100644
index 0000000..d0ba86b
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_free_reward_request.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponFreeRewardRequest
+// CouponFreeRewardRequest
+
+type CouponFreeRewardRequest struct {
+	CouponRewardRequest
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponFreeRewardRequest struct.
+func (r *CouponFreeRewardRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponFreeRewardRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "free",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_free_reward_response.go b/linebot/messaging_api/model_coupon_free_reward_response.go
new file mode 100644
index 0000000..00b6e88
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_free_reward_response.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponFreeRewardResponse
+// CouponFreeRewardResponse
+
+type CouponFreeRewardResponse struct {
+	CouponRewardResponse
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponFreeRewardResponse struct.
+func (r *CouponFreeRewardResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponFreeRewardResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "free",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_gift_reward_request.go b/linebot/messaging_api/model_coupon_gift_reward_request.go
new file mode 100644
index 0000000..1553752
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_gift_reward_request.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponGiftRewardRequest
+// CouponGiftRewardRequest
+
+type CouponGiftRewardRequest struct {
+	CouponRewardRequest
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponGiftRewardRequest struct.
+func (r *CouponGiftRewardRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponGiftRewardRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "gift",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_gift_reward_response.go b/linebot/messaging_api/model_coupon_gift_reward_response.go
new file mode 100644
index 0000000..f2bff9b
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_gift_reward_response.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponGiftRewardResponse
+// CouponGiftRewardResponse
+
+type CouponGiftRewardResponse struct {
+	CouponRewardResponse
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponGiftRewardResponse struct.
+func (r *CouponGiftRewardResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponGiftRewardResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "gift",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_list_response.go b/linebot/messaging_api/model_coupon_list_response.go
new file mode 100644
index 0000000..661e1e9
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_list_response.go
@@ -0,0 +1,36 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+// CouponListResponse
+// Summary information about a coupon, used in coupon lists.
+
+type CouponListResponse struct {
+
+	/**
+	 * Unique identifier of the coupon. (Required)
+	 */
+	CouponId string `json:"couponId"`
+
+	/**
+	 * Title of the coupon. Displayed in the coupon list. (Required)
+	 */
+	Title string `json:"title"`
+}
diff --git a/linebot/messaging_api/model_coupon_message.go b/linebot/messaging_api/model_coupon_message.go
new file mode 100644
index 0000000..fd9f428
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_message.go
@@ -0,0 +1,66 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponMessage
+// CouponMessage
+// https://developers.line.biz/en/reference/messaging-api/#coupon-message
+type CouponMessage struct {
+	Message
+
+	/**
+	 * Get QuickReply
+	 */
+	QuickReply *QuickReply `json:"quickReply,omitempty"`
+
+	/**
+	 * Get Sender
+	 */
+	Sender *Sender `json:"sender,omitempty"`
+
+	/**
+	 * Unique identifier of the coupon. (Required)
+	 */
+	CouponId string `json:"couponId"`
+
+	/**
+	 * Delivery route tag information. It can be used for analysis in LINE OA Manager.
+	 */
+	DeliveryTag string `json:"deliveryTag,omitempty"`
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponMessage struct.
+func (r *CouponMessage) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponMessage
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "coupon",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_others_reward_request.go b/linebot/messaging_api/model_coupon_others_reward_request.go
new file mode 100644
index 0000000..e3727e1
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_others_reward_request.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponOthersRewardRequest
+// CouponOthersRewardRequest
+
+type CouponOthersRewardRequest struct {
+	CouponRewardRequest
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponOthersRewardRequest struct.
+func (r *CouponOthersRewardRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponOthersRewardRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "others",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_others_reward_response.go b/linebot/messaging_api/model_coupon_others_reward_response.go
new file mode 100644
index 0000000..c9ad916
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_others_reward_response.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// CouponOthersRewardResponse
+// CouponOthersRewardResponse
+
+type CouponOthersRewardResponse struct {
+	CouponRewardResponse
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponOthersRewardResponse struct.
+func (r *CouponOthersRewardResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias CouponOthersRewardResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "others",
+	})
+}
diff --git a/linebot/messaging_api/model_coupon_response.go b/linebot/messaging_api/model_coupon_response.go
new file mode 100644
index 0000000..4a9b2d7
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_response.go
@@ -0,0 +1,415 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// CouponResponse
+// Detailed information about a coupon, including all properties and current status.
+
+type CouponResponse struct {
+
+	/**
+	 * Get AcquisitionCondition
+	 */
+	AcquisitionCondition AcquisitionConditionResponseInterface `json:"acquisitionCondition,omitempty"`
+
+	/**
+	 * URL of the barcode image associated with the coupon. Used for in-store redemption.
+	 */
+	BarcodeImageUrl string `json:"barcodeImageUrl,omitempty"`
+
+	/**
+	 * Unique code to be presented by the user to redeem the coupon.
+	 */
+	CouponCode string `json:"couponCode,omitempty"`
+
+	/**
+	 * Detailed description of the coupon. Displayed to users.
+	 */
+	Description string `json:"description,omitempty"`
+
+	/**
+	 * Coupon expiration time (epoch seconds). Coupon cannot be used after this time.
+	 */
+	EndTimestamp int64 `json:"endTimestamp"`
+
+	/**
+	 * URL of the main image representing the coupon. Displayed in the coupon list.
+	 */
+	ImageUrl string `json:"imageUrl,omitempty"`
+
+	/**
+	 * Maximum number of coupons that can be issued in total.
+	 */
+	MaxAcquireCount int64 `json:"maxAcquireCount"`
+
+	/**
+	 * Maximum number of times a single coupon ticket can be used.
+	 */
+	MaxUseCountPerTicket int32 `json:"maxUseCountPerTicket"`
+
+	/**
+	 * Maximum number of coupon tickets a single user can acquire.
+	 */
+	MaxTicketPerUser int64 `json:"maxTicketPerUser"`
+
+	/**
+	 * Coupon start time (epoch seconds). Coupon can be used from this time.
+	 */
+	StartTimestamp int64 `json:"startTimestamp"`
+
+	/**
+	 * Title of the coupon. Displayed in the coupon list.
+	 */
+	Title string `json:"title,omitempty"`
+
+	/**
+	 * Conditions for using the coupon. Shown to users.
+	 */
+	UsageCondition string `json:"usageCondition,omitempty"`
+
+	/**
+	 * Get Reward
+	 */
+	Reward CouponRewardResponseInterface `json:"reward,omitempty"`
+
+	/**
+	 * Visibility of the coupon. Determines who can see or acquire the coupon.
+	 */
+	Visibility CouponResponseVISIBILITY `json:"visibility,omitempty"`
+
+	/**
+	 * Timezone for interpreting start and end timestamps.
+	 */
+	Timezone CouponResponseTIMEZONE `json:"timezone,omitempty"`
+
+	/**
+	 * Unique identifier of the coupon.
+	 */
+	CouponId string `json:"couponId,omitempty"`
+
+	/**
+	 * Created timestamp (seconds) of the coupon.
+	 */
+	CreatedTimestamp int64 `json:"createdTimestamp"`
+
+	/**
+	 * Current status of the coupon.
+	 */
+	Status CouponResponseSTATUS `json:"status,omitempty"`
+}
+
+func (cr *CouponResponse) UnmarshalJSON(data []byte) error {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return fmt.Errorf("JSON parse error in map: %w", err)
+	}
+
+	if raw["acquisitionCondition"] != nil {
+
+		if rawacquisitionCondition, ok := raw["acquisitionCondition"]; ok && rawacquisitionCondition != nil {
+			AcquisitionCondition, err := UnmarshalAcquisitionConditionResponse(rawacquisitionCondition)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in AcquisitionConditionResponse(discriminator): %w", err)
+			}
+			cr.AcquisitionCondition = AcquisitionCondition
+		}
+
+	}
+
+	if raw["barcodeImageUrl"] != nil {
+
+		err = json.Unmarshal(raw["barcodeImageUrl"], &cr.BarcodeImageUrl)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(BarcodeImageUrl): %w", err)
+		}
+
+	}
+
+	if raw["couponCode"] != nil {
+
+		err = json.Unmarshal(raw["couponCode"], &cr.CouponCode)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(CouponCode): %w", err)
+		}
+
+	}
+
+	if raw["description"] != nil {
+
+		err = json.Unmarshal(raw["description"], &cr.Description)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Description): %w", err)
+		}
+
+	}
+
+	if raw["endTimestamp"] != nil {
+
+		err = json.Unmarshal(raw["endTimestamp"], &cr.EndTimestamp)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(EndTimestamp): %w", err)
+		}
+
+	}
+
+	if raw["imageUrl"] != nil {
+
+		err = json.Unmarshal(raw["imageUrl"], &cr.ImageUrl)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(ImageUrl): %w", err)
+		}
+
+	}
+
+	if raw["maxAcquireCount"] != nil {
+
+		err = json.Unmarshal(raw["maxAcquireCount"], &cr.MaxAcquireCount)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(MaxAcquireCount): %w", err)
+		}
+
+	}
+
+	if raw["maxUseCountPerTicket"] != nil {
+
+		err = json.Unmarshal(raw["maxUseCountPerTicket"], &cr.MaxUseCountPerTicket)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int32(MaxUseCountPerTicket): %w", err)
+		}
+
+	}
+
+	if raw["maxTicketPerUser"] != nil {
+
+		err = json.Unmarshal(raw["maxTicketPerUser"], &cr.MaxTicketPerUser)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(MaxTicketPerUser): %w", err)
+		}
+
+	}
+
+	if raw["startTimestamp"] != nil {
+
+		err = json.Unmarshal(raw["startTimestamp"], &cr.StartTimestamp)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(StartTimestamp): %w", err)
+		}
+
+	}
+
+	if raw["title"] != nil {
+
+		err = json.Unmarshal(raw["title"], &cr.Title)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Title): %w", err)
+		}
+
+	}
+
+	if raw["usageCondition"] != nil {
+
+		err = json.Unmarshal(raw["usageCondition"], &cr.UsageCondition)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(UsageCondition): %w", err)
+		}
+
+	}
+
+	if raw["reward"] != nil {
+
+		if rawreward, ok := raw["reward"]; ok && rawreward != nil {
+			Reward, err := UnmarshalCouponRewardResponse(rawreward)
+			if err != nil {
+				return fmt.Errorf("JSON parse error in CouponRewardResponse(discriminator): %w", err)
+			}
+			cr.Reward = Reward
+		}
+
+	}
+
+	if raw["visibility"] != nil {
+
+		err = json.Unmarshal(raw["visibility"], &cr.Visibility)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Visibility): %w", err)
+		}
+
+	}
+
+	if raw["timezone"] != nil {
+
+		err = json.Unmarshal(raw["timezone"], &cr.Timezone)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Timezone): %w", err)
+		}
+
+	}
+
+	if raw["couponId"] != nil {
+
+		err = json.Unmarshal(raw["couponId"], &cr.CouponId)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(CouponId): %w", err)
+		}
+
+	}
+
+	if raw["createdTimestamp"] != nil {
+
+		err = json.Unmarshal(raw["createdTimestamp"], &cr.CreatedTimestamp)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in int64(CreatedTimestamp): %w", err)
+		}
+
+	}
+
+	if raw["status"] != nil {
+
+		err = json.Unmarshal(raw["status"], &cr.Status)
+		if err != nil {
+			return fmt.Errorf("JSON parse error in string(Status): %w", err)
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalJSON customizes the JSON serialization of the CouponResponse struct.
+func (r *CouponResponse) MarshalJSON() ([]byte, error) {
+
+	r.AcquisitionCondition = setDiscriminatorPropertyAcquisitionConditionResponse(r.AcquisitionCondition)
+
+	r.Reward = setDiscriminatorPropertyCouponRewardResponse(r.Reward)
+
+	type Alias CouponResponse
+	return json.Marshal(&struct {
+		*Alias
+	}{
+		Alias: (*Alias)(r),
+	})
+}
+
+// CouponResponseVISIBILITY type
+/* Visibility of the coupon. Determines who can see or acquire the coupon. */
+type CouponResponseVISIBILITY string
+
+// CouponResponseVISIBILITY constants
+const (
+	CouponResponseVISIBILITY_UNLISTED CouponResponseVISIBILITY = "UNLISTED"
+
+	CouponResponseVISIBILITY_PUBLIC CouponResponseVISIBILITY = "PUBLIC"
+
+	CouponResponseVISIBILITY_PRIVATE CouponResponseVISIBILITY = "PRIVATE"
+)
+
+// CouponResponseTIMEZONE type
+/* Timezone for interpreting start and end timestamps. */
+type CouponResponseTIMEZONE string
+
+// CouponResponseTIMEZONE constants
+const (
+	CouponResponseTIMEZONE_ETC_GMT_MINUS_12 CouponResponseTIMEZONE = "ETC_GMT_MINUS_12"
+
+	CouponResponseTIMEZONE_ETC_GMT_MINUS_11 CouponResponseTIMEZONE = "ETC_GMT_MINUS_11"
+
+	CouponResponseTIMEZONE_PACIFIC_HONOLULU CouponResponseTIMEZONE = "PACIFIC_HONOLULU"
+
+	CouponResponseTIMEZONE_AMERICA_ANCHORAGE CouponResponseTIMEZONE = "AMERICA_ANCHORAGE"
+
+	CouponResponseTIMEZONE_AMERICA_LOS_ANGELES CouponResponseTIMEZONE = "AMERICA_LOS_ANGELES"
+
+	CouponResponseTIMEZONE_AMERICA_PHOENIX CouponResponseTIMEZONE = "AMERICA_PHOENIX"
+
+	CouponResponseTIMEZONE_AMERICA_CHICAGO CouponResponseTIMEZONE = "AMERICA_CHICAGO"
+
+	CouponResponseTIMEZONE_AMERICA_NEW_YORK CouponResponseTIMEZONE = "AMERICA_NEW_YORK"
+
+	CouponResponseTIMEZONE_AMERICA_CARACAS CouponResponseTIMEZONE = "AMERICA_CARACAS"
+
+	CouponResponseTIMEZONE_AMERICA_SANTIAGO CouponResponseTIMEZONE = "AMERICA_SANTIAGO"
+
+	CouponResponseTIMEZONE_AMERICA_ST_JOHNS CouponResponseTIMEZONE = "AMERICA_ST_JOHNS"
+
+	CouponResponseTIMEZONE_AMERICA_SAO_PAULO CouponResponseTIMEZONE = "AMERICA_SAO_PAULO"
+
+	CouponResponseTIMEZONE_ETC_GMT_MINUS_2 CouponResponseTIMEZONE = "ETC_GMT_MINUS_2"
+
+	CouponResponseTIMEZONE_ATLANTIC_CAPE_VERDE CouponResponseTIMEZONE = "ATLANTIC_CAPE_VERDE"
+
+	CouponResponseTIMEZONE_EUROPE_LONDON CouponResponseTIMEZONE = "EUROPE_LONDON"
+
+	CouponResponseTIMEZONE_EUROPE_PARIS CouponResponseTIMEZONE = "EUROPE_PARIS"
+
+	CouponResponseTIMEZONE_EUROPE_ISTANBUL CouponResponseTIMEZONE = "EUROPE_ISTANBUL"
+
+	CouponResponseTIMEZONE_EUROPE_MOSCOW CouponResponseTIMEZONE = "EUROPE_MOSCOW"
+
+	CouponResponseTIMEZONE_ASIA_TEHRAN CouponResponseTIMEZONE = "ASIA_TEHRAN"
+
+	CouponResponseTIMEZONE_ASIA_TBILISI CouponResponseTIMEZONE = "ASIA_TBILISI"
+
+	CouponResponseTIMEZONE_ASIA_KABUL CouponResponseTIMEZONE = "ASIA_KABUL"
+
+	CouponResponseTIMEZONE_ASIA_TASHKENT CouponResponseTIMEZONE = "ASIA_TASHKENT"
+
+	CouponResponseTIMEZONE_ASIA_COLOMBO CouponResponseTIMEZONE = "ASIA_COLOMBO"
+
+	CouponResponseTIMEZONE_ASIA_KATHMANDU CouponResponseTIMEZONE = "ASIA_KATHMANDU"
+
+	CouponResponseTIMEZONE_ASIA_ALMATY CouponResponseTIMEZONE = "ASIA_ALMATY"
+
+	CouponResponseTIMEZONE_ASIA_RANGOON CouponResponseTIMEZONE = "ASIA_RANGOON"
+
+	CouponResponseTIMEZONE_ASIA_BANGKOK CouponResponseTIMEZONE = "ASIA_BANGKOK"
+
+	CouponResponseTIMEZONE_ASIA_TAIPEI CouponResponseTIMEZONE = "ASIA_TAIPEI"
+
+	CouponResponseTIMEZONE_ASIA_TOKYO CouponResponseTIMEZONE = "ASIA_TOKYO"
+
+	CouponResponseTIMEZONE_AUSTRALIA_DARWIN CouponResponseTIMEZONE = "AUSTRALIA_DARWIN"
+
+	CouponResponseTIMEZONE_AUSTRALIA_SYDNEY CouponResponseTIMEZONE = "AUSTRALIA_SYDNEY"
+
+	CouponResponseTIMEZONE_ASIA_VLADIVOSTOK CouponResponseTIMEZONE = "ASIA_VLADIVOSTOK"
+
+	CouponResponseTIMEZONE_ETC_GMT_PLUS_12 CouponResponseTIMEZONE = "ETC_GMT_PLUS_12"
+
+	CouponResponseTIMEZONE_PACIFIC_TONGATAPU CouponResponseTIMEZONE = "PACIFIC_TONGATAPU"
+)
+
+// CouponResponseSTATUS type
+/* Current status of the coupon. */
+type CouponResponseSTATUS string
+
+// CouponResponseSTATUS constants
+const (
+	CouponResponseSTATUS_DRAFT CouponResponseSTATUS = "DRAFT"
+
+	CouponResponseSTATUS_RUNNING CouponResponseSTATUS = "RUNNING"
+
+	CouponResponseSTATUS_CLOSED CouponResponseSTATUS = "CLOSED"
+)
diff --git a/linebot/messaging_api/model_coupon_reward_request.go b/linebot/messaging_api/model_coupon_reward_request.go
new file mode 100644
index 0000000..de96b00
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_reward_request.go
@@ -0,0 +1,162 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type CouponRewardRequestInterface interface {
+	GetType() string
+}
+
+func (e CouponRewardRequest) GetType() string {
+	return e.Type
+}
+
+type UnknownCouponRewardRequest struct {
+	CouponRewardRequestInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownCouponRewardRequest) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyCouponRewardRequest(r CouponRewardRequestInterface) CouponRewardRequestInterface {
+	switch v := r.(type) {
+	case *CouponCashBackRewardRequest:
+		if v.Type == "" {
+			v.Type = "cashBack"
+		}
+		return v
+	case CouponCashBackRewardRequest:
+		if v.Type == "" {
+			v.Type = "cashBack"
+		}
+		return v
+	case *CouponDiscountRewardRequest:
+		if v.Type == "" {
+			v.Type = "discount"
+		}
+		return v
+	case CouponDiscountRewardRequest:
+		if v.Type == "" {
+			v.Type = "discount"
+		}
+		return v
+	case *CouponFreeRewardRequest:
+		if v.Type == "" {
+			v.Type = "free"
+		}
+		return v
+	case CouponFreeRewardRequest:
+		if v.Type == "" {
+			v.Type = "free"
+		}
+		return v
+	case *CouponGiftRewardRequest:
+		if v.Type == "" {
+			v.Type = "gift"
+		}
+		return v
+	case CouponGiftRewardRequest:
+		if v.Type == "" {
+			v.Type = "gift"
+		}
+		return v
+	case *CouponOthersRewardRequest:
+		if v.Type == "" {
+			v.Type = "others"
+		}
+		return v
+	case CouponOthersRewardRequest:
+		if v.Type == "" {
+			v.Type = "others"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// CouponRewardRequest
+
+type CouponRewardRequest struct {
+	// Type of coupon. Determines the benefit provided.
+
+	Type string `json:"type"`
+}
+
+func UnmarshalCouponRewardRequest(data []byte) (CouponRewardRequestInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCouponRewardRequest: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "cashBack":
+		var cashBack CouponCashBackRewardRequest
+		if err := json.Unmarshal(data, &cashBack); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read cashBack: %w", err)
+		}
+		return cashBack, nil
+	case "discount":
+		var discount CouponDiscountRewardRequest
+		if err := json.Unmarshal(data, &discount); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read discount: %w", err)
+		}
+		return discount, nil
+	case "free":
+		var free CouponFreeRewardRequest
+		if err := json.Unmarshal(data, &free); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read free: %w", err)
+		}
+		return free, nil
+	case "gift":
+		var gift CouponGiftRewardRequest
+		if err := json.Unmarshal(data, &gift); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read gift: %w", err)
+		}
+		return gift, nil
+	case "others":
+		var others CouponOthersRewardRequest
+		if err := json.Unmarshal(data, &others); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardRequest: Cannot read others: %w", err)
+		}
+		return others, nil
+
+	default:
+		var unknown UnknownCouponRewardRequest
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_coupon_reward_response.go b/linebot/messaging_api/model_coupon_reward_response.go
new file mode 100644
index 0000000..edb8260
--- /dev/null
+++ b/linebot/messaging_api/model_coupon_reward_response.go
@@ -0,0 +1,162 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type CouponRewardResponseInterface interface {
+	GetType() string
+}
+
+func (e CouponRewardResponse) GetType() string {
+	return e.Type
+}
+
+type UnknownCouponRewardResponse struct {
+	CouponRewardResponseInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownCouponRewardResponse) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyCouponRewardResponse(r CouponRewardResponseInterface) CouponRewardResponseInterface {
+	switch v := r.(type) {
+	case *CouponCashBackRewardResponse:
+		if v.Type == "" {
+			v.Type = "cashBack"
+		}
+		return v
+	case CouponCashBackRewardResponse:
+		if v.Type == "" {
+			v.Type = "cashBack"
+		}
+		return v
+	case *CouponDiscountRewardResponse:
+		if v.Type == "" {
+			v.Type = "discount"
+		}
+		return v
+	case CouponDiscountRewardResponse:
+		if v.Type == "" {
+			v.Type = "discount"
+		}
+		return v
+	case *CouponFreeRewardResponse:
+		if v.Type == "" {
+			v.Type = "free"
+		}
+		return v
+	case CouponFreeRewardResponse:
+		if v.Type == "" {
+			v.Type = "free"
+		}
+		return v
+	case *CouponGiftRewardResponse:
+		if v.Type == "" {
+			v.Type = "gift"
+		}
+		return v
+	case CouponGiftRewardResponse:
+		if v.Type == "" {
+			v.Type = "gift"
+		}
+		return v
+	case *CouponOthersRewardResponse:
+		if v.Type == "" {
+			v.Type = "others"
+		}
+		return v
+	case CouponOthersRewardResponse:
+		if v.Type == "" {
+			v.Type = "others"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// CouponRewardResponse
+
+type CouponRewardResponse struct {
+	// Type of coupon. Determines the benefit provided.
+
+	Type string `json:"type"`
+}
+
+func UnmarshalCouponRewardResponse(data []byte) (CouponRewardResponseInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCouponRewardResponse: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "cashBack":
+		var cashBack CouponCashBackRewardResponse
+		if err := json.Unmarshal(data, &cashBack); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read cashBack: %w", err)
+		}
+		return cashBack, nil
+	case "discount":
+		var discount CouponDiscountRewardResponse
+		if err := json.Unmarshal(data, &discount); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read discount: %w", err)
+		}
+		return discount, nil
+	case "free":
+		var free CouponFreeRewardResponse
+		if err := json.Unmarshal(data, &free); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read free: %w", err)
+		}
+		return free, nil
+	case "gift":
+		var gift CouponGiftRewardResponse
+		if err := json.Unmarshal(data, &gift); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read gift: %w", err)
+		}
+		return gift, nil
+	case "others":
+		var others CouponOthersRewardResponse
+		if err := json.Unmarshal(data, &others); err != nil {
+			return nil, fmt.Errorf("UnmarshalCouponRewardResponse: Cannot read others: %w", err)
+		}
+		return others, nil
+
+	default:
+		var unknown UnknownCouponRewardResponse
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_discount_explicit_price_info_request.go b/linebot/messaging_api/model_discount_explicit_price_info_request.go
new file mode 100644
index 0000000..837230d
--- /dev/null
+++ b/linebot/messaging_api/model_discount_explicit_price_info_request.go
@@ -0,0 +1,56 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountExplicitPriceInfoRequest
+// DiscountExplicitPriceInfoRequest
+
+type DiscountExplicitPriceInfoRequest struct {
+	DiscountPriceInfoRequest
+
+	/**
+	 * Get PriceAfterDiscount
+	 */
+	PriceAfterDiscount int64 `json:"priceAfterDiscount"`
+
+	/**
+	 * Get OriginalPrice
+	 */
+	OriginalPrice int64 `json:"originalPrice"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountExplicitPriceInfoRequest struct.
+func (r *DiscountExplicitPriceInfoRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountExplicitPriceInfoRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "explicit",
+	})
+}
diff --git a/linebot/messaging_api/model_discount_explicit_price_info_response.go b/linebot/messaging_api/model_discount_explicit_price_info_response.go
new file mode 100644
index 0000000..b962dc4
--- /dev/null
+++ b/linebot/messaging_api/model_discount_explicit_price_info_response.go
@@ -0,0 +1,74 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountExplicitPriceInfoResponse
+// DiscountExplicitPriceInfoResponse
+
+type DiscountExplicitPriceInfoResponse struct {
+	DiscountPriceInfoResponse
+
+	/**
+	 * Currency code (e.g., JPY, THB, TWD).
+	 */
+	Currency DiscountExplicitPriceInfoResponseCURRENCY `json:"currency,omitempty"`
+
+	/**
+	 * Get PriceAfterDiscount
+	 */
+	PriceAfterDiscount int64 `json:"priceAfterDiscount"`
+
+	/**
+	 * Get OriginalPrice
+	 */
+	OriginalPrice int64 `json:"originalPrice"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountExplicitPriceInfoResponse struct.
+func (r *DiscountExplicitPriceInfoResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountExplicitPriceInfoResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "explicit",
+	})
+}
+
+// DiscountExplicitPriceInfoResponseCURRENCY type
+/* Currency code (e.g., JPY, THB, TWD). */
+type DiscountExplicitPriceInfoResponseCURRENCY string
+
+// DiscountExplicitPriceInfoResponseCURRENCY constants
+const (
+	DiscountExplicitPriceInfoResponseCURRENCY_JPY DiscountExplicitPriceInfoResponseCURRENCY = "JPY"
+
+	DiscountExplicitPriceInfoResponseCURRENCY_THB DiscountExplicitPriceInfoResponseCURRENCY = "THB"
+
+	DiscountExplicitPriceInfoResponseCURRENCY_TWD DiscountExplicitPriceInfoResponseCURRENCY = "TWD"
+)
diff --git a/linebot/messaging_api/model_discount_fixed_price_info_request.go b/linebot/messaging_api/model_discount_fixed_price_info_request.go
new file mode 100644
index 0000000..dbf4937
--- /dev/null
+++ b/linebot/messaging_api/model_discount_fixed_price_info_request.go
@@ -0,0 +1,51 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountFixedPriceInfoRequest
+// DiscountFixedPriceInfoRequest
+
+type DiscountFixedPriceInfoRequest struct {
+	DiscountPriceInfoRequest
+
+	/**
+	 * Get FixedAmount
+	 */
+	FixedAmount int64 `json:"fixedAmount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountFixedPriceInfoRequest struct.
+func (r *DiscountFixedPriceInfoRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountFixedPriceInfoRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "fixed",
+	})
+}
diff --git a/linebot/messaging_api/model_discount_fixed_price_info_response.go b/linebot/messaging_api/model_discount_fixed_price_info_response.go
new file mode 100644
index 0000000..3e2a43e
--- /dev/null
+++ b/linebot/messaging_api/model_discount_fixed_price_info_response.go
@@ -0,0 +1,69 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountFixedPriceInfoResponse
+// DiscountFixedPriceInfoResponse
+
+type DiscountFixedPriceInfoResponse struct {
+	DiscountPriceInfoResponse
+
+	/**
+	 * Currency code (e.g., JPY, THB, TWD).
+	 */
+	Currency DiscountFixedPriceInfoResponseCURRENCY `json:"currency,omitempty"`
+
+	/**
+	 * Get FixedAmount
+	 */
+	FixedAmount int64 `json:"fixedAmount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountFixedPriceInfoResponse struct.
+func (r *DiscountFixedPriceInfoResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountFixedPriceInfoResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "fixed",
+	})
+}
+
+// DiscountFixedPriceInfoResponseCURRENCY type
+/* Currency code (e.g., JPY, THB, TWD). */
+type DiscountFixedPriceInfoResponseCURRENCY string
+
+// DiscountFixedPriceInfoResponseCURRENCY constants
+const (
+	DiscountFixedPriceInfoResponseCURRENCY_JPY DiscountFixedPriceInfoResponseCURRENCY = "JPY"
+
+	DiscountFixedPriceInfoResponseCURRENCY_THB DiscountFixedPriceInfoResponseCURRENCY = "THB"
+
+	DiscountFixedPriceInfoResponseCURRENCY_TWD DiscountFixedPriceInfoResponseCURRENCY = "TWD"
+)
diff --git a/linebot/messaging_api/model_discount_percentage_price_info_request.go b/linebot/messaging_api/model_discount_percentage_price_info_request.go
new file mode 100644
index 0000000..bc6b689
--- /dev/null
+++ b/linebot/messaging_api/model_discount_percentage_price_info_request.go
@@ -0,0 +1,53 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountPercentagePriceInfoRequest
+// DiscountPercentagePriceInfoRequest
+
+type DiscountPercentagePriceInfoRequest struct {
+	DiscountPriceInfoRequest
+
+	/**
+	 * Specifies the discount rate as a percentage. Must be an integer between 1 and 99.
+	 * minimum: 1
+	 * maximum: 99
+	 */
+	Percentage int32 `json:"percentage,omitempty"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountPercentagePriceInfoRequest struct.
+func (r *DiscountPercentagePriceInfoRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountPercentagePriceInfoRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "percentage",
+	})
+}
diff --git a/linebot/messaging_api/model_discount_percentage_price_info_response.go b/linebot/messaging_api/model_discount_percentage_price_info_response.go
new file mode 100644
index 0000000..c6b816f
--- /dev/null
+++ b/linebot/messaging_api/model_discount_percentage_price_info_response.go
@@ -0,0 +1,51 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// DiscountPercentagePriceInfoResponse
+// DiscountPercentagePriceInfoResponse
+
+type DiscountPercentagePriceInfoResponse struct {
+	DiscountPriceInfoResponse
+
+	/**
+	 * Get Percentage
+	 */
+	Percentage int32 `json:"percentage"`
+}
+
+// MarshalJSON customizes the JSON serialization of the DiscountPercentagePriceInfoResponse struct.
+func (r *DiscountPercentagePriceInfoResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias DiscountPercentagePriceInfoResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "percentage",
+	})
+}
diff --git a/linebot/messaging_api/model_discount_price_info_request.go b/linebot/messaging_api/model_discount_price_info_request.go
new file mode 100644
index 0000000..bb5e35a
--- /dev/null
+++ b/linebot/messaging_api/model_discount_price_info_request.go
@@ -0,0 +1,128 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type DiscountPriceInfoRequestInterface interface {
+	GetType() string
+}
+
+func (e DiscountPriceInfoRequest) GetType() string {
+	return e.Type
+}
+
+type UnknownDiscountPriceInfoRequest struct {
+	DiscountPriceInfoRequestInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownDiscountPriceInfoRequest) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyDiscountPriceInfoRequest(r DiscountPriceInfoRequestInterface) DiscountPriceInfoRequestInterface {
+	switch v := r.(type) {
+	case *DiscountExplicitPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "explicit"
+		}
+		return v
+	case DiscountExplicitPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "explicit"
+		}
+		return v
+	case *DiscountFixedPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case DiscountFixedPriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case *DiscountPercentagePriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+	case DiscountPercentagePriceInfoRequest:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// DiscountPriceInfoRequest
+
+type DiscountPriceInfoRequest struct {
+	Type string `json:"type"`
+}
+
+func UnmarshalDiscountPriceInfoRequest(data []byte) (DiscountPriceInfoRequestInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalDiscountPriceInfoRequest: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalDiscountPriceInfoRequest: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "explicit":
+		var explicit DiscountExplicitPriceInfoRequest
+		if err := json.Unmarshal(data, &explicit); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoRequest: Cannot read explicit: %w", err)
+		}
+		return explicit, nil
+	case "fixed":
+		var fixed DiscountFixedPriceInfoRequest
+		if err := json.Unmarshal(data, &fixed); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoRequest: Cannot read fixed: %w", err)
+		}
+		return fixed, nil
+	case "percentage":
+		var percentage DiscountPercentagePriceInfoRequest
+		if err := json.Unmarshal(data, &percentage); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoRequest: Cannot read percentage: %w", err)
+		}
+		return percentage, nil
+
+	default:
+		var unknown UnknownDiscountPriceInfoRequest
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_discount_price_info_response.go b/linebot/messaging_api/model_discount_price_info_response.go
new file mode 100644
index 0000000..d9753d6
--- /dev/null
+++ b/linebot/messaging_api/model_discount_price_info_response.go
@@ -0,0 +1,128 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type DiscountPriceInfoResponseInterface interface {
+	GetType() string
+}
+
+func (e DiscountPriceInfoResponse) GetType() string {
+	return e.Type
+}
+
+type UnknownDiscountPriceInfoResponse struct {
+	DiscountPriceInfoResponseInterface
+	Type string
+	Raw  map[string]json.RawMessage
+}
+
+func (e UnknownDiscountPriceInfoResponse) GetType() string {
+	return e.Type
+}
+
+func setDiscriminatorPropertyDiscountPriceInfoResponse(r DiscountPriceInfoResponseInterface) DiscountPriceInfoResponseInterface {
+	switch v := r.(type) {
+	case *DiscountExplicitPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "explicit"
+		}
+		return v
+	case DiscountExplicitPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "explicit"
+		}
+		return v
+	case *DiscountFixedPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case DiscountFixedPriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "fixed"
+		}
+		return v
+	case *DiscountPercentagePriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+	case DiscountPercentagePriceInfoResponse:
+		if v.Type == "" {
+			v.Type = "percentage"
+		}
+		return v
+
+	default:
+		return v
+	}
+}
+
+// DiscountPriceInfoResponse
+
+type DiscountPriceInfoResponse struct {
+	Type string `json:"type"`
+}
+
+func UnmarshalDiscountPriceInfoResponse(data []byte) (DiscountPriceInfoResponseInterface, error) {
+	var raw map[string]json.RawMessage
+	err := json.Unmarshal(data, &raw)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalDiscountPriceInfoResponse: %w", err)
+	}
+
+	var discriminator string
+	err = json.Unmarshal(raw["type"], &discriminator)
+	if err != nil {
+		return nil, fmt.Errorf("UnmarshalDiscountPriceInfoResponse: Cannot read type: %w", err)
+	}
+
+	switch discriminator {
+	case "explicit":
+		var explicit DiscountExplicitPriceInfoResponse
+		if err := json.Unmarshal(data, &explicit); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoResponse: Cannot read explicit: %w", err)
+		}
+		return explicit, nil
+	case "fixed":
+		var fixed DiscountFixedPriceInfoResponse
+		if err := json.Unmarshal(data, &fixed); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoResponse: Cannot read fixed: %w", err)
+		}
+		return fixed, nil
+	case "percentage":
+		var percentage DiscountPercentagePriceInfoResponse
+		if err := json.Unmarshal(data, &percentage); err != nil {
+			return nil, fmt.Errorf("UnmarshalDiscountPriceInfoResponse: Cannot read percentage: %w", err)
+		}
+		return percentage, nil
+
+	default:
+		var unknown UnknownDiscountPriceInfoResponse
+		unknown.Type = discriminator
+		unknown.Raw = raw
+		return unknown, nil
+	}
+}
diff --git a/linebot/messaging_api/model_lottery_acquisition_condition_request.go b/linebot/messaging_api/model_lottery_acquisition_condition_request.go
new file mode 100644
index 0000000..4cfadb8
--- /dev/null
+++ b/linebot/messaging_api/model_lottery_acquisition_condition_request.go
@@ -0,0 +1,59 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// LotteryAcquisitionConditionRequest
+// LotteryAcquisitionConditionRequest
+
+type LotteryAcquisitionConditionRequest struct {
+	AcquisitionConditionRequest
+
+	/**
+	 * Probability (1-99) of winning the coupon in lottery-type campaigns. (Required)
+	 * minimum: 1
+	 * maximum: 99
+	 */
+	LotteryProbability int32 `json:"lotteryProbability"`
+
+	/**
+	 * Maximum number of coupons that can be issued in total. Use -1 to indicate no limit (Required)
+	 * maximum: 999999
+	 */
+	MaxAcquireCount int32 `json:"maxAcquireCount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the LotteryAcquisitionConditionRequest struct.
+func (r *LotteryAcquisitionConditionRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias LotteryAcquisitionConditionRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "lottery",
+	})
+}
diff --git a/linebot/messaging_api/model_lottery_acquisition_condition_response.go b/linebot/messaging_api/model_lottery_acquisition_condition_response.go
new file mode 100644
index 0000000..5d800e9
--- /dev/null
+++ b/linebot/messaging_api/model_lottery_acquisition_condition_response.go
@@ -0,0 +1,56 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// LotteryAcquisitionConditionResponse
+// LotteryAcquisitionConditionResponse
+
+type LotteryAcquisitionConditionResponse struct {
+	AcquisitionConditionResponse
+
+	/**
+	 * Get LotteryProbability
+	 */
+	LotteryProbability int32 `json:"lotteryProbability"`
+
+	/**
+	 * Get MaxAcquireCount
+	 */
+	MaxAcquireCount int32 `json:"maxAcquireCount"`
+}
+
+// MarshalJSON customizes the JSON serialization of the LotteryAcquisitionConditionResponse struct.
+func (r *LotteryAcquisitionConditionResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias LotteryAcquisitionConditionResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "lottery",
+	})
+}
diff --git a/linebot/messaging_api/model_message.go b/linebot/messaging_api/model_message.go
index 0b14594..51dbbb7 100644
--- a/linebot/messaging_api/model_message.go
+++ b/linebot/messaging_api/model_message.go
@@ -54,6 +54,16 @@ func setDiscriminatorPropertyMessage(r MessageInterface) MessageInterface {
 			v.Type = "audio"
 		}
 		return v
+	case *CouponMessage:
+		if v.Type == "" {
+			v.Type = "coupon"
+		}
+		return v
+	case CouponMessage:
+		if v.Type == "" {
+			v.Type = "coupon"
+		}
+		return v
 	case *FlexMessage:
 		if v.Type == "" {
 			v.Type = "flex"
@@ -184,6 +194,12 @@ func UnmarshalMessage(data []byte) (MessageInterface, error) {
 			return nil, fmt.Errorf("UnmarshalMessage: Cannot read audio: %w", err)
 		}
 		return audio, nil
+	case "coupon":
+		var coupon CouponMessage
+		if err := json.Unmarshal(data, &coupon); err != nil {
+			return nil, fmt.Errorf("UnmarshalMessage: Cannot read coupon: %w", err)
+		}
+		return coupon, nil
 	case "flex":
 		var flex FlexMessage
 		if err := json.Unmarshal(data, &flex); err != nil {
diff --git a/linebot/messaging_api/model_messaging_api_pager_coupon_list_response.go b/linebot/messaging_api/model_messaging_api_pager_coupon_list_response.go
new file mode 100644
index 0000000..633a5df
--- /dev/null
+++ b/linebot/messaging_api/model_messaging_api_pager_coupon_list_response.go
@@ -0,0 +1,36 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+// MessagingApiPagerCouponListResponse
+// Paginated response object containing a list of coupons.
+
+type MessagingApiPagerCouponListResponse struct {
+
+	/**
+	 * List of coupon summary objects. (Required)
+	 */
+	Items []CouponListResponse `json:"items"`
+
+	/**
+	 * Token for fetching the next page of results.
+	 */
+	Next string `json:"next,omitempty"`
+}
diff --git a/linebot/messaging_api/model_normal_acquisition_condition_request.go b/linebot/messaging_api/model_normal_acquisition_condition_request.go
new file mode 100644
index 0000000..7cde4a7
--- /dev/null
+++ b/linebot/messaging_api/model_normal_acquisition_condition_request.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// NormalAcquisitionConditionRequest
+// NormalAcquisitionConditionRequest
+
+type NormalAcquisitionConditionRequest struct {
+	AcquisitionConditionRequest
+}
+
+// MarshalJSON customizes the JSON serialization of the NormalAcquisitionConditionRequest struct.
+func (r *NormalAcquisitionConditionRequest) MarshalJSON() ([]byte, error) {
+
+	type Alias NormalAcquisitionConditionRequest
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "normal",
+	})
+}
diff --git a/linebot/messaging_api/model_normal_acquisition_condition_response.go b/linebot/messaging_api/model_normal_acquisition_condition_response.go
new file mode 100644
index 0000000..79434ef
--- /dev/null
+++ b/linebot/messaging_api/model_normal_acquisition_condition_response.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// NormalAcquisitionConditionResponse
+// NormalAcquisitionConditionResponse
+
+type NormalAcquisitionConditionResponse struct {
+	AcquisitionConditionResponse
+}
+
+// MarshalJSON customizes the JSON serialization of the NormalAcquisitionConditionResponse struct.
+func (r *NormalAcquisitionConditionResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias NormalAcquisitionConditionResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "normal",
+	})
+}
diff --git a/linebot/messaging_api/model_referral_acquisition_condition_response.go b/linebot/messaging_api/model_referral_acquisition_condition_response.go
new file mode 100644
index 0000000..37a5189
--- /dev/null
+++ b/linebot/messaging_api/model_referral_acquisition_condition_response.go
@@ -0,0 +1,46 @@
+/**
+ * LINE Messaging API
+ * This document describes LINE Messaging API.
+ *
+ * The version of the OpenAPI document: 0.0.1
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+//go:generate python3 ../../generate-code.py
+package messaging_api
+
+import (
+	"encoding/json"
+)
+
+// ReferralAcquisitionConditionResponse
+// ReferralAcquisitionConditionResponse
+
+type ReferralAcquisitionConditionResponse struct {
+	AcquisitionConditionResponse
+}
+
+// MarshalJSON customizes the JSON serialization of the ReferralAcquisitionConditionResponse struct.
+func (r *ReferralAcquisitionConditionResponse) MarshalJSON() ([]byte, error) {
+
+	type Alias ReferralAcquisitionConditionResponse
+	return json.Marshal(&struct {
+		*Alias
+
+		Type string `json:"type"`
+	}{
+		Alias: (*Alias)(r),
+
+		Type: "referral",
+	})
+}
diff --git a/linebot/messaging_api/model_text_message_v2.go b/linebot/messaging_api/model_text_message_v2.go
index 1f79961..32dfd5b 100644
--- a/linebot/messaging_api/model_text_message_v2.go
+++ b/linebot/messaging_api/model_text_message_v2.go
@@ -47,7 +47,7 @@ type TextMessageV2 struct {
 	/**
 	 * A mapping that specifies substitutions for parts enclosed in {} within the `text` field.
 	 */
-	Substitution map[string]SubstitutionObject `json:"substitution,omitempty"`
+	Substitution map[string]SubstitutionObjectInterface `json:"substitution,omitempty"`
 
 	/**
 	 * Quote token of the message you want to quote.



Test patch:
diff --git a/linebot/messaging_api/tests/handwritten/api_CloseCoupon_test.go b/linebot/messaging_api/tests/handwritten/api_CloseCoupon_test.go
new file mode 100644
index 0000000..81f6a7e
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/api_CloseCoupon_test.go
@@ -0,0 +1,50 @@
+package tests
+
+import (
+	"fmt"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestCloseCouponWithHttpInfo(t *testing.T) {
+	expectedCouponId := "COUPON123"
+
+	server := httptest.NewServer(
+		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			// Verify the request method
+			if r.Method != http.MethodPut {
+				t.Errorf("Expected method PUT, got %s", r.Method)
+			}
+
+			// Verify the request path
+			expectedPath := fmt.Sprintf("/v2/bot/coupon/%s/close", expectedCouponId)
+			if r.URL.Path != expectedPath {
+				t.Errorf("Expected path %s, got %s", expectedPath, r.URL.Path)
+			}
+
+			// Simulate a successful response
+			w.WriteHeader(http.StatusOK)
+		}),
+	)
+	defer server.Close()
+
+	client, err := messaging_api.NewMessagingApiAPI(
+		"channelToken",
+		messaging_api.WithEndpoint(server.URL),
+	)
+	if err != nil {
+		t.Fatalf("Failed to create client: %v", err)
+	}
+
+	resp, _, err := client.CloseCouponWithHttpInfo(expectedCouponId)
+	if err != nil {
+		t.Fatalf("Unexpected error: %v", err)
+	}
+
+	if resp.StatusCode != http.StatusOK {
+		t.Errorf("Expected status code 200, got %d", resp.StatusCode)
+	}
+}
diff --git a/linebot/messaging_api/tests/handwritten/api_CreateCoupon_test.go b/linebot/messaging_api/tests/handwritten/api_CreateCoupon_test.go
new file mode 100644
index 0000000..37e64ff
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/api_CreateCoupon_test.go
@@ -0,0 +1,122 @@
+package tests
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestCreateCoupon_ItShouldCorrectlySendRequestBody(t *testing.T) {
+	expectedBody := `{
+		"acquisitionCondition": {
+			"type": "lottery",
+			"lotteryProbability": 50,
+			"maxAcquireCount": 1000
+		},
+		"barcodeImageUrl": "https://example.com/barcode.png",
+		"couponCode": "UNIQUECODE123",
+		"description": "Get 100 Yen off your purchase",
+		"endTimestamp": 1700000000,
+		"imageUrl": "https://example.com/image.png",
+		"maxUseCountPerTicket": 1,
+		"startTimestamp": 1600000000,
+		"title": "100 Yen OFF",
+		"usageCondition": "Minimum purchase of 500 Yen",
+		"reward": {
+			"type": "discount",
+			"priceInfo": {
+				"type": "fixed",
+				"fixedAmount": 100
+			}
+		},
+		"visibility": "PUBLIC",
+		"timezone": "ASIA_TOKYO"
+	}`
+
+
+	server := httptest.NewServer(
+		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			// Read the request body
+			bodyBytes, err := io.ReadAll(r.Body)
+			if err != nil {
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+
+			var gotBody map[string]any
+			var expectedBodyMap map[string]any
+
+			// Unmarshal the received JSON
+			if err := json.Unmarshal(bodyBytes, &gotBody); err != nil {
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+
+			// Unmarshal the expected JSON
+			if err := json.Unmarshal([]byte(expectedBody), &expectedBodyMap); err != nil {
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+
+			// Compare the unmarshalled JSON objects
+			if !reflect.DeepEqual(gotBody, expectedBodyMap) {
+				w.Header().Set("TEST-ERROR", fmt.Sprintf("incorrect request body being sent from client. expected %v, got %v", expectedBodyMap, gotBody))
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+
+			json.NewEncoder(w).Encode(messaging_api.CouponCreateResponse{
+				CouponId: "COUPON_ID_1",
+			})
+		}),
+	)
+	defer server.Close()
+
+	client, err := messaging_api.NewMessagingApiAPI(
+		"channelToken",
+		messaging_api.WithEndpoint(server.URL),
+	)
+	if err != nil {
+		t.Fatalf("Failed to create client: %v", err)
+	}
+
+	req := &messaging_api.CouponCreateRequest{
+		AcquisitionCondition: &messaging_api.LotteryAcquisitionConditionRequest{
+			LotteryProbability: 50,
+			MaxAcquireCount:      1000,
+		},
+		BarcodeImageUrl:      "https://example.com/barcode.png",
+		CouponCode:           "UNIQUECODE123",
+		Description:          "Get 100 Yen off your purchase",
+		EndTimestamp:         1700000000,
+		ImageUrl:             "https://example.com/image.png",
+		MaxUseCountPerTicket: 1,
+		StartTimestamp:       1600000000,
+		Title:                "100 Yen OFF",
+		UsageCondition:       "Minimum purchase of 500 Yen",
+		Reward:               &messaging_api.CouponDiscountRewardRequest{
+			PriceInfo: &messaging_api.DiscountFixedPriceInfoRequest{
+				FixedAmount: 100,
+			},
+		},
+		Visibility:           messaging_api.CouponCreateRequestVISIBILITY_PUBLIC,
+		Timezone:             messaging_api.CouponCreateRequestTIMEZONE_ASIA_TOKYO,
+	}
+
+	resp, result, err := client.CreateCouponWithHttpInfo(req)
+	if err != nil {
+		t.Fatalf("Unexpected error: %v", err)
+	}
+	if resp.StatusCode != http.StatusOK {
+		t.Errorf("Not getting 200 response back: %s", resp.Header.Get("TEST-ERROR"))
+	}
+	if result.CouponId != "COUPON_ID_1" {
+		t.Errorf("Expected CouponId: COUPON_ID_1, got: %s", result.CouponId)
+	}
+}
diff --git a/linebot/messaging_api/tests/handwritten/api_GetCouponDetail_test.go b/linebot/messaging_api/tests/handwritten/api_GetCouponDetail_test.go
new file mode 100644
index 0000000..a788594
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/api_GetCouponDetail_test.go
@@ -0,0 +1,150 @@
+package tests
+
+import (
+	"fmt"
+	"net/http"
+	"net/http/httptest"
+	// "reflect"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestGetCouponDetailWithHttpInfo(t *testing.T) {
+	expectedCouponId := "COUPON123"
+	expectedBody := `{
+			"acquisitionCondition": {
+				"type": "lottery",
+				"lotteryProbability": 50
+			},
+			"barcodeImageUrl": "https://example.com/barcode.png",
+			"couponCode": "UNIQUECODE123",
+			"description": "Get 100 Yen off your purchase",
+			"endTimestamp": 1700000000,
+			"imageUrl": "https://example.com/image.png",
+			"maxAcquireCount": 1000,
+			"maxUseCountPerTicket": 1,
+			"startTimestamp": 1600000000,
+			"title": "100 Yen OFF",
+			"usageCondition": "Minimum purchase of 500 Yen",
+			"reward": {
+				"type": "discount",
+				"priceInfo": {
+					"type": "fixed",
+					"fixedAmount": 100,
+					"currency": "JPY"
+				}
+			},
+			"visibility": "PUBLIC",
+			"timezone": "ASIA_TOKYO",
+			"couponId": "COUPON123",
+			"createdTimestamp": 1600000000,
+			"status": "RUNNING"
+		}`
+
+	server := httptest.NewServer(
+		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			// Verify the request method
+			if r.Method != http.MethodGet {
+				t.Errorf("Expected method GET, got %s", r.Method)
+			}
+
+			// Verify the request path
+			expectedPath := fmt.Sprintf("/v2/bot/coupon/%s", expectedCouponId)
+			if r.URL.Path != expectedPath {
+				t.Errorf("Expected path %s, got %s", expectedPath, r.URL.Path)
+			}
+
+			// Simulate a successful response with the expected coupon details
+			w.WriteHeader(http.StatusOK)
+			w.Header().Set("Content-Type", "application/json")
+			w.Write([]byte(expectedBody))
+		}),
+	)
+	defer server.Close()
+
+	client, err := messaging_api.NewMessagingApiAPI(
+		"channelToken",
+		messaging_api.WithEndpoint(server.URL),
+	)
+	if err != nil {
+		t.Fatalf("Failed to create client: %v", err)
+	}
+
+	resp, result, err := client.GetCouponDetailWithHttpInfo(expectedCouponId)
+	if err != nil {
+		t.Fatalf("Unexpected error: %v", err)
+	}
+
+	if resp.StatusCode != http.StatusOK {
+		t.Errorf("Expected status code 200, got %d", resp.StatusCode)
+	}
+
+	if acquisitionCondition, ok := result.AcquisitionCondition.(messaging_api.LotteryAcquisitionConditionResponse); ok {
+		if acquisitionCondition.LotteryProbability != 50 {
+			t.Errorf("Expected AcquisitionCondition LotteryProbability 50, got %v", acquisitionCondition.LotteryProbability)
+		}
+	} else {
+		t.Errorf("Expected AcquisitionCondition to be of type LotteryAcquisitionCondition, got %T", result.AcquisitionCondition)
+	}
+
+	if result.BarcodeImageUrl != "https://example.com/barcode.png" {
+		t.Errorf("Expected BarcodeImageUrl 'https://example.com/barcode.png', got %s", result.BarcodeImageUrl)
+	}
+	if result.CouponCode != "UNIQUECODE123" {
+		t.Errorf("Expected CouponCode 'UNIQUECODE123', got %s", result.CouponCode)
+	}
+	if result.Description != "Get 100 Yen off your purchase" {
+		t.Errorf("Expected Description 'Get 100 Yen off your purchase', got %s", result.Description)
+	}
+	if result.EndTimestamp != 1700000000 {
+		t.Errorf("Expected EndTimestamp 1700000000, got %d", result.EndTimestamp)
+	}
+	if result.ImageUrl != "https://example.com/image.png" {
+		t.Errorf("Expected ImageUrl 'https://example.com/image.png', got %s", result.ImageUrl)
+	}
+	if result.MaxAcquireCount != 1000 {
+		t.Errorf("Expected MaxAcquireCount 1000, got %d", result.MaxAcquireCount)
+	}
+	if result.MaxUseCountPerTicket != 1 {
+		t.Errorf("Expected MaxUseCountPerTicket 1, got %d", result.MaxUseCountPerTicket)
+	}
+	if result.StartTimestamp != 1600000000 {
+		t.Errorf("Expected StartTimestamp 1600000000, got %d", result.StartTimestamp)
+	}
+	if result.Title != "100 Yen OFF" {
+		t.Errorf("Expected Title '100 Yen OFF', got %s", result.Title)
+	}
+	if result.UsageCondition != "Minimum purchase of 500 Yen" {
+		t.Errorf("Expected UsageCondition 'Minimum purchase of 500 Yen', got %s", result.UsageCondition)
+	}
+	if reward, ok := result.Reward.(messaging_api.CouponDiscountRewardResponse); ok {
+		if priceInfo, ok := reward.PriceInfo.(messaging_api.DiscountFixedPriceInfoResponse); ok {
+			if priceInfo.FixedAmount != 100 {
+				t.Errorf("Expected Reward PriceInfo FixedAmount 100, got %d", priceInfo.FixedAmount)
+			}
+			if priceInfo.Currency != "JPY" {
+				t.Errorf("Expected Reward PriceInfo Currency 'JPY', got %s", priceInfo.Currency)
+			}
+		} else {
+			t.Errorf("Expected Reward PriceInfo to be of type DiscountFixedPriceInfoResponse, got %T", reward.PriceInfo)
+		}
+	} else {
+		t.Errorf("Expected Reward to be of type CouponDiscountRewardResponse, got %T", result.Reward)
+	}
+	if result.Visibility != messaging_api.CouponResponseVISIBILITY_PUBLIC {
+		t.Errorf("Expected Visibility 'PUBLIC', got %s", result.Visibility)
+	}
+	if result.Timezone != messaging_api.CouponResponseTIMEZONE_ASIA_TOKYO {
+		t.Errorf("Expected Timezone 'ASIA_TOKYO', got %s", result.Timezone)
+	}
+	if result.CouponId != expectedCouponId {
+		t.Errorf("Expected CouponId '%s', got %s", expectedCouponId, result.CouponId)
+	}
+	if result.CreatedTimestamp != 1600000000 {
+		t.Errorf("Expected CreatedTimestamp 1600000000, got %d", result.CreatedTimestamp)
+	}
+	if result.Status != "RUNNING" {
+		t.Errorf("Expected Status 'RUNNING', got %s", result.Status)
+	}
+}
diff --git a/linebot/messaging_api/tests/handwritten/api_ListCoupon_test.go b/linebot/messaging_api/tests/handwritten/api_ListCoupon_test.go
new file mode 100644
index 0000000..d6ab7f5
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/api_ListCoupon_test.go
@@ -0,0 +1,77 @@
+package tests
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestListCoupon_ItShouldCorrectlyPassQueryParameter(t *testing.T) {
+	expectedLimit := "10"
+	expectedStart := "some-start"
+	expectedStatus := []string{"CLOSED", "RUNNING"}
+	server := httptest.NewServer(
+		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			gotLimit := r.URL.Query().Get("limit")
+			gotStart := r.URL.Query().Get("start")
+			r.ParseForm()
+			gotStatus := r.Form["status"]
+			if gotLimit != expectedLimit {
+				w.Header().Set("TEST-ERROR", fmt.Sprintf("incorrect limit being sent from client. expected %s, got %s", expectedLimit, gotLimit))
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+			if gotStart != expectedStart {
+				w.Header().Set("TEST-ERROR", fmt.Sprintf("incorrect start being sent from client. expected %s, got %s", expectedStart, gotStart))
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+			if !reflect.DeepEqual(gotStatus, expectedStatus) {
+				w.Header().Set("TEST-ERROR", fmt.Sprintf("incorrect status being sent from client. expected %s, got %s", expectedStatus, gotStatus))
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+			json.NewEncoder(w).Encode(messaging_api.MessagingApiPagerCouponListResponse{
+				Items: []messaging_api.CouponListResponse{
+					{
+						CouponId: "COUPON_ID_1",
+						Title: "100Yen OFF",
+					},
+				},
+				Next: "abcdef",
+			})
+		}),
+	)
+	client, err := messaging_api.NewMessagingApiAPI(
+		"channelToken",
+		messaging_api.WithEndpoint(server.URL),
+	)
+	if err != nil {
+		t.Fatalf("Failed to create client: %v", err)
+	}
+	status := []string{"CLOSED", "RUNNING"}
+
+	resp, result, err := client.ListCouponWithHttpInfo(&status, "some-start", 10)
+	if err != nil {
+		t.Fatalf("Unexpected error: %v", err)
+	}
+	if resp.StatusCode != http.StatusOK {
+		t.Errorf("Not getting 200 response back: %s", resp.Header.Get("TEST-ERROR"))
+	}
+	if !reflect.DeepEqual(result.Items, []messaging_api.CouponListResponse{
+		{
+			CouponId: "COUPON_ID_1",
+			Title: "100Yen OFF",
+		},
+	}) {
+		t.Errorf("Expected Items: [{CouponId: COUPON_ID_1, Title: 100Yen OFF}], got: %v", result.Items)
+	}
+	if result.Next != "abcdef" {
+		t.Errorf("Expected Next: abcdef, got: %s", result.Next)
+	}
+}
diff --git a/linebot/messaging_api/tests/handwritten/model_coupon_message_test.go b/linebot/messaging_api/tests/handwritten/model_coupon_message_test.go
new file mode 100644
index 0000000..73fb9ed
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/model_coupon_message_test.go
@@ -0,0 +1,28 @@
+package tests
+
+import (
+	"encoding/json"
+	"strings"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestCouponMessage(t *testing.T) {
+	req := &messaging_api.ReplyMessageRequest{
+		ReplyToken: "JKLJDSFhkljdsjfkla",
+		Messages: []messaging_api.MessageInterface{
+			&messaging_api.CouponMessage{
+				CouponId: "COUPON_123",
+			},
+		},
+	}
+	encodedMsg, err := json.Marshal(req)
+	if err != nil {
+		t.Fatalf("Failed to encode message: %v", err)
+	}
+	encodedMsgStr := string(encodedMsg)
+	if !strings.Contains(encodedMsgStr, `"type":"coupon"`) {
+		t.Errorf("Encoded message doens't contains expected default value: %s", encodedMsgStr)
+	}
+}
diff --git a/linebot/messaging_api/tests/handwritten/model_text_message_v2_test.go b/linebot/messaging_api/tests/handwritten/model_text_message_v2_test.go
new file mode 100644
index 0000000..f18d13f
--- /dev/null
+++ b/linebot/messaging_api/tests/handwritten/model_text_message_v2_test.go
@@ -0,0 +1,45 @@
+package tests
+
+import (
+	"encoding/json"
+	"strings"
+	"testing"
+
+	"github.com/line/line-bot-sdk-go/v8/linebot/messaging_api"
+)
+
+func TestTextMessageV2(t *testing.T) {
+	req := &messaging_api.ReplyMessageRequest{
+		ReplyToken: "JKLJDSFhkljdsjfkla",
+		Messages: []messaging_api.MessageInterface{
+			&messaging_api.TextMessageV2{
+				Text: "Hello, {newbee}! {smile}",
+				Substitution: map[string]messaging_api.SubstitutionObjectInterface{
+					"newbee": &messaging_api.MentionSubstitutionObject{
+						Mentionee: &messaging_api.UserMentionTarget{
+							UserId: "U1234567890abcdef1234567890abcdef",
+						},
+					},
+					"smile": &messaging_api.EmojiSubstitutionObject{
+						ProductId: "5ac1bfd5040ab15980c9b435",
+						EmojiId: "002",
+					},
+				},
+			},
+		},
+	}
+	encodedMsg, err := json.Marshal(req)
+	if err != nil {
+		t.Fatalf("Failed to encode message: %v", err)
+	}
+	encodedMsgStr := string(encodedMsg)
+	if !strings.Contains(encodedMsgStr, `"type":"textV2"`) {
+		t.Errorf("Encoded message doens't contains expected default value: %s", encodedMsgStr)
+	}
+	if !strings.Contains(encodedMsgStr, `"type":"mention"`) {
+		t.Errorf("Encoded message doens't contains expected default value: %s", encodedMsgStr)
+	}
+	if !strings.Contains(encodedMsgStr, `"type":"emoji"`) {
+		t.Errorf("Encoded message doens't contains expected default value: %s", encodedMsgStr)
+	}
+}