Skip to content

Commit 70cde7f

Browse files
github-actions[bot]github-actionshabara-k
authored
Add Coupon API Support to Messaging API (#637)
line/line-openapi#111 # Add Coupon API Support to Messaging API We've supported a set of new APIs that make it possible to create, manage, and deliver coupons via the Messaging API. These features provide functionality similar to what's available through the LINE Official Account Manager interface ([see here](https://www.lycbiz.com/jp/manual/OfficialAccountManager/coupons-create/)), allowing developers to integrate coupon-related workflows into their bots more flexibly. For more details, see the official announcement: [LINE Developers News — Coupon API Released (2025/08/06)](https://developers.line.biz/en/news/2025/08/06/coupon-api/) ## New API Endpoints - `POST /v2/bot/coupon` Create a new coupon. The request includes metadata such as the coupon title, description, image URLs, validity period, reward details(e.g. 1000yen discount), acquisition requirements, time zone, etc. - `GET /v2/bot/coupon` Retrieve a list of coupons associated with the bot. - `GET /v2/bot/coupon/{couponId}` Fetch detailed information about a specific coupon. - `PUT /v2/bot/coupon/{couponId}` Mark a coupon as expired. ## Messaging API Update Message Object now supports a new type: `type=coupon` This allows developers to send coupons directly to users via the Messaging API, similar to sending text, image, or template messages. ## Example Requests ### Create a Coupon ``` POST /v2/bot/coupon Content-Type: application/json ``` #### Request body ```json { "title": "1000 yen off coupon", "acquisitionCondition": { "type": "normal" }, "visibility": "PUBLIC", "startTimestamp": 1672537600, "endTimestamp": 1672624000, "maxUseCountPerTicket": 1, "reward": { "type": "discount", "priceInfo": { "priceInfoType": "fixed", "fixedAmount": 1000 } }, "imageUrl": "https://example.com/coupon_image.png", "barcodeImageUrl": "https://example.com/coupon_barcode.png", "timezone": "ASIA_TOKYO" } ``` #### Response ```json { "couponId": "abc1234" } ``` ### Send a Coupon Message ```json { "to": "<userId>", "messages": [ { "type": "coupon", "couponId": "abc1234" } ] } ``` --------- Co-authored-by: github-actions <[email protected]> Co-authored-by: habara keigo <[email protected]>
1 parent 4e7042b commit 70cde7f

File tree

86 files changed

+5496
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+5496
-1
lines changed

lib/line/bot/v2/messaging_api/.openapi-generator/FILES

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
api/messaging_api_blob_client.rb
33
api/messaging_api_client.rb
44
core.rb
5+
model/acquisition_condition_request.rb
6+
model/acquisition_condition_response.rb
57
model/action.rb
68
model/age_demographic.rb
79
model/age_demographic_filter.rb
@@ -20,13 +22,44 @@ model/camera_action.rb
2022
model/camera_roll_action.rb
2123
model/carousel_column.rb
2224
model/carousel_template.rb
25+
model/cash_back_fixed_price_info_request.rb
26+
model/cash_back_fixed_price_info_response.rb
27+
model/cash_back_percentage_price_info_request.rb
28+
model/cash_back_percentage_price_info_response.rb
29+
model/cash_back_price_info_request.rb
30+
model/cash_back_price_info_response.rb
2331
model/chat_reference.rb
2432
model/clipboard_action.rb
2533
model/clipboard_imagemap_action.rb
2634
model/confirm_template.rb
35+
model/coupon_cash_back_reward_request.rb
36+
model/coupon_cash_back_reward_response.rb
37+
model/coupon_create_request.rb
38+
model/coupon_create_response.rb
39+
model/coupon_discount_reward_request.rb
40+
model/coupon_discount_reward_response.rb
41+
model/coupon_free_reward_request.rb
42+
model/coupon_free_reward_response.rb
43+
model/coupon_gift_reward_request.rb
44+
model/coupon_gift_reward_response.rb
45+
model/coupon_list_response.rb
46+
model/coupon_message.rb
47+
model/coupon_others_reward_request.rb
48+
model/coupon_others_reward_response.rb
49+
model/coupon_response.rb
50+
model/coupon_reward_request.rb
51+
model/coupon_reward_response.rb
2752
model/create_rich_menu_alias_request.rb
2853
model/datetime_picker_action.rb
2954
model/demographic_filter.rb
55+
model/discount_explicit_price_info_request.rb
56+
model/discount_explicit_price_info_response.rb
57+
model/discount_fixed_price_info_request.rb
58+
model/discount_fixed_price_info_response.rb
59+
model/discount_percentage_price_info_request.rb
60+
model/discount_percentage_price_info_response.rb
61+
model/discount_price_info_request.rb
62+
model/discount_price_info_response.rb
3063
model/emoji.rb
3164
model/emoji_substitution_object.rb
3265
model/error_detail.rb
@@ -85,6 +118,8 @@ model/issue_link_token_response.rb
85118
model/limit.rb
86119
model/location_action.rb
87120
model/location_message.rb
121+
model/lottery_acquisition_condition_request.rb
122+
model/lottery_acquisition_condition_response.rb
88123
model/mark_messages_as_read_request.rb
89124
model/members_ids_response.rb
90125
model/membership.rb
@@ -95,9 +130,12 @@ model/message.rb
95130
model/message_action.rb
96131
model/message_imagemap_action.rb
97132
model/message_quota_response.rb
133+
model/messaging_api_pager_coupon_list_response.rb
98134
model/multicast_request.rb
99135
model/narrowcast_progress_response.rb
100136
model/narrowcast_request.rb
137+
model/normal_acquisition_condition_request.rb
138+
model/normal_acquisition_condition_response.rb
101139
model/number_of_messages_response.rb
102140
model/operator_demographic_filter.rb
103141
model/operator_recipient.rb
@@ -111,6 +149,7 @@ model/quota_consumption_response.rb
111149
model/quota_type.rb
112150
model/recipient.rb
113151
model/redelivery_recipient.rb
152+
model/referral_acquisition_condition_response.rb
114153
model/reply_message_request.rb
115154
model/reply_message_response.rb
116155
model/rich_menu_alias_list_response.rb

lib/line/bot/v2/messaging_api/api/messaging_api_client.rb

Lines changed: 269 additions & 0 deletions
Large diffs are not rendered by default.

lib/line/bot/v2/messaging_api/core.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
# Do not edit the class manually.
1010

1111
# Models
12+
require_relative './model/acquisition_condition_request'
13+
require_relative './model/acquisition_condition_response'
1214
require_relative './model/action'
1315
require_relative './model/age_demographic'
1416
require_relative './model/age_demographic_filter'
@@ -27,13 +29,44 @@
2729
require_relative './model/camera_roll_action'
2830
require_relative './model/carousel_column'
2931
require_relative './model/carousel_template'
32+
require_relative './model/cash_back_fixed_price_info_request'
33+
require_relative './model/cash_back_fixed_price_info_response'
34+
require_relative './model/cash_back_percentage_price_info_request'
35+
require_relative './model/cash_back_percentage_price_info_response'
36+
require_relative './model/cash_back_price_info_request'
37+
require_relative './model/cash_back_price_info_response'
3038
require_relative './model/chat_reference'
3139
require_relative './model/clipboard_action'
3240
require_relative './model/clipboard_imagemap_action'
3341
require_relative './model/confirm_template'
42+
require_relative './model/coupon_cash_back_reward_request'
43+
require_relative './model/coupon_cash_back_reward_response'
44+
require_relative './model/coupon_create_request'
45+
require_relative './model/coupon_create_response'
46+
require_relative './model/coupon_discount_reward_request'
47+
require_relative './model/coupon_discount_reward_response'
48+
require_relative './model/coupon_free_reward_request'
49+
require_relative './model/coupon_free_reward_response'
50+
require_relative './model/coupon_gift_reward_request'
51+
require_relative './model/coupon_gift_reward_response'
52+
require_relative './model/coupon_list_response'
53+
require_relative './model/coupon_message'
54+
require_relative './model/coupon_others_reward_request'
55+
require_relative './model/coupon_others_reward_response'
56+
require_relative './model/coupon_response'
57+
require_relative './model/coupon_reward_request'
58+
require_relative './model/coupon_reward_response'
3459
require_relative './model/create_rich_menu_alias_request'
3560
require_relative './model/datetime_picker_action'
3661
require_relative './model/demographic_filter'
62+
require_relative './model/discount_explicit_price_info_request'
63+
require_relative './model/discount_explicit_price_info_response'
64+
require_relative './model/discount_fixed_price_info_request'
65+
require_relative './model/discount_fixed_price_info_response'
66+
require_relative './model/discount_percentage_price_info_request'
67+
require_relative './model/discount_percentage_price_info_response'
68+
require_relative './model/discount_price_info_request'
69+
require_relative './model/discount_price_info_response'
3770
require_relative './model/emoji'
3871
require_relative './model/emoji_substitution_object'
3972
require_relative './model/error_detail'
@@ -92,6 +125,8 @@
92125
require_relative './model/limit'
93126
require_relative './model/location_action'
94127
require_relative './model/location_message'
128+
require_relative './model/lottery_acquisition_condition_request'
129+
require_relative './model/lottery_acquisition_condition_response'
95130
require_relative './model/mark_messages_as_read_request'
96131
require_relative './model/members_ids_response'
97132
require_relative './model/membership'
@@ -102,9 +137,12 @@
102137
require_relative './model/message_action'
103138
require_relative './model/message_imagemap_action'
104139
require_relative './model/message_quota_response'
140+
require_relative './model/messaging_api_pager_coupon_list_response'
105141
require_relative './model/multicast_request'
106142
require_relative './model/narrowcast_progress_response'
107143
require_relative './model/narrowcast_request'
144+
require_relative './model/normal_acquisition_condition_request'
145+
require_relative './model/normal_acquisition_condition_response'
108146
require_relative './model/number_of_messages_response'
109147
require_relative './model/operator_demographic_filter'
110148
require_relative './model/operator_recipient'
@@ -118,6 +156,7 @@
118156
require_relative './model/quota_type'
119157
require_relative './model/recipient'
120158
require_relative './model/redelivery_recipient'
159+
require_relative './model/referral_acquisition_condition_response'
121160
require_relative './model/reply_message_request'
122161
require_relative './model/reply_message_response'
123162
require_relative './model/rich_menu_alias_list_response'
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# LINE Messaging API
2+
# This document describes LINE Messaging API.
3+
#
4+
# The version of the OpenAPI document: 0.0.1
5+
#
6+
# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
7+
# https://openapi-generator.tech
8+
# Do not edit the class manually.
9+
10+
module Line
11+
module Bot
12+
module V2
13+
module MessagingApi
14+
class AcquisitionConditionRequest
15+
# @!attribute [rw] type
16+
# @return [String] Determines how the coupon is distributed or used.
17+
attr_accessor :type
18+
19+
# @param type [String] Determines how the coupon is distributed or used.
20+
def initialize(
21+
type:,
22+
**dynamic_attributes
23+
)
24+
25+
@type = type
26+
27+
dynamic_attributes.each do |key, value|
28+
self.class.attr_accessor key
29+
30+
if value.is_a?(Hash)
31+
struct_klass = Struct.new(*value.keys.map(&:to_sym))
32+
struct_values = value.map { |_k, v| v.is_a?(Hash) ? Line::Bot::V2::Utils.hash_to_struct(v) : v }
33+
instance_variable_set("@#{key}", struct_klass.new(*struct_values))
34+
else
35+
instance_variable_set("@#{key}", value)
36+
end
37+
end
38+
end
39+
40+
# Create an instance of the class from a hash
41+
# @param args [Hash] Hash containing all the required attributes
42+
# @return [Line::Bot::V2::MessagingApi::AcquisitionConditionRequest] Instance of the class
43+
def self.create(args) # steep:ignore
44+
symbolized_args = Line::Bot::V2::Utils.deep_symbolize(args)
45+
klass = detect_class(type: symbolized_args[:type])
46+
return klass.new(**symbolized_args) if klass # steep:ignore
47+
return new(**symbolized_args) # steep:ignore
48+
end
49+
50+
# @param other [Object] Object to compare
51+
# @return [Boolean] true if the objects are equal, false otherwise
52+
def ==(other)
53+
return false unless self.class == other.class
54+
55+
instance_variables.all? do |var|
56+
instance_variable_get(var) == other.instance_variable_get(var)
57+
end
58+
end
59+
60+
# @return [Integer] Hash code of the object
61+
def hash
62+
[self.class, *instance_variables.map { |var| instance_variable_get(var) }].hash
63+
end
64+
65+
private
66+
67+
def self.detect_class(type:)
68+
{
69+
lottery: Line::Bot::V2::MessagingApi::LotteryAcquisitionConditionRequest,
70+
normal: Line::Bot::V2::MessagingApi::NormalAcquisitionConditionRequest,
71+
}[type.to_sym]
72+
end
73+
end
74+
end
75+
end
76+
end
77+
end
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# LINE Messaging API
2+
# This document describes LINE Messaging API.
3+
#
4+
# The version of the OpenAPI document: 0.0.1
5+
#
6+
# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
7+
# https://openapi-generator.tech
8+
# Do not edit the class manually.
9+
10+
module Line
11+
module Bot
12+
module V2
13+
module MessagingApi
14+
class AcquisitionConditionResponse
15+
# @!attribute [rw] type
16+
# @return [String] Determines how the coupon is distributed or used.
17+
attr_accessor :type
18+
19+
# @param type [String] Determines how the coupon is distributed or used.
20+
def initialize(
21+
type:,
22+
**dynamic_attributes
23+
)
24+
25+
@type = type
26+
27+
dynamic_attributes.each do |key, value|
28+
self.class.attr_accessor key
29+
30+
if value.is_a?(Hash)
31+
struct_klass = Struct.new(*value.keys.map(&:to_sym))
32+
struct_values = value.map { |_k, v| v.is_a?(Hash) ? Line::Bot::V2::Utils.hash_to_struct(v) : v }
33+
instance_variable_set("@#{key}", struct_klass.new(*struct_values))
34+
else
35+
instance_variable_set("@#{key}", value)
36+
end
37+
end
38+
end
39+
40+
# Create an instance of the class from a hash
41+
# @param args [Hash] Hash containing all the required attributes
42+
# @return [Line::Bot::V2::MessagingApi::AcquisitionConditionResponse] Instance of the class
43+
def self.create(args) # steep:ignore
44+
symbolized_args = Line::Bot::V2::Utils.deep_symbolize(args)
45+
klass = detect_class(type: symbolized_args[:type])
46+
return klass.new(**symbolized_args) if klass # steep:ignore
47+
return new(**symbolized_args) # steep:ignore
48+
end
49+
50+
# @param other [Object] Object to compare
51+
# @return [Boolean] true if the objects are equal, false otherwise
52+
def ==(other)
53+
return false unless self.class == other.class
54+
55+
instance_variables.all? do |var|
56+
instance_variable_get(var) == other.instance_variable_get(var)
57+
end
58+
end
59+
60+
# @return [Integer] Hash code of the object
61+
def hash
62+
[self.class, *instance_variables.map { |var| instance_variable_get(var) }].hash
63+
end
64+
65+
private
66+
67+
def self.detect_class(type:)
68+
{
69+
lottery: Line::Bot::V2::MessagingApi::LotteryAcquisitionConditionResponse,
70+
normal: Line::Bot::V2::MessagingApi::NormalAcquisitionConditionResponse,
71+
referral: Line::Bot::V2::MessagingApi::ReferralAcquisitionConditionResponse,
72+
}[type.to_sym]
73+
end
74+
end
75+
end
76+
end
77+
end
78+
end
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# LINE Messaging API
2+
# This document describes LINE Messaging API.
3+
#
4+
# The version of the OpenAPI document: 0.0.1
5+
#
6+
# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
7+
# https://openapi-generator.tech
8+
# Do not edit the class manually.
9+
10+
require_relative './cash_back_price_info_request'
11+
12+
module Line
13+
module Bot
14+
module V2
15+
module MessagingApi
16+
class CashBackFixedPriceInfoRequest < CashBackPriceInfoRequest
17+
# @!attribute [r] type
18+
# @return [String]
19+
attr_reader :type
20+
# @!attribute [rw] fixed_amount
21+
# @return [Integer,nil]
22+
attr_accessor :fixed_amount
23+
24+
# @param fixed_amount [Integer,nil]
25+
def initialize(
26+
fixed_amount: nil,
27+
**dynamic_attributes
28+
)
29+
@type = "fixed"
30+
31+
@fixed_amount = fixed_amount
32+
33+
dynamic_attributes.each do |key, value|
34+
self.class.attr_accessor key
35+
36+
if value.is_a?(Hash)
37+
struct_klass = Struct.new(*value.keys.map(&:to_sym))
38+
struct_values = value.map { |_k, v| v.is_a?(Hash) ? Line::Bot::V2::Utils.hash_to_struct(v) : v }
39+
instance_variable_set("@#{key}", struct_klass.new(*struct_values))
40+
else
41+
instance_variable_set("@#{key}", value)
42+
end
43+
end
44+
end
45+
46+
# Create an instance of the class from a hash
47+
# @param args [Hash] Hash containing all the required attributes
48+
# @return [Line::Bot::V2::MessagingApi::CashBackFixedPriceInfoRequest] Instance of the class
49+
def self.create(args) # steep:ignore
50+
symbolized_args = Line::Bot::V2::Utils.deep_symbolize(args)
51+
return new(**symbolized_args) # steep:ignore
52+
end
53+
54+
# @param other [Object] Object to compare
55+
# @return [Boolean] true if the objects are equal, false otherwise
56+
def ==(other)
57+
return false unless self.class == other.class
58+
59+
instance_variables.all? do |var|
60+
instance_variable_get(var) == other.instance_variable_get(var)
61+
end
62+
end
63+
64+
# @return [Integer] Hash code of the object
65+
def hash
66+
[self.class, *instance_variables.map { |var| instance_variable_get(var) }].hash
67+
end
68+
end
69+
end
70+
end
71+
end
72+
end

0 commit comments

Comments
 (0)