zyphr 0.1.67 → 0.1.69

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -0
  3. data/docs/AuthEmailVerificationApi.md +1 -1
  4. data/docs/AuthMagicLinksApi.md +5 -5
  5. data/docs/AuthPasswordResetApi.md +5 -5
  6. data/docs/AuthUserDirectoryApi.md +1 -1
  7. data/docs/ForgotPasswordRequest.md +3 -1
  8. data/docs/ForgotPasswordResult.md +20 -0
  9. data/docs/ForgotPasswordResultData.md +22 -0
  10. data/docs/InviteEndUser200ResponseData.md +2 -0
  11. data/docs/InviteEndUserRequest.md +3 -1
  12. data/docs/MagicLinkSendRequest.md +3 -1
  13. data/docs/MagicLinkSendResult.md +20 -0
  14. data/docs/MagicLinkSendResultData.md +20 -0
  15. data/docs/ResendEmailVerificationRequest.md +1 -1
  16. data/docs/ReturnedAuthLink.md +22 -0
  17. data/docs/SendEmailVerificationRequest.md +1 -1
  18. data/lib/zyphr/api/auth_email_verification_api.rb +2 -2
  19. data/lib/zyphr/api/auth_magic_links_api.rb +5 -5
  20. data/lib/zyphr/api/auth_password_reset_api.rb +5 -5
  21. data/lib/zyphr/api/auth_user_directory_api.rb +2 -2
  22. data/lib/zyphr/models/forgot_password_request.rb +16 -4
  23. data/lib/zyphr/models/forgot_password_result.rb +229 -0
  24. data/lib/zyphr/models/forgot_password_result_data.rb +275 -0
  25. data/lib/zyphr/models/invite_end_user200_response_data.rb +10 -1
  26. data/lib/zyphr/models/invite_end_user_request.rb +16 -4
  27. data/lib/zyphr/models/magic_link_send_request.rb +16 -4
  28. data/lib/zyphr/models/magic_link_send_result.rb +229 -0
  29. data/lib/zyphr/models/magic_link_send_result_data.rb +229 -0
  30. data/lib/zyphr/models/resend_email_verification_request.rb +1 -1
  31. data/lib/zyphr/models/returned_auth_link.rb +292 -0
  32. data/lib/zyphr/models/send_email_verification_request.rb +1 -1
  33. data/lib/zyphr.rb +5 -0
  34. data/spec/api/auth_email_verification_api_spec.rb +1 -1
  35. data/spec/api/auth_magic_links_api_spec.rb +2 -2
  36. data/spec/api/auth_password_reset_api_spec.rb +2 -2
  37. data/spec/api/auth_user_directory_api_spec.rb +1 -1
  38. data/spec/models/forgot_password_request_spec.rb +6 -0
  39. data/spec/models/forgot_password_result_data_spec.rb +52 -0
  40. data/spec/models/forgot_password_result_spec.rb +42 -0
  41. data/spec/models/invite_end_user200_response_data_spec.rb +6 -0
  42. data/spec/models/invite_end_user_request_spec.rb +6 -0
  43. data/spec/models/magic_link_send_request_spec.rb +6 -0
  44. data/spec/models/magic_link_send_result_data_spec.rb +42 -0
  45. data/spec/models/magic_link_send_result_spec.rb +42 -0
  46. data/spec/models/returned_auth_link_spec.rb +48 -0
  47. data/zyphr.gemspec +1 -1
  48. metadata +22 -2
@@ -0,0 +1,292 @@
1
+ =begin
2
+ #Zyphr API
3
+
4
+ #Zyphr is a developer platform for user authentication and transactional messaging. One API covers auth (passkeys, social sign-in, passwordless, MFA, sessions, organizations) plus email, push notifications, SMS, in-app messages, and webhooks. ## Authentication All API requests require authentication using an API key. Include your API key in the `X-API-Key` header: ``` X-API-Key: zy_live_xxxxxxxxxxxx ``` API keys can be created in the Zyphr Dashboard. > **Test keys are being retired.** `zy_test_*` keys are no longer issued, and existing ones stop working on **21 October 2026**. They never delivered mail — sends were mocked and marked sent without reaching a provider, so they could not verify domain authentication, rendering, or deliverability. To test your integration, use a `zy_live_*` key against a verified domain and send to an address you control. ## Rate Limiting The API implements rate limiting to ensure fair usage. Rate limit information is included in response headers: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Remaining requests in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets ## Account Sending Status Every authenticated response carries the account's current sending state so you can surface it in your own tooling without a separate call: - `X-Account-Sending-Status`: `active`, `throttled`, or `frozen` - `X-Account-Sending-Status-Reason`: human-readable reason (present only when the status is `throttled` or `frozen`) This header is informational and non-blocking on non-send endpoints (reads, billing, and deliverability stay available). Send-capable endpoints additionally enforce the state: a frozen account receives `403 account_frozen` and a throttled account receives `429 account_throttled`, both with the reason in the error message. ## Errors All errors follow a consistent format: ```json { \"error\": { \"code\": \"error_code\", \"message\": \"Human readable message\", \"details\": {} }, \"meta\": { \"request_id\": \"req_xxxx\" } } ```
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ Contact: support@zyphr.dev
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.12.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zyphr
17
+ # A sign-in, reset or invitation link returned instead of emailed (`return_link: true`). The token is a live, single-use credential: never log it or expose it to anyone but the end user.
18
+ class ReturnedAuthLink
19
+ # Your `redirect_url` with `?token=` appended — the same URL Zyphr's email would carry.
20
+ attr_accessor :url
21
+
22
+ # The raw token, redeemed at the matching endpoint (`/auth/magic-link/verify` or `/auth/reset-password`).
23
+ attr_accessor :token
24
+
25
+ attr_accessor :expires_at
26
+
27
+ # Attribute mapping from ruby-style variable name to JSON key.
28
+ def self.attribute_map
29
+ {
30
+ :'url' => :'url',
31
+ :'token' => :'token',
32
+ :'expires_at' => :'expires_at'
33
+ }
34
+ end
35
+
36
+ # Returns attribute mapping this model knows about
37
+ def self.acceptable_attribute_map
38
+ attribute_map
39
+ end
40
+
41
+ # Returns all the JSON keys this model knows about
42
+ def self.acceptable_attributes
43
+ acceptable_attribute_map.values
44
+ end
45
+
46
+ # Attribute type mapping.
47
+ def self.openapi_types
48
+ {
49
+ :'url' => :'String',
50
+ :'token' => :'String',
51
+ :'expires_at' => :'Time'
52
+ }
53
+ end
54
+
55
+ # List of attributes with nullable: true
56
+ def self.openapi_nullable
57
+ Set.new([
58
+ ])
59
+ end
60
+
61
+ # Initializes the object
62
+ # @param [Hash] attributes Model attributes in the form of hash
63
+ def initialize(attributes = {})
64
+ if (!attributes.is_a?(Hash))
65
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zyphr::ReturnedAuthLink` initialize method"
66
+ end
67
+
68
+ # check to see if the attribute exists and convert string to symbol for hash key
69
+ acceptable_attribute_map = self.class.acceptable_attribute_map
70
+ attributes = attributes.each_with_object({}) { |(k, v), h|
71
+ if (!acceptable_attribute_map.key?(k.to_sym))
72
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zyphr::ReturnedAuthLink`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
73
+ end
74
+ h[k.to_sym] = v
75
+ }
76
+
77
+ if attributes.key?(:'url')
78
+ self.url = attributes[:'url']
79
+ else
80
+ self.url = nil
81
+ end
82
+
83
+ if attributes.key?(:'token')
84
+ self.token = attributes[:'token']
85
+ else
86
+ self.token = nil
87
+ end
88
+
89
+ if attributes.key?(:'expires_at')
90
+ self.expires_at = attributes[:'expires_at']
91
+ else
92
+ self.expires_at = nil
93
+ end
94
+ end
95
+
96
+ # Show invalid properties with the reasons. Usually used together with valid?
97
+ # @return Array for valid properties with the reasons
98
+ def list_invalid_properties
99
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
100
+ invalid_properties = Array.new
101
+ if @url.nil?
102
+ invalid_properties.push('invalid value for "url", url cannot be nil.')
103
+ end
104
+
105
+ if @token.nil?
106
+ invalid_properties.push('invalid value for "token", token cannot be nil.')
107
+ end
108
+
109
+ if @expires_at.nil?
110
+ invalid_properties.push('invalid value for "expires_at", expires_at cannot be nil.')
111
+ end
112
+
113
+ invalid_properties
114
+ end
115
+
116
+ # Check to see if the all the properties in the model are valid
117
+ # @return true if the model is valid
118
+ def valid?
119
+ warn '[DEPRECATED] the `valid?` method is obsolete'
120
+ return false if @url.nil?
121
+ return false if @token.nil?
122
+ return false if @expires_at.nil?
123
+ true
124
+ end
125
+
126
+ # Custom attribute writer method with validation
127
+ # @param [Object] url Value to be assigned
128
+ def url=(url)
129
+ if url.nil?
130
+ fail ArgumentError, 'url cannot be nil'
131
+ end
132
+
133
+ @url = url
134
+ end
135
+
136
+ # Custom attribute writer method with validation
137
+ # @param [Object] token Value to be assigned
138
+ def token=(token)
139
+ if token.nil?
140
+ fail ArgumentError, 'token cannot be nil'
141
+ end
142
+
143
+ @token = token
144
+ end
145
+
146
+ # Custom attribute writer method with validation
147
+ # @param [Object] expires_at Value to be assigned
148
+ def expires_at=(expires_at)
149
+ if expires_at.nil?
150
+ fail ArgumentError, 'expires_at cannot be nil'
151
+ end
152
+
153
+ @expires_at = expires_at
154
+ end
155
+
156
+ # Checks equality by comparing each attribute.
157
+ # @param [Object] Object to be compared
158
+ def ==(o)
159
+ return true if self.equal?(o)
160
+ self.class == o.class &&
161
+ url == o.url &&
162
+ token == o.token &&
163
+ expires_at == o.expires_at
164
+ end
165
+
166
+ # @see the `==` method
167
+ # @param [Object] Object to be compared
168
+ def eql?(o)
169
+ self == o
170
+ end
171
+
172
+ # Calculates hash code according to all attributes.
173
+ # @return [Integer] Hash code
174
+ def hash
175
+ [url, token, expires_at].hash
176
+ end
177
+
178
+ # Builds the object from hash
179
+ # @param [Hash] attributes Model attributes in the form of hash
180
+ # @return [Object] Returns the model itself
181
+ def self.build_from_hash(attributes)
182
+ return nil unless attributes.is_a?(Hash)
183
+ attributes = attributes.transform_keys(&:to_sym)
184
+ transformed_hash = {}
185
+ openapi_types.each_pair do |key, type|
186
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
187
+ transformed_hash["#{key}"] = nil
188
+ elsif type =~ /\AArray<(.*)>/i
189
+ # check to ensure the input is an array given that the attribute
190
+ # is documented as an array but the input is not
191
+ if attributes[attribute_map[key]].is_a?(Array)
192
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
193
+ end
194
+ elsif !attributes[attribute_map[key]].nil?
195
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
196
+ end
197
+ end
198
+ new(transformed_hash)
199
+ end
200
+
201
+ # Deserializes the data based on type
202
+ # @param string type Data type
203
+ # @param string value Value to be deserialized
204
+ # @return [Object] Deserialized data
205
+ def self._deserialize(type, value)
206
+ case type.to_sym
207
+ when :Time
208
+ Time.parse(value)
209
+ when :Date
210
+ Date.parse(value)
211
+ when :String
212
+ value.to_s
213
+ when :Integer
214
+ value.to_i
215
+ when :Float
216
+ value.to_f
217
+ when :Boolean
218
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
219
+ true
220
+ else
221
+ false
222
+ end
223
+ when :Object
224
+ # generic object (usually a Hash), return directly
225
+ value
226
+ when /\AArray<(?<inner_type>.+)>\z/
227
+ inner_type = Regexp.last_match[:inner_type]
228
+ value.map { |v| _deserialize(inner_type, v) }
229
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
230
+ k_type = Regexp.last_match[:k_type]
231
+ v_type = Regexp.last_match[:v_type]
232
+ {}.tap do |hash|
233
+ value.each do |k, v|
234
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
235
+ end
236
+ end
237
+ else # model
238
+ # models (e.g. Pet) or oneOf
239
+ klass = Zyphr.const_get(type)
240
+ klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
241
+ end
242
+ end
243
+
244
+ # Returns the string representation of the object
245
+ # @return [String] String presentation of the object
246
+ def to_s
247
+ to_hash.to_s
248
+ end
249
+
250
+ # to_body is an alias to to_hash (backward compatibility)
251
+ # @return [Hash] Returns the object in the form of hash
252
+ def to_body
253
+ to_hash
254
+ end
255
+
256
+ # Returns the object in the form of hash
257
+ # @return [Hash] Returns the object in the form of hash
258
+ def to_hash
259
+ hash = {}
260
+ self.class.attribute_map.each_pair do |attr, param|
261
+ value = self.send(attr)
262
+ if value.nil?
263
+ is_nullable = self.class.openapi_nullable.include?(attr)
264
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
265
+ end
266
+
267
+ hash[param] = _to_hash(value)
268
+ end
269
+ hash
270
+ end
271
+
272
+ # Outputs non-array value in the form of hash
273
+ # For object, use to_hash. Otherwise, just return the value
274
+ # @param [Object] value Any valid value
275
+ # @return [Hash] Returns the value in the form of hash
276
+ def _to_hash(value)
277
+ if value.is_a?(Array)
278
+ value.compact.map { |v| _to_hash(v) }
279
+ elsif value.is_a?(Hash)
280
+ {}.tap do |hash|
281
+ value.each { |k, v| hash[k] = _to_hash(v) }
282
+ end
283
+ elsif value.respond_to? :to_hash
284
+ value.to_hash
285
+ else
286
+ value
287
+ end
288
+ end
289
+
290
+ end
291
+
292
+ end
@@ -15,7 +15,7 @@ require 'time'
15
15
 
16
16
  module Zyphr
17
17
  class SendEmailVerificationRequest
18
- # URL to redirect to after verification (snake_case `redirect_url` — a camelCase `redirectUrl` is ignored and the hosted verification page is used instead). Must match one of the application's configured redirect URIs.
18
+ # URL to redirect to after verification. Must be snake_case `redirect_url`: a camelCase `redirectUrl` is rejected with 400, since Zyphr hosts no fallback page. Must match one of the application's configured redirect URIs.
19
19
  attr_accessor :redirect_url
20
20
 
21
21
  # Attribute mapping from ruby-style variable name to JSON key.
data/lib/zyphr.rb CHANGED
@@ -138,6 +138,8 @@ require 'zyphr/models/execution_response'
138
138
  require 'zyphr/models/execution_retry_response'
139
139
  require 'zyphr/models/execution_retry_response_data'
140
140
  require 'zyphr/models/forgot_password_request'
141
+ require 'zyphr/models/forgot_password_result'
142
+ require 'zyphr/models/forgot_password_result_data'
141
143
  require 'zyphr/models/generate_subscriber_token200_response'
142
144
  require 'zyphr/models/generate_subscriber_token200_response_data'
143
145
  require 'zyphr/models/generate_subscriber_token_request'
@@ -191,6 +193,8 @@ require 'zyphr/models/list_workflows200_response'
191
193
  require 'zyphr/models/list_workflows200_response_meta'
192
194
  require 'zyphr/models/login_request'
193
195
  require 'zyphr/models/magic_link_send_request'
196
+ require 'zyphr/models/magic_link_send_result'
197
+ require 'zyphr/models/magic_link_send_result_data'
194
198
  require 'zyphr/models/magic_link_verify_request'
195
199
  require 'zyphr/models/magic_link_verify_response'
196
200
  require 'zyphr/models/magic_link_verify_response_data'
@@ -299,6 +303,7 @@ require 'zyphr/models/reset_password_request'
299
303
  require 'zyphr/models/reset_password_response'
300
304
  require 'zyphr/models/resubscribe_request'
301
305
  require 'zyphr/models/resubscribe_response'
306
+ require 'zyphr/models/returned_auth_link'
302
307
  require 'zyphr/models/revoke_all_sessions_response'
303
308
  require 'zyphr/models/revoke_all_sessions_response_data'
304
309
  require 'zyphr/models/revoke_session_request'
@@ -46,7 +46,7 @@ describe 'AuthEmailVerificationApi' do
46
46
 
47
47
  # unit tests for resend_email_verification
48
48
  # Resend email verification
49
- # Resend the verification email to the authenticated user. Rate limited to once per 60 seconds.
49
+ # Resend the verification email to the authenticated user. Rate limited to once per 60 seconds. Requires all three credentials simultaneously: the application key (&#x60;X-Application-Key&#x60;), the application secret (&#x60;X-Application-Secret&#x60;), and the end user&#39;s &#x60;Authorization: Bearer&#x60; token. Failures behave as on &#x60;POST /auth/verify-email/send&#x60;, including the 200 accepted-and-suppressed response for a recipient outside the application allowlist.
50
50
  # @param [Hash] opts the optional parameters
51
51
  # @option opts [ResendEmailVerificationRequest] :resend_email_verification_request
52
52
  # @return [SuccessResult]
@@ -34,10 +34,10 @@ describe 'AuthMagicLinksApi' do
34
34
 
35
35
  # unit tests for send_magic_link
36
36
  # Send a magic link
37
- # Send a magic link email for passwordless authentication.
37
+ # Send a magic link email for passwordless authentication. **Sending the email yourself:** pass &#x60;return_link: true&#x60; (with &#x60;redirect_url&#x60;) and Zyphr mints the link but sends nothing, returning it in &#x60;data.link&#x60;. Requires your application secret, so call it server-side only.
38
38
  # @param magic_link_send_request
39
39
  # @param [Hash] opts the optional parameters
40
- # @return [SuccessResult]
40
+ # @return [MagicLinkSendResult]
41
41
  describe 'send_magic_link test' do
42
42
  it 'should work' do
43
43
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -34,10 +34,10 @@ describe 'AuthPasswordResetApi' do
34
34
 
35
35
  # unit tests for forgot_password
36
36
  # Request a password reset
37
- # Request a password reset email. Creates a reset token and sends an email to the user. Always returns success to prevent email enumeration — the response is identical whether or not the address is registered. An identity with **no password set** still receives a link, which sets a first password. This covers users migrated from a provider that cannot export password hashes. The one case where no email is sent (beyond an unknown address) is an identity that has no password but *does* have another way in — a linked OAuth provider and/or a passkey. Those users are not locked out, so no set-password link is sent; the attempt is recorded as a suppressed message visible via &#x60;GET /emails&#x60;.
37
+ # Request a password reset email. Creates a reset token and sends an email to the user. Always returns success to prevent email enumeration — the response is identical whether or not the address is registered. An identity with **no password set** still receives a link, which sets a first password. This covers users migrated from a provider that cannot export password hashes. The one case where no email is sent (beyond an unknown address) is an identity that has no password but *does* have another way in — a linked OAuth provider and/or a passkey. Those users are not locked out, so no set-password link is sent; the attempt is recorded as a suppressed message visible via &#x60;GET /emails&#x60;. **Sending the email yourself:** pass &#x60;return_link: true&#x60; (with &#x60;redirect_url&#x60;) and Zyphr mints the token but sends nothing, returning the link in &#x60;data.link&#x60;. When no link is minted, &#x60;data.link&#x60; is null and &#x60;data.link_suppressed_reason&#x60; says why. Unlike the default response, this reveals whether the address is registered — acceptable only because the endpoint requires your application secret, so it must only be called server-side.
38
38
  # @param forgot_password_request
39
39
  # @param [Hash] opts the optional parameters
40
- # @return [SuccessResult]
40
+ # @return [ForgotPasswordResult]
41
41
  describe 'forgot_password test' do
42
42
  it 'should work' do
43
43
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -94,7 +94,7 @@ describe 'AuthUserDirectoryApi' do
94
94
 
95
95
  # unit tests for invite_end_user
96
96
  # Pre-provision (invite) an end user (server-side admin)
97
- # Secret-key-scoped pre-provisioning for an end user. Creates a passwordless user in the authenticating application (idempotent on email — an existing, non-deleted user is reused, not duplicated) and, when &#x60;send_link&#x60; is set, sends a first-login link so the user can set up their account without self-registration. - &#x60;send_link: \&quot;invitation\&quot;&#x60; sends the &#x60;invitation&#x60; auth email: a set-password link (valid 7 days) redeemed at &#x60;POST /auth/reset-password&#x60;, so the invitee ends up with a password. It has its own per-application template, separate from password reset&#39;s. Not sent to an identity that can already sign in. - &#x60;send_link: \&quot;password_reset\&quot;&#x60; sends a set-password email using the password-reset template. - &#x60;send_link: \&quot;magic\&quot;&#x60; sends a magic-link sign-in email. The user still has no credential afterwards. - &#x60;send_link: \&quot;none\&quot;&#x60; (default) creates the user with no email. A &#x60;redirect_url&#x60; is required whenever &#x60;send_link&#x60; is not \&quot;none\&quot;; it must match the application&#39;s redirect_uris allowlist (custom schemes such as yourapp://path are permitted).
97
+ # Secret-key-scoped pre-provisioning for an end user. Creates a passwordless user in the authenticating application (idempotent on email — an existing, non-deleted user is reused, not duplicated) and, when &#x60;send_link&#x60; is set, sends a first-login link so the user can set up their account without self-registration. - &#x60;send_link: \&quot;invitation\&quot;&#x60; sends the &#x60;invitation&#x60; auth email: a set-password link (valid 7 days) redeemed at &#x60;POST /auth/reset-password&#x60;, so the invitee ends up with a password. It has its own per-application template, separate from password reset&#39;s. Not sent to an identity that can already sign in. - &#x60;send_link: \&quot;password_reset\&quot;&#x60; sends a set-password email using the password-reset template. - &#x60;send_link: \&quot;magic\&quot;&#x60; sends a magic-link sign-in email. The user still has no credential afterwards. - &#x60;send_link: \&quot;none\&quot;&#x60; (default) creates the user with no email. A &#x60;redirect_url&#x60; is required whenever &#x60;send_link&#x60; is not \&quot;none\&quot;; it must match the application&#39;s redirect_uris allowlist (custom schemes such as yourapp://path are permitted). **Sending the email yourself:** pass &#x60;return_link: true&#x60; with a &#x60;send_link&#x60; and Zyphr mints that link but sends nothing, returning it in &#x60;data.link&#x60; (&#x60;link_sent&#x60; stays false). The same &#x60;link_suppressed_reason&#x60; values apply when no link can be minted.
98
98
  # @param invite_end_user_request
99
99
  # @param [Hash] opts the optional parameters
100
100
  # @return [InviteEndUser200Response]
@@ -39,4 +39,10 @@ describe Zyphr::ForgotPasswordRequest do
39
39
  end
40
40
  end
41
41
 
42
+ describe 'test attribute "return_link"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ end
46
+ end
47
+
42
48
  end
@@ -0,0 +1,52 @@
1
+ =begin
2
+ #Zyphr API
3
+
4
+ #Zyphr is a developer platform for user authentication and transactional messaging. One API covers auth (passkeys, social sign-in, passwordless, MFA, sessions, organizations) plus email, push notifications, SMS, in-app messages, and webhooks. ## Authentication All API requests require authentication using an API key. Include your API key in the `X-API-Key` header: ``` X-API-Key: zy_live_xxxxxxxxxxxx ``` API keys can be created in the Zyphr Dashboard. > **Test keys are being retired.** `zy_test_*` keys are no longer issued, and existing ones stop working on **21 October 2026**. They never delivered mail — sends were mocked and marked sent without reaching a provider, so they could not verify domain authentication, rendering, or deliverability. To test your integration, use a `zy_live_*` key against a verified domain and send to an address you control. ## Rate Limiting The API implements rate limiting to ensure fair usage. Rate limit information is included in response headers: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Remaining requests in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets ## Account Sending Status Every authenticated response carries the account's current sending state so you can surface it in your own tooling without a separate call: - `X-Account-Sending-Status`: `active`, `throttled`, or `frozen` - `X-Account-Sending-Status-Reason`: human-readable reason (present only when the status is `throttled` or `frozen`) This header is informational and non-blocking on non-send endpoints (reads, billing, and deliverability stay available). Send-capable endpoints additionally enforce the state: a frozen account receives `403 account_frozen` and a throttled account receives `429 account_throttled`, both with the reason in the error message. ## Errors All errors follow a consistent format: ```json { \"error\": { \"code\": \"error_code\", \"message\": \"Human readable message\", \"details\": {} }, \"meta\": { \"request_id\": \"req_xxxx\" } } ```
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ Contact: support@zyphr.dev
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.12.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zyphr::ForgotPasswordResultData
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zyphr::ForgotPasswordResultData do
21
+ let(:instance) { Zyphr::ForgotPasswordResultData.new }
22
+
23
+ describe 'test an instance of ForgotPasswordResultData' do
24
+ it 'should create an instance of ForgotPasswordResultData' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zyphr::ForgotPasswordResultData)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "success"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "link"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ describe 'test attribute "link_suppressed_reason"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["user_not_found", "identity_has_other_auth_methods"])
46
+ # validator.allowable_values.each do |value|
47
+ # expect { instance.link_suppressed_reason = value }.not_to raise_error
48
+ # end
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,42 @@
1
+ =begin
2
+ #Zyphr API
3
+
4
+ #Zyphr is a developer platform for user authentication and transactional messaging. One API covers auth (passkeys, social sign-in, passwordless, MFA, sessions, organizations) plus email, push notifications, SMS, in-app messages, and webhooks. ## Authentication All API requests require authentication using an API key. Include your API key in the `X-API-Key` header: ``` X-API-Key: zy_live_xxxxxxxxxxxx ``` API keys can be created in the Zyphr Dashboard. > **Test keys are being retired.** `zy_test_*` keys are no longer issued, and existing ones stop working on **21 October 2026**. They never delivered mail — sends were mocked and marked sent without reaching a provider, so they could not verify domain authentication, rendering, or deliverability. To test your integration, use a `zy_live_*` key against a verified domain and send to an address you control. ## Rate Limiting The API implements rate limiting to ensure fair usage. Rate limit information is included in response headers: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Remaining requests in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets ## Account Sending Status Every authenticated response carries the account's current sending state so you can surface it in your own tooling without a separate call: - `X-Account-Sending-Status`: `active`, `throttled`, or `frozen` - `X-Account-Sending-Status-Reason`: human-readable reason (present only when the status is `throttled` or `frozen`) This header is informational and non-blocking on non-send endpoints (reads, billing, and deliverability stay available). Send-capable endpoints additionally enforce the state: a frozen account receives `403 account_frozen` and a throttled account receives `429 account_throttled`, both with the reason in the error message. ## Errors All errors follow a consistent format: ```json { \"error\": { \"code\": \"error_code\", \"message\": \"Human readable message\", \"details\": {} }, \"meta\": { \"request_id\": \"req_xxxx\" } } ```
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ Contact: support@zyphr.dev
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.12.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zyphr::ForgotPasswordResult
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zyphr::ForgotPasswordResult do
21
+ let(:instance) { Zyphr::ForgotPasswordResult.new }
22
+
23
+ describe 'test an instance of ForgotPasswordResult' do
24
+ it 'should create an instance of ForgotPasswordResult' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zyphr::ForgotPasswordResult)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "data"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "meta"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ end
@@ -45,6 +45,12 @@ describe Zyphr::InviteEndUser200ResponseData do
45
45
  end
46
46
  end
47
47
 
48
+ describe 'test attribute "link"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ end
52
+ end
53
+
48
54
  describe 'test attribute "link_suppressed_reason"' do
49
55
  it 'should work' do
50
56
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -61,4 +61,10 @@ describe Zyphr::InviteEndUserRequest do
61
61
  end
62
62
  end
63
63
 
64
+ describe 'test attribute "return_link"' do
65
+ it 'should work' do
66
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
67
+ end
68
+ end
69
+
64
70
  end
@@ -39,4 +39,10 @@ describe Zyphr::MagicLinkSendRequest do
39
39
  end
40
40
  end
41
41
 
42
+ describe 'test attribute "return_link"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ end
46
+ end
47
+
42
48
  end
@@ -0,0 +1,42 @@
1
+ =begin
2
+ #Zyphr API
3
+
4
+ #Zyphr is a developer platform for user authentication and transactional messaging. One API covers auth (passkeys, social sign-in, passwordless, MFA, sessions, organizations) plus email, push notifications, SMS, in-app messages, and webhooks. ## Authentication All API requests require authentication using an API key. Include your API key in the `X-API-Key` header: ``` X-API-Key: zy_live_xxxxxxxxxxxx ``` API keys can be created in the Zyphr Dashboard. > **Test keys are being retired.** `zy_test_*` keys are no longer issued, and existing ones stop working on **21 October 2026**. They never delivered mail — sends were mocked and marked sent without reaching a provider, so they could not verify domain authentication, rendering, or deliverability. To test your integration, use a `zy_live_*` key against a verified domain and send to an address you control. ## Rate Limiting The API implements rate limiting to ensure fair usage. Rate limit information is included in response headers: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Remaining requests in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets ## Account Sending Status Every authenticated response carries the account's current sending state so you can surface it in your own tooling without a separate call: - `X-Account-Sending-Status`: `active`, `throttled`, or `frozen` - `X-Account-Sending-Status-Reason`: human-readable reason (present only when the status is `throttled` or `frozen`) This header is informational and non-blocking on non-send endpoints (reads, billing, and deliverability stay available). Send-capable endpoints additionally enforce the state: a frozen account receives `403 account_frozen` and a throttled account receives `429 account_throttled`, both with the reason in the error message. ## Errors All errors follow a consistent format: ```json { \"error\": { \"code\": \"error_code\", \"message\": \"Human readable message\", \"details\": {} }, \"meta\": { \"request_id\": \"req_xxxx\" } } ```
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ Contact: support@zyphr.dev
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.12.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zyphr::MagicLinkSendResultData
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zyphr::MagicLinkSendResultData do
21
+ let(:instance) { Zyphr::MagicLinkSendResultData.new }
22
+
23
+ describe 'test an instance of MagicLinkSendResultData' do
24
+ it 'should create an instance of MagicLinkSendResultData' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zyphr::MagicLinkSendResultData)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "success"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "link"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,42 @@
1
+ =begin
2
+ #Zyphr API
3
+
4
+ #Zyphr is a developer platform for user authentication and transactional messaging. One API covers auth (passkeys, social sign-in, passwordless, MFA, sessions, organizations) plus email, push notifications, SMS, in-app messages, and webhooks. ## Authentication All API requests require authentication using an API key. Include your API key in the `X-API-Key` header: ``` X-API-Key: zy_live_xxxxxxxxxxxx ``` API keys can be created in the Zyphr Dashboard. > **Test keys are being retired.** `zy_test_*` keys are no longer issued, and existing ones stop working on **21 October 2026**. They never delivered mail — sends were mocked and marked sent without reaching a provider, so they could not verify domain authentication, rendering, or deliverability. To test your integration, use a `zy_live_*` key against a verified domain and send to an address you control. ## Rate Limiting The API implements rate limiting to ensure fair usage. Rate limit information is included in response headers: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Remaining requests in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets ## Account Sending Status Every authenticated response carries the account's current sending state so you can surface it in your own tooling without a separate call: - `X-Account-Sending-Status`: `active`, `throttled`, or `frozen` - `X-Account-Sending-Status-Reason`: human-readable reason (present only when the status is `throttled` or `frozen`) This header is informational and non-blocking on non-send endpoints (reads, billing, and deliverability stay available). Send-capable endpoints additionally enforce the state: a frozen account receives `403 account_frozen` and a throttled account receives `429 account_throttled`, both with the reason in the error message. ## Errors All errors follow a consistent format: ```json { \"error\": { \"code\": \"error_code\", \"message\": \"Human readable message\", \"details\": {} }, \"meta\": { \"request_id\": \"req_xxxx\" } } ```
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ Contact: support@zyphr.dev
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.12.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zyphr::MagicLinkSendResult
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zyphr::MagicLinkSendResult do
21
+ let(:instance) { Zyphr::MagicLinkSendResult.new }
22
+
23
+ describe 'test an instance of MagicLinkSendResult' do
24
+ it 'should create an instance of MagicLinkSendResult' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zyphr::MagicLinkSendResult)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "data"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "meta"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ end