prelude-sdk 0.6.0 → 0.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc907faf5181de68a78b810ea7e8f112b9487a1509787ade20ee24a89ebb1e47
4
- data.tar.gz: 72ee64f891262d8b42dbf743563acf09d649090ac5b0e5b4a651ab3250228952
3
+ metadata.gz: 5c0ab52c77ef4b4adef294278608b900e799d87addb9838aa9d0f1b670cba4e3
4
+ data.tar.gz: 44b544a684b17f92a020198981d31f6013a43cc7d73b47c475f680529e332adb
5
5
  SHA512:
6
- metadata.gz: 92d9f3a4bc299dc75db670d6be40eeeadd34e2ee1d19c82197ea7217f05e3fed75f279a3e13f209dbfd129d190794d9a53f6cef584e32fa90e97fd30abfe06ee
7
- data.tar.gz: 360197b7fafbed000c76dc07e8b21dc81c8f46e869c193298da0ad51b71930ad6bb1ea5585f1d0570a1c3d2fd88c0a68984f54cacf6630a1c78a656465b632d5
6
+ metadata.gz: 73d77009ae1589ec192685756e1ab08475f561447e281ff9ce16104be9c64bd16dc8658a9563d10c8fff0d8bf1ebf48756c2545125ba6e7f2c65ba59f020514d
7
+ data.tar.gz: 97b509de3dbc882b0ba62e84e19d7aaf4a17219a9d689d6e3fa309d07685969e92ce049326640c9f06f2038e1f8e5d90433955e5e9f5e3dd0d75cc779253e381
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.0 (2026-09-15)
4
+
5
+ Full Changelog: [v0.6.0...v0.7.0](https://github.com/prelude-so/ruby-sdk/compare/v0.6.0...v0.7.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([ed39fec](https://github.com/prelude-so/ruby-sdk/commit/ed39fece4f1d8838d68d7596ab587b4aba76a14a))
10
+ * **api:** api update ([00dcf41](https://github.com/prelude-so/ruby-sdk/commit/00dcf41dcc28fe76ec0a112169c6d01da9937a53))
11
+ * **api:** api update ([ebb1d68](https://github.com/prelude-so/ruby-sdk/commit/ebb1d682d35d4fc0f6a403aa06b903481ccae8fe))
12
+
13
+
14
+ ### Chores
15
+
16
+ * **internal:** allow the mock server port to be set with STAINLESS_MOCK_PORT ([2c5f32b](https://github.com/prelude-so/ruby-sdk/commit/2c5f32b48b0859861875e96aceb3530daf400015))
17
+
3
18
  ## 0.6.0 (2026-08-07)
4
19
 
5
20
  Full Changelog: [v0.5.0...v0.6.0](https://github.com/prelude-so/ruby-sdk/compare/v0.5.0...v0.6.0)
data/README.md CHANGED
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
17
17
  <!-- x-release-please-start-version -->
18
18
 
19
19
  ```ruby
20
- gem "prelude-sdk", "~> 0.6.0"
20
+ gem "prelude-sdk", "~> 0.7.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -405,6 +405,16 @@ module PreludeSDK
405
405
  # @return [Symbol, PreludeSDK::Models::VerificationCreateParams::Signals::DevicePlatform, nil]
406
406
  optional :device_platform, enum: -> { PreludeSDK::VerificationCreateParams::Signals::DevicePlatform }
407
407
 
408
+ # @!attribute existing_user
409
+ # Whether the end-user already exists in your system, for example an existing
410
+ # account signing in again rather than a first-time signup. Unlike
411
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
412
+ # account as one additional anti-fraud signal. For more details, refer to
413
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
414
+ #
415
+ # @return [Boolean, nil]
416
+ optional :existing_user, PreludeSDK::Internal::Type::Boolean
417
+
408
418
  # @!attribute ip
409
419
  # The public IP v4 or v6 address of the end-user's device. You should collect this
410
420
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
@@ -444,7 +454,7 @@ module PreludeSDK
444
454
  # @return [String, nil]
445
455
  optional :user_agent, String
446
456
 
447
- # @!method initialize(app_version: nil, device_id: nil, device_model: nil, device_platform: nil, ip: nil, is_trusted_user: nil, ja4_fingerprint: nil, os_version: nil, user_agent: nil)
457
+ # @!method initialize(app_version: nil, device_id: nil, device_model: nil, device_platform: nil, existing_user: nil, ip: nil, is_trusted_user: nil, ja4_fingerprint: nil, os_version: nil, user_agent: nil)
448
458
  # Some parameter documentations has been truncated, see
449
459
  # {PreludeSDK::Models::VerificationCreateParams::Signals} for more details.
450
460
  #
@@ -459,6 +469,8 @@ module PreludeSDK
459
469
  #
460
470
  # @param device_platform [Symbol, PreludeSDK::Models::VerificationCreateParams::Signals::DevicePlatform] The type of the user's device.
461
471
  #
472
+ # @param existing_user [Boolean] Whether the end-user already exists in your system, for example an existing acco
473
+ #
462
474
  # @param ip [String] The public IP v4 or v6 address of the end-user's device. You should collect this
463
475
  #
464
476
  # @param is_trusted_user [Boolean] This signal should indicate a higher level of trust, explicitly stating that the
@@ -124,6 +124,16 @@ module PreludeSDK
124
124
  # @return [Symbol, PreludeSDK::Models::WatchPredictParams::Signals::DevicePlatform, nil]
125
125
  optional :device_platform, enum: -> { PreludeSDK::WatchPredictParams::Signals::DevicePlatform }
126
126
 
127
+ # @!attribute existing_user
128
+ # Whether the end-user already exists in your system, for example an existing
129
+ # account signing in again rather than a first-time signup. Unlike
130
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
131
+ # account as one additional anti-fraud signal. For more details, refer to
132
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
133
+ #
134
+ # @return [Boolean, nil]
135
+ optional :existing_user, PreludeSDK::Internal::Type::Boolean
136
+
127
137
  # @!attribute ip
128
138
  # The public IP v4 or v6 address of the end-user's device. You should collect this
129
139
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
@@ -163,7 +173,7 @@ module PreludeSDK
163
173
  # @return [String, nil]
164
174
  optional :user_agent, String
165
175
 
166
- # @!method initialize(app_version: nil, device_id: nil, device_model: nil, device_platform: nil, ip: nil, is_trusted_user: nil, ja4_fingerprint: nil, os_version: nil, user_agent: nil)
176
+ # @!method initialize(app_version: nil, device_id: nil, device_model: nil, device_platform: nil, existing_user: nil, ip: nil, is_trusted_user: nil, ja4_fingerprint: nil, os_version: nil, user_agent: nil)
167
177
  # Some parameter documentations has been truncated, see
168
178
  # {PreludeSDK::Models::WatchPredictParams::Signals} for more details.
169
179
  #
@@ -178,6 +188,8 @@ module PreludeSDK
178
188
  #
179
189
  # @param device_platform [Symbol, PreludeSDK::Models::WatchPredictParams::Signals::DevicePlatform] The type of the user's device.
180
190
  #
191
+ # @param existing_user [Boolean] Whether the end-user already exists in your system, for example an existing acco
192
+ #
181
193
  # @param ip [String] The public IP v4 or v6 address of the end-user's device. You should collect this
182
194
  #
183
195
  # @param is_trusted_user [Boolean] This signal should indicate a higher level of trust, explicitly stating that the
@@ -28,6 +28,9 @@ module PreludeSDK
28
28
  # when prediction is "suspicious" and the anti-fraud system detected specific risk
29
29
  # signals.
30
30
  #
31
+ # - `account_risk_profile` - The target matches a risk profile derived from the
32
+ # outcomes reported on your own account, rather than from a signal shared across
33
+ # accounts.
31
34
  # - `behavioral_pattern` - The phone number past behavior during verification
32
35
  # flows exhibits suspicious patterns.
33
36
  # - `device_attribute` - The device exhibits characteristics associated with
@@ -81,6 +84,7 @@ module PreludeSDK
81
84
  module RiskFactor
82
85
  extend PreludeSDK::Internal::Type::Enum
83
86
 
87
+ ACCOUNT_RISK_PROFILE = :account_risk_profile
84
88
  BEHAVIORAL_PATTERN = :behavioral_pattern
85
89
  DEVICE_ATTRIBUTE = :device_attribute
86
90
  FRAUD_DATABASE = :fraud_database
@@ -6,6 +6,8 @@ module PreludeSDK
6
6
  class Notify
7
7
  # Retrieve a specific subscription management configuration by its ID.
8
8
  #
9
+ # In order to get access to this endpoint, contact our support team.
10
+ #
9
11
  # @overload get_subscription_config(config_id, request_options: {})
10
12
  #
11
13
  # @param config_id [String] The subscription configuration ID
@@ -27,6 +29,8 @@ module PreludeSDK
27
29
  # Retrieve the current subscription status for a specific phone number within a
28
30
  # subscription configuration.
29
31
  #
32
+ # In order to get access to this endpoint, contact our support team.
33
+ #
30
34
  # @overload get_subscription_phone_number(phone_number, config_id:, request_options: {})
31
35
  #
32
36
  # @param phone_number [String] The phone number in E.164 format (e.g., +33612345678)
@@ -58,6 +62,8 @@ module PreludeSDK
58
62
  # Each configuration represents a subscription management setup with phone numbers
59
63
  # for receiving opt-out/opt-in requests and a callback URL for webhook events.
60
64
  #
65
+ # In order to get access to this endpoint, contact our support team.
66
+ #
61
67
  # @overload list_subscription_configs(cursor: nil, limit: nil, request_options: {})
62
68
  #
63
69
  # @param cursor [String] Pagination cursor from the previous response
@@ -86,6 +92,8 @@ module PreludeSDK
86
92
  #
87
93
  # Events are ordered by timestamp in descending order (most recent first).
88
94
  #
95
+ # In order to get access to this endpoint, contact our support team.
96
+ #
89
97
  # @overload list_subscription_phone_number_events(phone_number, config_id:, cursor: nil, limit: nil, request_options: {})
90
98
  #
91
99
  # @param phone_number [String] Path param: The phone number in E.164 format (e.g., +33612345678)
@@ -126,6 +134,8 @@ module PreludeSDK
126
134
  #
127
135
  # You can optionally filter by subscription state (SUB or UNSUB).
128
136
  #
137
+ # In order to get access to this endpoint, contact our support team.
138
+ #
129
139
  # @overload list_subscription_phone_numbers(config_id, cursor: nil, limit: nil, state: nil, request_options: {})
130
140
  #
131
141
  # @param config_id [String] The subscription configuration ID
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PreludeSDK
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
@@ -863,6 +863,17 @@ module PreludeSDK
863
863
  end
864
864
  attr_writer :device_platform
865
865
 
866
+ # Whether the end-user already exists in your system, for example an existing
867
+ # account signing in again rather than a first-time signup. Unlike
868
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
869
+ # account as one additional anti-fraud signal. For more details, refer to
870
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
871
+ sig { returns(T.nilable(T::Boolean)) }
872
+ attr_reader :existing_user
873
+
874
+ sig { params(existing_user: T::Boolean).void }
875
+ attr_writer :existing_user
876
+
866
877
  # The public IP v4 or v6 address of the end-user's device. You should collect this
867
878
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
868
879
  # `Forwarded`, `True-Client-IP`, `CF-Connecting-IP` or an equivalent header to get
@@ -916,6 +927,7 @@ module PreludeSDK
916
927
  device_model: String,
917
928
  device_platform:
918
929
  PreludeSDK::VerificationCreateParams::Signals::DevicePlatform::OrSymbol,
930
+ existing_user: T::Boolean,
919
931
  ip: String,
920
932
  is_trusted_user: T::Boolean,
921
933
  ja4_fingerprint: String,
@@ -934,6 +946,12 @@ module PreludeSDK
934
946
  device_model: nil,
935
947
  # The type of the user's device.
936
948
  device_platform: nil,
949
+ # Whether the end-user already exists in your system, for example an existing
950
+ # account signing in again rather than a first-time signup. Unlike
951
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
952
+ # account as one additional anti-fraud signal. For more details, refer to
953
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
954
+ existing_user: nil,
937
955
  # The public IP v4 or v6 address of the end-user's device. You should collect this
938
956
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
939
957
  # `Forwarded`, `True-Client-IP`, `CF-Connecting-IP` or an equivalent header to get
@@ -964,6 +982,7 @@ module PreludeSDK
964
982
  device_model: String,
965
983
  device_platform:
966
984
  PreludeSDK::VerificationCreateParams::Signals::DevicePlatform::OrSymbol,
985
+ existing_user: T::Boolean,
967
986
  ip: String,
968
987
  is_trusted_user: T::Boolean,
969
988
  ja4_fingerprint: String,
@@ -240,6 +240,17 @@ module PreludeSDK
240
240
  end
241
241
  attr_writer :device_platform
242
242
 
243
+ # Whether the end-user already exists in your system, for example an existing
244
+ # account signing in again rather than a first-time signup. Unlike
245
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
246
+ # account as one additional anti-fraud signal. For more details, refer to
247
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
248
+ sig { returns(T.nilable(T::Boolean)) }
249
+ attr_reader :existing_user
250
+
251
+ sig { params(existing_user: T::Boolean).void }
252
+ attr_writer :existing_user
253
+
243
254
  # The public IP v4 or v6 address of the end-user's device. You should collect this
244
255
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
245
256
  # `Forwarded`, `True-Client-IP`, `CF-Connecting-IP` or an equivalent header to get
@@ -293,6 +304,7 @@ module PreludeSDK
293
304
  device_model: String,
294
305
  device_platform:
295
306
  PreludeSDK::WatchPredictParams::Signals::DevicePlatform::OrSymbol,
307
+ existing_user: T::Boolean,
296
308
  ip: String,
297
309
  is_trusted_user: T::Boolean,
298
310
  ja4_fingerprint: String,
@@ -311,6 +323,12 @@ module PreludeSDK
311
323
  device_model: nil,
312
324
  # The type of the user's device.
313
325
  device_platform: nil,
326
+ # Whether the end-user already exists in your system, for example an existing
327
+ # account signing in again rather than a first-time signup. Unlike
328
+ # `is_trusted_user`, this signal does not bypass fraud checks; it is taken into
329
+ # account as one additional anti-fraud signal. For more details, refer to
330
+ # [Signals](/verify/v2/documentation/prevent-fraud#signals).
331
+ existing_user: nil,
314
332
  # The public IP v4 or v6 address of the end-user's device. You should collect this
315
333
  # from your backend. If your backend is behind a proxy, use the `X-Forwarded-For`,
316
334
  # `Forwarded`, `True-Client-IP`, `CF-Connecting-IP` or an equivalent header to get
@@ -341,6 +359,7 @@ module PreludeSDK
341
359
  device_model: String,
342
360
  device_platform:
343
361
  PreludeSDK::WatchPredictParams::Signals::DevicePlatform::OrSymbol,
362
+ existing_user: T::Boolean,
344
363
  ip: String,
345
364
  is_trusted_user: T::Boolean,
346
365
  ja4_fingerprint: String,
@@ -32,6 +32,9 @@ module PreludeSDK
32
32
  # when prediction is "suspicious" and the anti-fraud system detected specific risk
33
33
  # signals.
34
34
  #
35
+ # - `account_risk_profile` - The target matches a risk profile derived from the
36
+ # outcomes reported on your own account, rather than from a signal shared across
37
+ # accounts.
35
38
  # - `behavioral_pattern` - The phone number past behavior during verification
36
39
  # flows exhibits suspicious patterns.
37
40
  # - `device_attribute` - The device exhibits characteristics associated with
@@ -97,6 +100,9 @@ module PreludeSDK
97
100
  # when prediction is "suspicious" and the anti-fraud system detected specific risk
98
101
  # signals.
99
102
  #
103
+ # - `account_risk_profile` - The target matches a risk profile derived from the
104
+ # outcomes reported on your own account, rather than from a signal shared across
105
+ # accounts.
100
106
  # - `behavioral_pattern` - The phone number past behavior during verification
101
107
  # flows exhibits suspicious patterns.
102
108
  # - `device_attribute` - The device exhibits characteristics associated with
@@ -179,6 +185,11 @@ module PreludeSDK
179
185
  end
180
186
  OrSymbol = T.type_alias { T.any(Symbol, String) }
181
187
 
188
+ ACCOUNT_RISK_PROFILE =
189
+ T.let(
190
+ :account_risk_profile,
191
+ PreludeSDK::Models::WatchPredictResponse::RiskFactor::TaggedSymbol
192
+ )
182
193
  BEHAVIORAL_PATTERN =
183
194
  T.let(
184
195
  :behavioral_pattern,
@@ -5,6 +5,8 @@ module PreludeSDK
5
5
  # Send transactional and marketing messages with compliance enforcement.
6
6
  class Notify
7
7
  # Retrieve a specific subscription management configuration by its ID.
8
+ #
9
+ # In order to get access to this endpoint, contact our support team.
8
10
  sig do
9
11
  params(
10
12
  config_id: String,
@@ -20,6 +22,8 @@ module PreludeSDK
20
22
 
21
23
  # Retrieve the current subscription status for a specific phone number within a
22
24
  # subscription configuration.
25
+ #
26
+ # In order to get access to this endpoint, contact our support team.
23
27
  sig do
24
28
  params(
25
29
  phone_number: String,
@@ -41,6 +45,8 @@ module PreludeSDK
41
45
  #
42
46
  # Each configuration represents a subscription management setup with phone numbers
43
47
  # for receiving opt-out/opt-in requests and a callback URL for webhook events.
48
+ #
49
+ # In order to get access to this endpoint, contact our support team.
44
50
  sig do
45
51
  params(
46
52
  cursor: String,
@@ -61,6 +67,8 @@ module PreludeSDK
61
67
  # phone number within a subscription configuration.
62
68
  #
63
69
  # Events are ordered by timestamp in descending order (most recent first).
70
+ #
71
+ # In order to get access to this endpoint, contact our support team.
64
72
  sig do
65
73
  params(
66
74
  phone_number: String,
@@ -89,6 +97,8 @@ module PreludeSDK
89
97
  # specific subscription configuration.
90
98
  #
91
99
  # You can optionally filter by subscription state (SUB or UNSUB).
100
+ #
101
+ # In order to get access to this endpoint, contact our support team.
92
102
  sig do
93
103
  params(
94
104
  config_id: String,
@@ -294,6 +294,7 @@ module PreludeSDK
294
294
  device_id: String,
295
295
  device_model: String,
296
296
  device_platform: PreludeSDK::Models::VerificationCreateParams::Signals::device_platform,
297
+ existing_user: bool,
297
298
  ip: String,
298
299
  is_trusted_user: bool,
299
300
  :ja4_fingerprint => String,
@@ -320,6 +321,10 @@ module PreludeSDK
320
321
  PreludeSDK::Models::VerificationCreateParams::Signals::device_platform
321
322
  ) -> PreludeSDK::Models::VerificationCreateParams::Signals::device_platform
322
323
 
324
+ attr_reader existing_user: bool?
325
+
326
+ def existing_user=: (bool) -> bool
327
+
323
328
  attr_reader ip: String?
324
329
 
325
330
  def ip=: (String) -> String
@@ -345,6 +350,7 @@ module PreludeSDK
345
350
  ?device_id: String,
346
351
  ?device_model: String,
347
352
  ?device_platform: PreludeSDK::Models::VerificationCreateParams::Signals::device_platform,
353
+ ?existing_user: bool,
348
354
  ?ip: String,
349
355
  ?is_trusted_user: bool,
350
356
  ?ja4_fingerprint: String,
@@ -357,6 +363,7 @@ module PreludeSDK
357
363
  device_id: String,
358
364
  device_model: String,
359
365
  device_platform: PreludeSDK::Models::VerificationCreateParams::Signals::device_platform,
366
+ existing_user: bool,
360
367
  ip: String,
361
368
  is_trusted_user: bool,
362
369
  :ja4_fingerprint => String,
@@ -98,6 +98,7 @@ module PreludeSDK
98
98
  device_id: String,
99
99
  device_model: String,
100
100
  device_platform: PreludeSDK::Models::WatchPredictParams::Signals::device_platform,
101
+ existing_user: bool,
101
102
  ip: String,
102
103
  is_trusted_user: bool,
103
104
  :ja4_fingerprint => String,
@@ -124,6 +125,10 @@ module PreludeSDK
124
125
  PreludeSDK::Models::WatchPredictParams::Signals::device_platform
125
126
  ) -> PreludeSDK::Models::WatchPredictParams::Signals::device_platform
126
127
 
128
+ attr_reader existing_user: bool?
129
+
130
+ def existing_user=: (bool) -> bool
131
+
127
132
  attr_reader ip: String?
128
133
 
129
134
  def ip=: (String) -> String
@@ -149,6 +154,7 @@ module PreludeSDK
149
154
  ?device_id: String,
150
155
  ?device_model: String,
151
156
  ?device_platform: PreludeSDK::Models::WatchPredictParams::Signals::device_platform,
157
+ ?existing_user: bool,
152
158
  ?ip: String,
153
159
  ?is_trusted_user: bool,
154
160
  ?ja4_fingerprint: String,
@@ -161,6 +167,7 @@ module PreludeSDK
161
167
  device_id: String,
162
168
  device_model: String,
163
169
  device_platform: PreludeSDK::Models::WatchPredictParams::Signals::device_platform,
170
+ existing_user: bool,
164
171
  ip: String,
165
172
  is_trusted_user: bool,
166
173
  :ja4_fingerprint => String,
@@ -47,7 +47,8 @@ module PreludeSDK
47
47
  end
48
48
 
49
49
  type risk_factor =
50
- :behavioral_pattern
50
+ :account_risk_profile
51
+ | :behavioral_pattern
51
52
  | :device_attribute
52
53
  | :fraud_database
53
54
  | :location_discrepancy
@@ -61,6 +62,7 @@ module PreludeSDK
61
62
  module RiskFactor
62
63
  extend PreludeSDK::Internal::Type::Enum
63
64
 
65
+ ACCOUNT_RISK_PROFILE: :account_risk_profile
64
66
  BEHAVIORAL_PATTERN: :behavioral_pattern
65
67
  DEVICE_ATTRIBUTE: :device_attribute
66
68
  FRAUD_DATABASE: :fraud_database
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prelude-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Prelude
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-08-12 00:00:00.000000000 Z
11
+ date: 2026-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cgi