dodopayments 1.51.1 → 1.52.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +1 -1
  4. data/lib/dodopayments/client.rb +8 -0
  5. data/lib/dodopayments/models/add_meter_to_price.rb +58 -0
  6. data/lib/dodopayments/models/event.rb +71 -0
  7. data/lib/dodopayments/models/event_input.rb +70 -0
  8. data/lib/dodopayments/models/invoices/payment_retrieve_refund_params.rb +16 -0
  9. data/lib/dodopayments/models/meter.rb +88 -0
  10. data/lib/dodopayments/models/meter_aggregation.rb +40 -0
  11. data/lib/dodopayments/models/meter_archive_params.rb +14 -0
  12. data/lib/dodopayments/models/meter_create_params.rb +62 -0
  13. data/lib/dodopayments/models/meter_filter.rb +482 -0
  14. data/lib/dodopayments/models/meter_list_params.rb +38 -0
  15. data/lib/dodopayments/models/{product_delete_params.rb → meter_retrieve_params.rb} +2 -2
  16. data/lib/dodopayments/models/meter_unarchive_params.rb +14 -0
  17. data/lib/dodopayments/models/price.rb +122 -7
  18. data/lib/dodopayments/models/product.rb +2 -2
  19. data/lib/dodopayments/models/product_archive_params.rb +14 -0
  20. data/lib/dodopayments/models/product_create_params.rb +2 -2
  21. data/lib/dodopayments/models/product_list_response.rb +2 -2
  22. data/lib/dodopayments/models/product_update_params.rb +2 -2
  23. data/lib/dodopayments/models/subscription_retrieve_usage_history_params.rb +54 -0
  24. data/lib/dodopayments/models/subscription_retrieve_usage_history_response.rb +101 -0
  25. data/lib/dodopayments/models/usage_event_ingest_params.rb +22 -0
  26. data/lib/dodopayments/models/usage_event_ingest_response.rb +16 -0
  27. data/lib/dodopayments/models/usage_event_list_params.rb +75 -0
  28. data/lib/dodopayments/models/usage_event_retrieve_params.rb +14 -0
  29. data/lib/dodopayments/models.rb +32 -2
  30. data/lib/dodopayments/resources/invoices/payments.rb +18 -0
  31. data/lib/dodopayments/resources/meters.rb +123 -0
  32. data/lib/dodopayments/resources/products.rb +5 -5
  33. data/lib/dodopayments/resources/subscriptions.rb +74 -0
  34. data/lib/dodopayments/resources/usage_events.rb +193 -0
  35. data/lib/dodopayments/version.rb +1 -1
  36. data/lib/dodopayments.rb +21 -1
  37. data/rbi/dodopayments/client.rbi +6 -0
  38. data/rbi/dodopayments/models/add_meter_to_price.rbi +75 -0
  39. data/rbi/dodopayments/models/event.rbi +88 -0
  40. data/rbi/dodopayments/models/event_input.rbi +102 -0
  41. data/rbi/dodopayments/models/invoices/payment_retrieve_refund_params.rbi +34 -0
  42. data/rbi/dodopayments/models/meter.rbi +107 -0
  43. data/rbi/dodopayments/models/meter_aggregation.rbi +73 -0
  44. data/rbi/dodopayments/models/meter_archive_params.rbi +32 -0
  45. data/rbi/dodopayments/models/meter_create_params.rbi +92 -0
  46. data/rbi/dodopayments/models/meter_filter.rbi +1042 -0
  47. data/rbi/dodopayments/models/meter_list_params.rbi +68 -0
  48. data/rbi/dodopayments/models/{product_delete_params.rbi → meter_retrieve_params.rbi} +2 -2
  49. data/rbi/dodopayments/models/meter_unarchive_params.rbi +32 -0
  50. data/rbi/dodopayments/models/price.rbi +153 -7
  51. data/rbi/dodopayments/models/product.rbi +2 -1
  52. data/rbi/dodopayments/models/product_archive_params.rbi +32 -0
  53. data/rbi/dodopayments/models/product_create_params.rbi +6 -3
  54. data/rbi/dodopayments/models/product_list_response.rbi +2 -1
  55. data/rbi/dodopayments/models/product_update_params.rbi +6 -3
  56. data/rbi/dodopayments/models/subscription_retrieve_usage_history_params.rbi +78 -0
  57. data/rbi/dodopayments/models/subscription_retrieve_usage_history_response.rbi +159 -0
  58. data/rbi/dodopayments/models/usage_event_ingest_params.rbi +46 -0
  59. data/rbi/dodopayments/models/usage_event_ingest_response.rbi +26 -0
  60. data/rbi/dodopayments/models/usage_event_list_params.rbi +119 -0
  61. data/rbi/dodopayments/models/usage_event_retrieve_params.rbi +32 -0
  62. data/rbi/dodopayments/models.rbi +33 -2
  63. data/rbi/dodopayments/resources/invoices/payments.rbi +9 -0
  64. data/rbi/dodopayments/resources/meters.rbi +102 -0
  65. data/rbi/dodopayments/resources/products.rbi +5 -3
  66. data/rbi/dodopayments/resources/subscriptions.rbi +74 -0
  67. data/rbi/dodopayments/resources/usage_events.rbi +175 -0
  68. data/sig/dodopayments/client.rbs +4 -0
  69. data/sig/dodopayments/models/add_meter_to_price.rbs +45 -0
  70. data/sig/dodopayments/models/event.rbs +53 -0
  71. data/sig/dodopayments/models/event_input.rbs +48 -0
  72. data/sig/dodopayments/models/invoices/payment_retrieve_refund_params.rbs +17 -0
  73. data/sig/dodopayments/models/meter.rbs +65 -0
  74. data/sig/dodopayments/models/meter_aggregation.rbs +36 -0
  75. data/sig/dodopayments/models/meter_archive_params.rbs +15 -0
  76. data/sig/dodopayments/models/meter_create_params.rbs +51 -0
  77. data/sig/dodopayments/models/meter_filter.rbs +417 -0
  78. data/sig/dodopayments/models/meter_list_params.rbs +38 -0
  79. data/sig/dodopayments/models/{product_delete_params.rbs → meter_retrieve_params.rbs} +2 -2
  80. data/sig/dodopayments/models/meter_unarchive_params.rbs +15 -0
  81. data/sig/dodopayments/models/price.rbs +88 -9
  82. data/sig/dodopayments/models/product_archive_params.rbs +15 -0
  83. data/sig/dodopayments/models/subscription_retrieve_usage_history_params.rbs +46 -0
  84. data/sig/dodopayments/models/subscription_retrieve_usage_history_response.rbs +82 -0
  85. data/sig/dodopayments/models/usage_event_ingest_params.rbs +24 -0
  86. data/sig/dodopayments/models/usage_event_ingest_response.rbs +13 -0
  87. data/sig/dodopayments/models/usage_event_list_params.rbs +70 -0
  88. data/sig/dodopayments/models/usage_event_retrieve_params.rbs +15 -0
  89. data/sig/dodopayments/models.rbs +32 -2
  90. data/sig/dodopayments/resources/invoices/payments.rbs +5 -0
  91. data/sig/dodopayments/resources/meters.rbs +39 -0
  92. data/sig/dodopayments/resources/products.rbs +1 -1
  93. data/sig/dodopayments/resources/subscriptions.rbs +10 -0
  94. data/sig/dodopayments/resources/usage_events.rbs +28 -0
  95. metadata +65 -5
@@ -0,0 +1,46 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Models
5
+ class UsageEventIngestParams < Dodopayments::Internal::Type::BaseModel
6
+ extend Dodopayments::Internal::Type::RequestParameters::Converter
7
+ include Dodopayments::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(
12
+ Dodopayments::UsageEventIngestParams,
13
+ Dodopayments::Internal::AnyHash
14
+ )
15
+ end
16
+
17
+ # List of events to be pushed
18
+ sig { returns(T::Array[Dodopayments::EventInput]) }
19
+ attr_accessor :events
20
+
21
+ sig do
22
+ params(
23
+ events: T::Array[Dodopayments::EventInput::OrHash],
24
+ request_options: Dodopayments::RequestOptions::OrHash
25
+ ).returns(T.attached_class)
26
+ end
27
+ def self.new(
28
+ # List of events to be pushed
29
+ events:,
30
+ request_options: {}
31
+ )
32
+ end
33
+
34
+ sig do
35
+ override.returns(
36
+ {
37
+ events: T::Array[Dodopayments::EventInput],
38
+ request_options: Dodopayments::RequestOptions
39
+ }
40
+ )
41
+ end
42
+ def to_hash
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,26 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Models
5
+ class UsageEventIngestResponse < Dodopayments::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(
9
+ Dodopayments::Models::UsageEventIngestResponse,
10
+ Dodopayments::Internal::AnyHash
11
+ )
12
+ end
13
+
14
+ sig { returns(Integer) }
15
+ attr_accessor :ingested_count
16
+
17
+ sig { params(ingested_count: Integer).returns(T.attached_class) }
18
+ def self.new(ingested_count:)
19
+ end
20
+
21
+ sig { override.returns({ ingested_count: Integer }) }
22
+ def to_hash
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,119 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Models
5
+ class UsageEventListParams < Dodopayments::Internal::Type::BaseModel
6
+ extend Dodopayments::Internal::Type::RequestParameters::Converter
7
+ include Dodopayments::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(
12
+ Dodopayments::UsageEventListParams,
13
+ Dodopayments::Internal::AnyHash
14
+ )
15
+ end
16
+
17
+ # Filter events by customer ID
18
+ sig { returns(T.nilable(String)) }
19
+ attr_reader :customer_id
20
+
21
+ sig { params(customer_id: String).void }
22
+ attr_writer :customer_id
23
+
24
+ # Filter events created before this timestamp
25
+ sig { returns(T.nilable(Time)) }
26
+ attr_reader :end_
27
+
28
+ sig { params(end_: Time).void }
29
+ attr_writer :end_
30
+
31
+ # Filter events by event name. If both event_name and meter_id are provided, they
32
+ # must match the meter's configured event_name
33
+ sig { returns(T.nilable(String)) }
34
+ attr_reader :event_name
35
+
36
+ sig { params(event_name: String).void }
37
+ attr_writer :event_name
38
+
39
+ # Filter events by meter ID. When provided, only events that match the meter's
40
+ # event_name and filter criteria will be returned
41
+ sig { returns(T.nilable(String)) }
42
+ attr_reader :meter_id
43
+
44
+ sig { params(meter_id: String).void }
45
+ attr_writer :meter_id
46
+
47
+ # Page number (0-based, default: 0)
48
+ sig { returns(T.nilable(Integer)) }
49
+ attr_reader :page_number
50
+
51
+ sig { params(page_number: Integer).void }
52
+ attr_writer :page_number
53
+
54
+ # Number of events to return per page (default: 10)
55
+ sig { returns(T.nilable(Integer)) }
56
+ attr_reader :page_size
57
+
58
+ sig { params(page_size: Integer).void }
59
+ attr_writer :page_size
60
+
61
+ # Filter events created after this timestamp
62
+ sig { returns(T.nilable(Time)) }
63
+ attr_reader :start
64
+
65
+ sig { params(start: Time).void }
66
+ attr_writer :start
67
+
68
+ sig do
69
+ params(
70
+ customer_id: String,
71
+ end_: Time,
72
+ event_name: String,
73
+ meter_id: String,
74
+ page_number: Integer,
75
+ page_size: Integer,
76
+ start: Time,
77
+ request_options: Dodopayments::RequestOptions::OrHash
78
+ ).returns(T.attached_class)
79
+ end
80
+ def self.new(
81
+ # Filter events by customer ID
82
+ customer_id: nil,
83
+ # Filter events created before this timestamp
84
+ end_: nil,
85
+ # Filter events by event name. If both event_name and meter_id are provided, they
86
+ # must match the meter's configured event_name
87
+ event_name: nil,
88
+ # Filter events by meter ID. When provided, only events that match the meter's
89
+ # event_name and filter criteria will be returned
90
+ meter_id: nil,
91
+ # Page number (0-based, default: 0)
92
+ page_number: nil,
93
+ # Number of events to return per page (default: 10)
94
+ page_size: nil,
95
+ # Filter events created after this timestamp
96
+ start: nil,
97
+ request_options: {}
98
+ )
99
+ end
100
+
101
+ sig do
102
+ override.returns(
103
+ {
104
+ customer_id: String,
105
+ end_: Time,
106
+ event_name: String,
107
+ meter_id: String,
108
+ page_number: Integer,
109
+ page_size: Integer,
110
+ start: Time,
111
+ request_options: Dodopayments::RequestOptions
112
+ }
113
+ )
114
+ end
115
+ def to_hash
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,32 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Models
5
+ class UsageEventRetrieveParams < Dodopayments::Internal::Type::BaseModel
6
+ extend Dodopayments::Internal::Type::RequestParameters::Converter
7
+ include Dodopayments::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(
12
+ Dodopayments::UsageEventRetrieveParams,
13
+ Dodopayments::Internal::AnyHash
14
+ )
15
+ end
16
+
17
+ sig do
18
+ params(request_options: Dodopayments::RequestOptions::OrHash).returns(
19
+ T.attached_class
20
+ )
21
+ end
22
+ def self.new(request_options: {})
23
+ end
24
+
25
+ sig do
26
+ override.returns({ request_options: Dodopayments::RequestOptions })
27
+ end
28
+ def to_hash
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,6 +1,8 @@
1
1
  # typed: strong
2
2
 
3
3
  module Dodopayments
4
+ AddMeterToPrice = Dodopayments::Models::AddMeterToPrice
5
+
4
6
  AddonCartResponseItem = Dodopayments::Models::AddonCartResponseItem
5
7
 
6
8
  AddonCreateParams = Dodopayments::Models::AddonCreateParams
@@ -88,6 +90,10 @@ module Dodopayments
88
90
 
89
91
  DisputeStatus = Dodopayments::Models::DisputeStatus
90
92
 
93
+ Event = Dodopayments::Models::Event
94
+
95
+ EventInput = Dodopayments::Models::EventInput
96
+
91
97
  GetDispute = Dodopayments::Models::GetDispute
92
98
 
93
99
  IntentStatus = Dodopayments::Models::IntentStatus
@@ -123,6 +129,22 @@ module Dodopayments
123
129
 
124
130
  LicenseValidateParams = Dodopayments::Models::LicenseValidateParams
125
131
 
132
+ Meter = Dodopayments::Models::Meter
133
+
134
+ MeterAggregation = Dodopayments::Models::MeterAggregation
135
+
136
+ MeterArchiveParams = Dodopayments::Models::MeterArchiveParams
137
+
138
+ MeterCreateParams = Dodopayments::Models::MeterCreateParams
139
+
140
+ MeterFilter = Dodopayments::Models::MeterFilter
141
+
142
+ MeterListParams = Dodopayments::Models::MeterListParams
143
+
144
+ MeterRetrieveParams = Dodopayments::Models::MeterRetrieveParams
145
+
146
+ MeterUnarchiveParams = Dodopayments::Models::MeterUnarchiveParams
147
+
126
148
  MiscListSupportedCountriesParams =
127
149
  Dodopayments::Models::MiscListSupportedCountriesParams
128
150
 
@@ -151,9 +173,9 @@ module Dodopayments
151
173
 
152
174
  Product = Dodopayments::Models::Product
153
175
 
154
- ProductCreateParams = Dodopayments::Models::ProductCreateParams
176
+ ProductArchiveParams = Dodopayments::Models::ProductArchiveParams
155
177
 
156
- ProductDeleteParams = Dodopayments::Models::ProductDeleteParams
178
+ ProductCreateParams = Dodopayments::Models::ProductCreateParams
157
179
 
158
180
  ProductListParams = Dodopayments::Models::ProductListParams
159
181
 
@@ -190,6 +212,9 @@ module Dodopayments
190
212
 
191
213
  SubscriptionRetrieveParams = Dodopayments::Models::SubscriptionRetrieveParams
192
214
 
215
+ SubscriptionRetrieveUsageHistoryParams =
216
+ Dodopayments::Models::SubscriptionRetrieveUsageHistoryParams
217
+
193
218
  SubscriptionStatus = Dodopayments::Models::SubscriptionStatus
194
219
 
195
220
  SubscriptionUpdateParams = Dodopayments::Models::SubscriptionUpdateParams
@@ -198,6 +223,12 @@ module Dodopayments
198
223
 
199
224
  TimeInterval = Dodopayments::Models::TimeInterval
200
225
 
226
+ UsageEventIngestParams = Dodopayments::Models::UsageEventIngestParams
227
+
228
+ UsageEventListParams = Dodopayments::Models::UsageEventListParams
229
+
230
+ UsageEventRetrieveParams = Dodopayments::Models::UsageEventRetrieveParams
231
+
201
232
  WebhookCreateParams = Dodopayments::Models::WebhookCreateParams
202
233
 
203
234
  WebhookDeleteParams = Dodopayments::Models::WebhookDeleteParams
@@ -13,6 +13,15 @@ module Dodopayments
13
13
  def retrieve(payment_id, request_options: {})
14
14
  end
15
15
 
16
+ sig do
17
+ params(
18
+ refund_id: String,
19
+ request_options: Dodopayments::RequestOptions::OrHash
20
+ ).returns(StringIO)
21
+ end
22
+ def retrieve_refund(refund_id, request_options: {})
23
+ end
24
+
16
25
  # @api private
17
26
  sig { params(client: Dodopayments::Client).returns(T.attached_class) }
18
27
  def self.new(client:)
@@ -0,0 +1,102 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Resources
5
+ class Meters
6
+ sig do
7
+ params(
8
+ aggregation: Dodopayments::MeterAggregation::OrHash,
9
+ event_name: String,
10
+ measurement_unit: String,
11
+ name: String,
12
+ description: T.nilable(String),
13
+ filter: T.nilable(Dodopayments::MeterFilter::OrHash),
14
+ request_options: Dodopayments::RequestOptions::OrHash
15
+ ).returns(Dodopayments::Meter)
16
+ end
17
+ def create(
18
+ # Aggregation configuration for the meter
19
+ aggregation:,
20
+ # Event name to track
21
+ event_name:,
22
+ # measurement unit
23
+ measurement_unit:,
24
+ # Name of the meter
25
+ name:,
26
+ # Optional description of the meter
27
+ description: nil,
28
+ # Optional filter to apply to the meter
29
+ filter: nil,
30
+ request_options: {}
31
+ )
32
+ end
33
+
34
+ sig do
35
+ params(
36
+ id: String,
37
+ request_options: Dodopayments::RequestOptions::OrHash
38
+ ).returns(Dodopayments::Meter)
39
+ end
40
+ def retrieve(
41
+ # Meter ID
42
+ id,
43
+ request_options: {}
44
+ )
45
+ end
46
+
47
+ sig do
48
+ params(
49
+ archived: T::Boolean,
50
+ page_number: Integer,
51
+ page_size: Integer,
52
+ request_options: Dodopayments::RequestOptions::OrHash
53
+ ).returns(
54
+ Dodopayments::Internal::DefaultPageNumberPagination[
55
+ Dodopayments::Meter
56
+ ]
57
+ )
58
+ end
59
+ def list(
60
+ # List archived meters
61
+ archived: nil,
62
+ # Page number default is 0
63
+ page_number: nil,
64
+ # Page size default is 10 max is 100
65
+ page_size: nil,
66
+ request_options: {}
67
+ )
68
+ end
69
+
70
+ sig do
71
+ params(
72
+ id: String,
73
+ request_options: Dodopayments::RequestOptions::OrHash
74
+ ).void
75
+ end
76
+ def archive(
77
+ # Meter ID
78
+ id,
79
+ request_options: {}
80
+ )
81
+ end
82
+
83
+ sig do
84
+ params(
85
+ id: String,
86
+ request_options: Dodopayments::RequestOptions::OrHash
87
+ ).void
88
+ end
89
+ def unarchive(
90
+ # Meter ID
91
+ id,
92
+ request_options: {}
93
+ )
94
+ end
95
+
96
+ # @api private
97
+ sig { params(client: Dodopayments::Client).returns(T.attached_class) }
98
+ def self.new(client:)
99
+ end
100
+ end
101
+ end
102
+ end
@@ -11,7 +11,8 @@ module Dodopayments
11
11
  price:
12
12
  T.any(
13
13
  Dodopayments::Price::OneTimePrice::OrHash,
14
- Dodopayments::Price::RecurringPrice::OrHash
14
+ Dodopayments::Price::RecurringPrice::OrHash,
15
+ Dodopayments::Price::UsageBasedPrice::OrHash
15
16
  ),
16
17
  tax_category: Dodopayments::TaxCategory::OrSymbol,
17
18
  addons: T.nilable(T::Array[String]),
@@ -97,7 +98,8 @@ module Dodopayments
97
98
  T.nilable(
98
99
  T.any(
99
100
  Dodopayments::Price::OneTimePrice::OrHash,
100
- Dodopayments::Price::RecurringPrice::OrHash
101
+ Dodopayments::Price::RecurringPrice::OrHash,
102
+ Dodopayments::Price::UsageBasedPrice::OrHash
101
103
  )
102
104
  ),
103
105
  tax_category: T.nilable(Dodopayments::TaxCategory::OrSymbol),
@@ -186,7 +188,7 @@ module Dodopayments
186
188
  request_options: Dodopayments::RequestOptions::OrHash
187
189
  ).void
188
190
  end
189
- def delete(id, request_options: {})
191
+ def archive(id, request_options: {})
190
192
  end
191
193
 
192
194
  sig do
@@ -210,6 +210,80 @@ module Dodopayments
210
210
  )
211
211
  end
212
212
 
213
+ # Get detailed usage history for a subscription that includes usage-based billing
214
+ # (metered components). This endpoint provides insights into customer usage
215
+ # patterns and billing calculations over time.
216
+ #
217
+ # ## What You'll Get:
218
+ #
219
+ # - **Billing periods**: Each item represents a billing cycle with start and end
220
+ # dates
221
+ # - **Meter usage**: Detailed breakdown of usage for each meter configured on the
222
+ # subscription
223
+ # - **Usage calculations**: Total units consumed, free threshold units, and
224
+ # chargeable units
225
+ # - **Historical tracking**: Complete audit trail of usage-based charges
226
+ #
227
+ # ## Use Cases:
228
+ #
229
+ # - **Customer support**: Investigate billing questions and usage discrepancies
230
+ # - **Usage analytics**: Analyze customer consumption patterns over time
231
+ # - **Billing transparency**: Provide customers with detailed usage breakdowns
232
+ # - **Revenue optimization**: Identify usage trends to optimize pricing strategies
233
+ #
234
+ # ## Filtering Options:
235
+ #
236
+ # - **Date range filtering**: Get usage history for specific time periods
237
+ # - **Meter-specific filtering**: Focus on usage for a particular meter
238
+ # - **Pagination**: Navigate through large usage histories efficiently
239
+ #
240
+ # ## Important Notes:
241
+ #
242
+ # - Only returns data for subscriptions with usage-based (metered) components
243
+ # - Usage history is organized by billing periods (subscription cycles)
244
+ # - Free threshold units are calculated and displayed separately from chargeable
245
+ # units
246
+ # - Historical data is preserved even if meter configurations change
247
+ #
248
+ # ## Example Query Patterns:
249
+ #
250
+ # - Get last 3 months:
251
+ # `?start_date=2024-01-01T00:00:00Z&end_date=2024-03-31T23:59:59Z`
252
+ # - Filter by meter: `?meter_id=mtr_api_requests`
253
+ # - Paginate results: `?page_size=20&page_number=1`
254
+ # - Recent usage: `?start_date=2024-03-01T00:00:00Z` (from March 1st to now)
255
+ sig do
256
+ params(
257
+ subscription_id: String,
258
+ end_date: T.nilable(Time),
259
+ meter_id: T.nilable(String),
260
+ page_number: T.nilable(Integer),
261
+ page_size: T.nilable(Integer),
262
+ start_date: T.nilable(Time),
263
+ request_options: Dodopayments::RequestOptions::OrHash
264
+ ).returns(
265
+ Dodopayments::Internal::DefaultPageNumberPagination[
266
+ Dodopayments::Models::SubscriptionRetrieveUsageHistoryResponse
267
+ ]
268
+ )
269
+ end
270
+ def retrieve_usage_history(
271
+ # Unique subscription identifier
272
+ subscription_id,
273
+ # Filter by end date (inclusive)
274
+ end_date: nil,
275
+ # Filter by specific meter ID
276
+ meter_id: nil,
277
+ # Page number (default: 0)
278
+ page_number: nil,
279
+ # Page size (default: 10, max: 100)
280
+ page_size: nil,
281
+ # Filter by start date (inclusive)
282
+ start_date: nil,
283
+ request_options: {}
284
+ )
285
+ end
286
+
213
287
  # @api private
214
288
  sig { params(client: Dodopayments::Client).returns(T.attached_class) }
215
289
  def self.new(client:)
@@ -0,0 +1,175 @@
1
+ # typed: strong
2
+
3
+ module Dodopayments
4
+ module Resources
5
+ class UsageEvents
6
+ # Fetch detailed information about a single event using its unique event ID. This
7
+ # endpoint is useful for:
8
+ #
9
+ # - Debugging specific event ingestion issues
10
+ # - Retrieving event details for customer support
11
+ # - Validating that events were processed correctly
12
+ # - Getting the complete metadata for an event
13
+ #
14
+ # ## Event ID Format:
15
+ #
16
+ # The event ID should be the same value that was provided during event ingestion
17
+ # via the `/events/ingest` endpoint. Event IDs are case-sensitive and must match
18
+ # exactly.
19
+ #
20
+ # ## Response Details:
21
+ #
22
+ # The response includes all event data including:
23
+ #
24
+ # - Complete metadata key-value pairs
25
+ # - Original timestamp (preserved from ingestion)
26
+ # - Customer and business association
27
+ # - Event name and processing information
28
+ #
29
+ # ## Example Usage:
30
+ #
31
+ # ```text
32
+ # GET /events/api_call_12345
33
+ # ```
34
+ sig do
35
+ params(
36
+ event_id: String,
37
+ request_options: Dodopayments::RequestOptions::OrHash
38
+ ).returns(Dodopayments::Event)
39
+ end
40
+ def retrieve(
41
+ # Unique event identifier (case-sensitive, must match the ID used during
42
+ # ingestion)
43
+ event_id,
44
+ request_options: {}
45
+ )
46
+ end
47
+
48
+ # Fetch events from your account with powerful filtering capabilities. This
49
+ # endpoint is ideal for:
50
+ #
51
+ # - Debugging event ingestion issues
52
+ # - Analyzing customer usage patterns
53
+ # - Building custom analytics dashboards
54
+ # - Auditing billing-related events
55
+ #
56
+ # ## Filtering Options:
57
+ #
58
+ # - **Customer filtering**: Filter by specific customer ID
59
+ # - **Event name filtering**: Filter by event type/name
60
+ # - **Meter-based filtering**: Use a meter ID to apply the meter's event name and
61
+ # filter criteria automatically
62
+ # - **Time range filtering**: Filter events within a specific date range
63
+ # - **Pagination**: Navigate through large result sets
64
+ #
65
+ # ## Meter Integration:
66
+ #
67
+ # When using `meter_id`, the endpoint automatically applies:
68
+ #
69
+ # - The meter's configured `event_name` filter
70
+ # - The meter's custom filter criteria (if any)
71
+ # - If you also provide `event_name`, it must match the meter's event name
72
+ #
73
+ # ## Example Queries:
74
+ #
75
+ # - Get all events for a customer: `?customer_id=cus_abc123`
76
+ # - Get API request events: `?event_name=api_request`
77
+ # - Get events from last 24 hours:
78
+ # `?start=2024-01-14T10:30:00Z&end=2024-01-15T10:30:00Z`
79
+ # - Get events with meter filtering: `?meter_id=mtr_xyz789`
80
+ # - Paginate results: `?page_size=50&page_number=2`
81
+ sig do
82
+ params(
83
+ customer_id: String,
84
+ end_: Time,
85
+ event_name: String,
86
+ meter_id: String,
87
+ page_number: Integer,
88
+ page_size: Integer,
89
+ start: Time,
90
+ request_options: Dodopayments::RequestOptions::OrHash
91
+ ).returns(
92
+ Dodopayments::Internal::DefaultPageNumberPagination[
93
+ Dodopayments::Event
94
+ ]
95
+ )
96
+ end
97
+ def list(
98
+ # Filter events by customer ID
99
+ customer_id: nil,
100
+ # Filter events created before this timestamp
101
+ end_: nil,
102
+ # Filter events by event name. If both event_name and meter_id are provided, they
103
+ # must match the meter's configured event_name
104
+ event_name: nil,
105
+ # Filter events by meter ID. When provided, only events that match the meter's
106
+ # event_name and filter criteria will be returned
107
+ meter_id: nil,
108
+ # Page number (0-based, default: 0)
109
+ page_number: nil,
110
+ # Number of events to return per page (default: 10)
111
+ page_size: nil,
112
+ # Filter events created after this timestamp
113
+ start: nil,
114
+ request_options: {}
115
+ )
116
+ end
117
+
118
+ # This endpoint allows you to ingest custom events that can be used for:
119
+ #
120
+ # - Usage-based billing and metering
121
+ # - Analytics and reporting
122
+ # - Customer behavior tracking
123
+ #
124
+ # ## Important Notes:
125
+ #
126
+ # - **Duplicate Prevention**:
127
+ # - Duplicate `event_id` values within the same request are rejected (entire
128
+ # request fails)
129
+ # - Subsequent requests with existing `event_id` values are ignored (idempotent
130
+ # behavior)
131
+ # - **Rate Limiting**: Maximum 1000 events per request
132
+ # - **Time Validation**: Events with timestamps older than 1 hour or more than 5
133
+ # minutes in the future will be rejected
134
+ # - **Metadata Limits**: Maximum 50 key-value pairs per event, keys max 100 chars,
135
+ # values max 500 chars
136
+ #
137
+ # ## Example Usage:
138
+ #
139
+ # ```json
140
+ # {
141
+ # "events": [
142
+ # {
143
+ # "event_id": "api_call_12345",
144
+ # "customer_id": "cus_abc123",
145
+ # "event_name": "api_request",
146
+ # "timestamp": "2024-01-15T10:30:00Z",
147
+ # "metadata": {
148
+ # "endpoint": "/api/v1/users",
149
+ # "method": "GET",
150
+ # "tokens_used": "150"
151
+ # }
152
+ # }
153
+ # ]
154
+ # }
155
+ # ```
156
+ sig do
157
+ params(
158
+ events: T::Array[Dodopayments::EventInput::OrHash],
159
+ request_options: Dodopayments::RequestOptions::OrHash
160
+ ).returns(Dodopayments::Models::UsageEventIngestResponse)
161
+ end
162
+ def ingest(
163
+ # List of events to be pushed
164
+ events:,
165
+ request_options: {}
166
+ )
167
+ end
168
+
169
+ # @api private
170
+ sig { params(client: Dodopayments::Client).returns(T.attached_class) }
171
+ def self.new(client:)
172
+ end
173
+ end
174
+ end
175
+ end