brand.dev 0.19.0 → 0.20.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: 5236e2be3cfd4c0d76d750b1cf8763549794d34ce485d269b65f28e86c264e1a
4
- data.tar.gz: 2eca5ea736c10ded4bf560f2312c89122f2755e879fc9b4f3dabe68c45da8b5f
3
+ metadata.gz: be4fa887e23eb9143aaf2472d22397b99b414cb4ff93540d2ea3da5fbae0cfa3
4
+ data.tar.gz: 1c923c23ca8386e90fefe684df20b6ece1cc9455bcc9fec14d1f7cdb221cb100
5
5
  SHA512:
6
- metadata.gz: 483f164eedf7a9ff9fa29cd607998493be1f611f400c4332f6b6d744788bc0b0b597a65f347fe0b51885117b202c6b546dfd5e7c415ba8a8059166302f259618
7
- data.tar.gz: ec67429f2dc1d6c6807daef902ae95ae214e959b7e80d326b762946f506f61e132d3d8f59084d8819be03ea38a5b0b78e2d929c0665b4a49aef611e9e8af0aac
6
+ metadata.gz: ac2de9483c9ed519557f9fcff0e2ea5041c938d8fd313a934332321d79133d25081c648bad90e320ed22a09a53faada008b3dae7cf023713350382cf8289ec28
7
+ data.tar.gz: f82183b8ff1d77f93834c0b4cbcb100ffd3ec1fcfa2ae08f5a3d6f2fc37b8f86933c423e2b5130a1f9319313404a336ac3cc7c4855b3f788e91d971fd3fb669f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.20.0 (2026-01-05)
4
+
5
+ Full Changelog: [v0.19.0...v0.20.0](https://github.com/brand-dot-dev/ruby-sdk/compare/v0.19.0...v0.20.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([0e16540](https://github.com/brand-dot-dev/ruby-sdk/commit/0e1654086ce29b4db61d42d680f5c837723200c8))
10
+ * **api:** api update ([25e7a5a](https://github.com/brand-dot-dev/ruby-sdk/commit/25e7a5a8d67e1a1f6d12ea45c9e5f8c3d0172419))
11
+ * **api:** manual updates ([58d3d58](https://github.com/brand-dot-dev/ruby-sdk/commit/58d3d58d2f482c0b7e173dd3c1805c09af80a2c8))
12
+
3
13
  ## 0.19.0 (2025-12-22)
4
14
 
5
15
  Full Changelog: [v0.18.0...v0.19.0](https://github.com/brand-dot-dev/ruby-sdk/compare/v0.18.0...v0.19.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 "brand.dev", "~> 0.19.0"
20
+ gem "brand.dev", "~> 0.20.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BrandDev
4
+ module Models
5
+ # @see BrandDev::Resources::Brand#ai_products
6
+ class BrandAIProductsParams < BrandDev::Internal::Type::BaseModel
7
+ extend BrandDev::Internal::Type::RequestParameters::Converter
8
+ include BrandDev::Internal::Type::RequestParameters
9
+
10
+ # @!attribute domain
11
+ # The domain name to analyze
12
+ #
13
+ # @return [String]
14
+ required :domain, String
15
+
16
+ # @!attribute max_products
17
+ # Maximum number of products to extract.
18
+ #
19
+ # @return [Integer, nil]
20
+ optional :max_products, Integer, api_name: :maxProducts
21
+
22
+ # @!attribute timeout_ms
23
+ # Optional timeout in milliseconds for the request. If the request takes longer
24
+ # than this value, it will be aborted with a 408 status code. Maximum allowed
25
+ # value is 300000ms (5 minutes).
26
+ #
27
+ # @return [Integer, nil]
28
+ optional :timeout_ms, Integer, api_name: :timeoutMS
29
+
30
+ # @!method initialize(domain:, max_products: nil, timeout_ms: nil, request_options: {})
31
+ # Some parameter documentations has been truncated, see
32
+ # {BrandDev::Models::BrandAIProductsParams} for more details.
33
+ #
34
+ # @param domain [String] The domain name to analyze
35
+ #
36
+ # @param max_products [Integer] Maximum number of products to extract.
37
+ #
38
+ # @param timeout_ms [Integer] Optional timeout in milliseconds for the request. If the request takes longer th
39
+ #
40
+ # @param request_options [BrandDev::RequestOptions, Hash{Symbol=>Object}]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BrandDev
4
+ module Models
5
+ # @see BrandDev::Resources::Brand#ai_products
6
+ class BrandAIProductsResponse < BrandDev::Internal::Type::BaseModel
7
+ # @!attribute products
8
+ # Array of products extracted from the website
9
+ #
10
+ # @return [Array<BrandDev::Models::BrandAIProductsResponse::Product>, nil]
11
+ optional :products,
12
+ -> { BrandDev::Internal::Type::ArrayOf[BrandDev::Models::BrandAIProductsResponse::Product] }
13
+
14
+ # @!method initialize(products: nil)
15
+ # @param products [Array<BrandDev::Models::BrandAIProductsResponse::Product>] Array of products extracted from the website
16
+
17
+ class Product < BrandDev::Internal::Type::BaseModel
18
+ # @!attribute description
19
+ # Description of the product
20
+ #
21
+ # @return [String]
22
+ required :description, String
23
+
24
+ # @!attribute features
25
+ # List of product features
26
+ #
27
+ # @return [Array<String>]
28
+ required :features, BrandDev::Internal::Type::ArrayOf[String]
29
+
30
+ # @!attribute name
31
+ # Name of the product
32
+ #
33
+ # @return [String]
34
+ required :name, String
35
+
36
+ # @!attribute tags
37
+ # Tags associated with the product
38
+ #
39
+ # @return [Array<String>]
40
+ required :tags, BrandDev::Internal::Type::ArrayOf[String]
41
+
42
+ # @!attribute target_audience
43
+ # Target audience for the product (array of strings)
44
+ #
45
+ # @return [Array<String>]
46
+ required :target_audience, BrandDev::Internal::Type::ArrayOf[String]
47
+
48
+ # @!attribute billing_frequency
49
+ # Billing frequency for the product
50
+ #
51
+ # @return [Symbol, BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency, nil]
52
+ optional :billing_frequency,
53
+ enum: -> { BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency },
54
+ nil?: true
55
+
56
+ # @!attribute category
57
+ # Category of the product
58
+ #
59
+ # @return [String, nil]
60
+ optional :category, String, nil?: true
61
+
62
+ # @!attribute currency
63
+ # Currency code for the price (e.g., USD, EUR)
64
+ #
65
+ # @return [String, nil]
66
+ optional :currency, String, nil?: true
67
+
68
+ # @!attribute image_url
69
+ # URL to the product image
70
+ #
71
+ # @return [String, nil]
72
+ optional :image_url, String, nil?: true
73
+
74
+ # @!attribute price
75
+ # Price of the product
76
+ #
77
+ # @return [Float, nil]
78
+ optional :price, Float, nil?: true
79
+
80
+ # @!attribute pricing_model
81
+ # Pricing model for the product
82
+ #
83
+ # @return [Symbol, BrandDev::Models::BrandAIProductsResponse::Product::PricingModel, nil]
84
+ optional :pricing_model,
85
+ enum: -> { BrandDev::Models::BrandAIProductsResponse::Product::PricingModel },
86
+ nil?: true
87
+
88
+ # @!attribute url
89
+ # URL to the product page
90
+ #
91
+ # @return [String, nil]
92
+ optional :url, String, nil?: true
93
+
94
+ # @!method initialize(description:, features:, name:, tags:, target_audience:, billing_frequency: nil, category: nil, currency: nil, image_url: nil, price: nil, pricing_model: nil, url: nil)
95
+ # @param description [String] Description of the product
96
+ #
97
+ # @param features [Array<String>] List of product features
98
+ #
99
+ # @param name [String] Name of the product
100
+ #
101
+ # @param tags [Array<String>] Tags associated with the product
102
+ #
103
+ # @param target_audience [Array<String>] Target audience for the product (array of strings)
104
+ #
105
+ # @param billing_frequency [Symbol, BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency, nil] Billing frequency for the product
106
+ #
107
+ # @param category [String, nil] Category of the product
108
+ #
109
+ # @param currency [String, nil] Currency code for the price (e.g., USD, EUR)
110
+ #
111
+ # @param image_url [String, nil] URL to the product image
112
+ #
113
+ # @param price [Float, nil] Price of the product
114
+ #
115
+ # @param pricing_model [Symbol, BrandDev::Models::BrandAIProductsResponse::Product::PricingModel, nil] Pricing model for the product
116
+ #
117
+ # @param url [String, nil] URL to the product page
118
+
119
+ # Billing frequency for the product
120
+ #
121
+ # @see BrandDev::Models::BrandAIProductsResponse::Product#billing_frequency
122
+ module BillingFrequency
123
+ extend BrandDev::Internal::Type::Enum
124
+
125
+ MONTHLY = :monthly
126
+ YEARLY = :yearly
127
+ ONE_TIME = :one_time
128
+ USAGE_BASED = :usage_based
129
+
130
+ # @!method self.values
131
+ # @return [Array<Symbol>]
132
+ end
133
+
134
+ # Pricing model for the product
135
+ #
136
+ # @see BrandDev::Models::BrandAIProductsResponse::Product#pricing_model
137
+ module PricingModel
138
+ extend BrandDev::Internal::Type::Enum
139
+
140
+ PER_SEAT = :per_seat
141
+ FLAT = :flat
142
+ TIERED = :tiered
143
+ FREEMIUM = :freemium
144
+ CUSTOM = :custom
145
+
146
+ # @!method self.values
147
+ # @return [Array<Symbol>]
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -39,6 +39,8 @@ module BrandDev
39
39
  mod.define_sorbet_constant!(const) { T.type_alias { mod.to_sorbet_type } }
40
40
  end
41
41
 
42
+ BrandAIProductsParams = BrandDev::Models::BrandAIProductsParams
43
+
42
44
  BrandAIQueryParams = BrandDev::Models::BrandAIQueryParams
43
45
 
44
46
  BrandFontsParams = BrandDev::Models::BrandFontsParams
@@ -35,12 +35,43 @@ module BrandDev
35
35
  )
36
36
  end
37
37
 
38
+ # Some parameter documentations has been truncated, see
39
+ # {BrandDev::Models::BrandAIProductsParams} for more details.
40
+ #
41
+ # Beta feature: Extract product information from a brand's website. Brand.dev will
42
+ # analyze the website and return a list of products with details such as name,
43
+ # description, image, pricing, features, and more.
44
+ #
45
+ # @overload ai_products(domain:, max_products: nil, timeout_ms: nil, request_options: {})
46
+ #
47
+ # @param domain [String] The domain name to analyze
48
+ #
49
+ # @param max_products [Integer] Maximum number of products to extract.
50
+ #
51
+ # @param timeout_ms [Integer] Optional timeout in milliseconds for the request. If the request takes longer th
52
+ #
53
+ # @param request_options [BrandDev::RequestOptions, Hash{Symbol=>Object}, nil]
54
+ #
55
+ # @return [BrandDev::Models::BrandAIProductsResponse]
56
+ #
57
+ # @see BrandDev::Models::BrandAIProductsParams
58
+ def ai_products(params)
59
+ parsed, options = BrandDev::BrandAIProductsParams.dump_request(params)
60
+ @client.request(
61
+ method: :post,
62
+ path: "brand/ai/products",
63
+ body: parsed,
64
+ model: BrandDev::Models::BrandAIProductsResponse,
65
+ options: options
66
+ )
67
+ end
68
+
38
69
  # Some parameter documentations has been truncated, see
39
70
  # {BrandDev::Models::BrandAIQueryParams} for more details.
40
71
  #
41
- # Beta feature: Use AI to extract specific data points from a brand's website. The
42
- # AI will crawl the website and extract the requested information based on the
43
- # provided data points.
72
+ # Use AI to extract specific data points from a brand's website. The AI will crawl
73
+ # the website and extract the requested information based on the provided data
74
+ # points.
44
75
  #
45
76
  # @overload ai_query(data_to_extract:, domain:, specific_pages: nil, timeout_ms: nil, request_options: {})
46
77
  #
@@ -71,8 +102,8 @@ module BrandDev
71
102
  # Some parameter documentations has been truncated, see
72
103
  # {BrandDev::Models::BrandFontsParams} for more details.
73
104
  #
74
- # Beta feature: Extract font information from a brand's website including font
75
- # families, usage statistics, fallbacks, and element/word counts.
105
+ # Extract font information from a brand's website including font families, usage
106
+ # statistics, fallbacks, and element/word counts.
76
107
  #
77
108
  # @overload fonts(domain:, timeout_ms: nil, request_options: {})
78
109
  #
@@ -398,10 +429,10 @@ module BrandDev
398
429
  # Some parameter documentations has been truncated, see
399
430
  # {BrandDev::Models::BrandScreenshotParams} for more details.
400
431
  #
401
- # Beta feature: Capture a screenshot of a website. Supports both viewport
402
- # (standard browser view) and full-page screenshots. Can also screenshot specific
403
- # page types (login, pricing, etc.) by using heuristics to find the appropriate
404
- # URL. Returns a URL to the uploaded screenshot image hosted on our CDN.
432
+ # Capture a screenshot of a website. Supports both viewport (standard browser
433
+ # view) and full-page screenshots. Can also screenshot specific page types (login,
434
+ # pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
435
+ # the uploaded screenshot image hosted on our CDN.
405
436
  #
406
437
  # @overload screenshot(domain:, full_screenshot: nil, page: nil, prioritize: nil, request_options: {})
407
438
  #
@@ -432,9 +463,8 @@ module BrandDev
432
463
  # Some parameter documentations has been truncated, see
433
464
  # {BrandDev::Models::BrandStyleguideParams} for more details.
434
465
  #
435
- # Beta feature: Automatically extract comprehensive design system information from
436
- # a brand's website including colors, typography, spacing, shadows, and UI
437
- # components.
466
+ # Automatically extract comprehensive design system information from a brand's
467
+ # website including colors, typography, spacing, shadows, and UI components.
438
468
  #
439
469
  # @overload styleguide(domain:, prioritize: nil, timeout_ms: nil, request_options: {})
440
470
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrandDev
4
- VERSION = "0.19.0"
4
+ VERSION = "0.20.0"
5
5
  end
data/lib/brand_dev.rb CHANGED
@@ -52,6 +52,8 @@ require_relative "brand_dev/errors"
52
52
  require_relative "brand_dev/internal/transport/base_client"
53
53
  require_relative "brand_dev/internal/transport/pooled_net_requester"
54
54
  require_relative "brand_dev/client"
55
+ require_relative "brand_dev/models/brand_ai_products_params"
56
+ require_relative "brand_dev/models/brand_ai_products_response"
55
57
  require_relative "brand_dev/models/brand_ai_query_params"
56
58
  require_relative "brand_dev/models/brand_ai_query_response"
57
59
  require_relative "brand_dev/models/brand_fonts_params"
@@ -0,0 +1,69 @@
1
+ # typed: strong
2
+
3
+ module BrandDev
4
+ module Models
5
+ class BrandAIProductsParams < BrandDev::Internal::Type::BaseModel
6
+ extend BrandDev::Internal::Type::RequestParameters::Converter
7
+ include BrandDev::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(BrandDev::BrandAIProductsParams, BrandDev::Internal::AnyHash)
12
+ end
13
+
14
+ # The domain name to analyze
15
+ sig { returns(String) }
16
+ attr_accessor :domain
17
+
18
+ # Maximum number of products to extract.
19
+ sig { returns(T.nilable(Integer)) }
20
+ attr_reader :max_products
21
+
22
+ sig { params(max_products: Integer).void }
23
+ attr_writer :max_products
24
+
25
+ # Optional timeout in milliseconds for the request. If the request takes longer
26
+ # than this value, it will be aborted with a 408 status code. Maximum allowed
27
+ # value is 300000ms (5 minutes).
28
+ sig { returns(T.nilable(Integer)) }
29
+ attr_reader :timeout_ms
30
+
31
+ sig { params(timeout_ms: Integer).void }
32
+ attr_writer :timeout_ms
33
+
34
+ sig do
35
+ params(
36
+ domain: String,
37
+ max_products: Integer,
38
+ timeout_ms: Integer,
39
+ request_options: BrandDev::RequestOptions::OrHash
40
+ ).returns(T.attached_class)
41
+ end
42
+ def self.new(
43
+ # The domain name to analyze
44
+ domain:,
45
+ # Maximum number of products to extract.
46
+ max_products: nil,
47
+ # Optional timeout in milliseconds for the request. If the request takes longer
48
+ # than this value, it will be aborted with a 408 status code. Maximum allowed
49
+ # value is 300000ms (5 minutes).
50
+ timeout_ms: nil,
51
+ request_options: {}
52
+ )
53
+ end
54
+
55
+ sig do
56
+ override.returns(
57
+ {
58
+ domain: String,
59
+ max_products: Integer,
60
+ timeout_ms: Integer,
61
+ request_options: BrandDev::RequestOptions
62
+ }
63
+ )
64
+ end
65
+ def to_hash
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,298 @@
1
+ # typed: strong
2
+
3
+ module BrandDev
4
+ module Models
5
+ class BrandAIProductsResponse < BrandDev::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(
9
+ BrandDev::Models::BrandAIProductsResponse,
10
+ BrandDev::Internal::AnyHash
11
+ )
12
+ end
13
+
14
+ # Array of products extracted from the website
15
+ sig do
16
+ returns(
17
+ T.nilable(
18
+ T::Array[BrandDev::Models::BrandAIProductsResponse::Product]
19
+ )
20
+ )
21
+ end
22
+ attr_reader :products
23
+
24
+ sig do
25
+ params(
26
+ products:
27
+ T::Array[BrandDev::Models::BrandAIProductsResponse::Product::OrHash]
28
+ ).void
29
+ end
30
+ attr_writer :products
31
+
32
+ sig do
33
+ params(
34
+ products:
35
+ T::Array[BrandDev::Models::BrandAIProductsResponse::Product::OrHash]
36
+ ).returns(T.attached_class)
37
+ end
38
+ def self.new(
39
+ # Array of products extracted from the website
40
+ products: nil
41
+ )
42
+ end
43
+
44
+ sig do
45
+ override.returns(
46
+ {
47
+ products:
48
+ T::Array[BrandDev::Models::BrandAIProductsResponse::Product]
49
+ }
50
+ )
51
+ end
52
+ def to_hash
53
+ end
54
+
55
+ class Product < BrandDev::Internal::Type::BaseModel
56
+ OrHash =
57
+ T.type_alias do
58
+ T.any(
59
+ BrandDev::Models::BrandAIProductsResponse::Product,
60
+ BrandDev::Internal::AnyHash
61
+ )
62
+ end
63
+
64
+ # Description of the product
65
+ sig { returns(String) }
66
+ attr_accessor :description
67
+
68
+ # List of product features
69
+ sig { returns(T::Array[String]) }
70
+ attr_accessor :features
71
+
72
+ # Name of the product
73
+ sig { returns(String) }
74
+ attr_accessor :name
75
+
76
+ # Tags associated with the product
77
+ sig { returns(T::Array[String]) }
78
+ attr_accessor :tags
79
+
80
+ # Target audience for the product (array of strings)
81
+ sig { returns(T::Array[String]) }
82
+ attr_accessor :target_audience
83
+
84
+ # Billing frequency for the product
85
+ sig do
86
+ returns(
87
+ T.nilable(
88
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
89
+ )
90
+ )
91
+ end
92
+ attr_accessor :billing_frequency
93
+
94
+ # Category of the product
95
+ sig { returns(T.nilable(String)) }
96
+ attr_accessor :category
97
+
98
+ # Currency code for the price (e.g., USD, EUR)
99
+ sig { returns(T.nilable(String)) }
100
+ attr_accessor :currency
101
+
102
+ # URL to the product image
103
+ sig { returns(T.nilable(String)) }
104
+ attr_accessor :image_url
105
+
106
+ # Price of the product
107
+ sig { returns(T.nilable(Float)) }
108
+ attr_accessor :price
109
+
110
+ # Pricing model for the product
111
+ sig do
112
+ returns(
113
+ T.nilable(
114
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
115
+ )
116
+ )
117
+ end
118
+ attr_accessor :pricing_model
119
+
120
+ # URL to the product page
121
+ sig { returns(T.nilable(String)) }
122
+ attr_accessor :url
123
+
124
+ sig do
125
+ params(
126
+ description: String,
127
+ features: T::Array[String],
128
+ name: String,
129
+ tags: T::Array[String],
130
+ target_audience: T::Array[String],
131
+ billing_frequency:
132
+ T.nilable(
133
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::OrSymbol
134
+ ),
135
+ category: T.nilable(String),
136
+ currency: T.nilable(String),
137
+ image_url: T.nilable(String),
138
+ price: T.nilable(Float),
139
+ pricing_model:
140
+ T.nilable(
141
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::OrSymbol
142
+ ),
143
+ url: T.nilable(String)
144
+ ).returns(T.attached_class)
145
+ end
146
+ def self.new(
147
+ # Description of the product
148
+ description:,
149
+ # List of product features
150
+ features:,
151
+ # Name of the product
152
+ name:,
153
+ # Tags associated with the product
154
+ tags:,
155
+ # Target audience for the product (array of strings)
156
+ target_audience:,
157
+ # Billing frequency for the product
158
+ billing_frequency: nil,
159
+ # Category of the product
160
+ category: nil,
161
+ # Currency code for the price (e.g., USD, EUR)
162
+ currency: nil,
163
+ # URL to the product image
164
+ image_url: nil,
165
+ # Price of the product
166
+ price: nil,
167
+ # Pricing model for the product
168
+ pricing_model: nil,
169
+ # URL to the product page
170
+ url: nil
171
+ )
172
+ end
173
+
174
+ sig do
175
+ override.returns(
176
+ {
177
+ description: String,
178
+ features: T::Array[String],
179
+ name: String,
180
+ tags: T::Array[String],
181
+ target_audience: T::Array[String],
182
+ billing_frequency:
183
+ T.nilable(
184
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
185
+ ),
186
+ category: T.nilable(String),
187
+ currency: T.nilable(String),
188
+ image_url: T.nilable(String),
189
+ price: T.nilable(Float),
190
+ pricing_model:
191
+ T.nilable(
192
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
193
+ ),
194
+ url: T.nilable(String)
195
+ }
196
+ )
197
+ end
198
+ def to_hash
199
+ end
200
+
201
+ # Billing frequency for the product
202
+ module BillingFrequency
203
+ extend BrandDev::Internal::Type::Enum
204
+
205
+ TaggedSymbol =
206
+ T.type_alias do
207
+ T.all(
208
+ Symbol,
209
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency
210
+ )
211
+ end
212
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
213
+
214
+ MONTHLY =
215
+ T.let(
216
+ :monthly,
217
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
218
+ )
219
+ YEARLY =
220
+ T.let(
221
+ :yearly,
222
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
223
+ )
224
+ ONE_TIME =
225
+ T.let(
226
+ :one_time,
227
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
228
+ )
229
+ USAGE_BASED =
230
+ T.let(
231
+ :usage_based,
232
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
233
+ )
234
+
235
+ sig do
236
+ override.returns(
237
+ T::Array[
238
+ BrandDev::Models::BrandAIProductsResponse::Product::BillingFrequency::TaggedSymbol
239
+ ]
240
+ )
241
+ end
242
+ def self.values
243
+ end
244
+ end
245
+
246
+ # Pricing model for the product
247
+ module PricingModel
248
+ extend BrandDev::Internal::Type::Enum
249
+
250
+ TaggedSymbol =
251
+ T.type_alias do
252
+ T.all(
253
+ Symbol,
254
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel
255
+ )
256
+ end
257
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
258
+
259
+ PER_SEAT =
260
+ T.let(
261
+ :per_seat,
262
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
263
+ )
264
+ FLAT =
265
+ T.let(
266
+ :flat,
267
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
268
+ )
269
+ TIERED =
270
+ T.let(
271
+ :tiered,
272
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
273
+ )
274
+ FREEMIUM =
275
+ T.let(
276
+ :freemium,
277
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
278
+ )
279
+ CUSTOM =
280
+ T.let(
281
+ :custom,
282
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
283
+ )
284
+
285
+ sig do
286
+ override.returns(
287
+ T::Array[
288
+ BrandDev::Models::BrandAIProductsResponse::Product::PricingModel::TaggedSymbol
289
+ ]
290
+ )
291
+ end
292
+ def self.values
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
@@ -1,6 +1,8 @@
1
1
  # typed: strong
2
2
 
3
3
  module BrandDev
4
+ BrandAIProductsParams = BrandDev::Models::BrandAIProductsParams
5
+
4
6
  BrandAIQueryParams = BrandDev::Models::BrandAIQueryParams
5
7
 
6
8
  BrandFontsParams = BrandDev::Models::BrandFontsParams
@@ -34,9 +34,33 @@ module BrandDev
34
34
  )
35
35
  end
36
36
 
37
- # Beta feature: Use AI to extract specific data points from a brand's website. The
38
- # AI will crawl the website and extract the requested information based on the
39
- # provided data points.
37
+ # Beta feature: Extract product information from a brand's website. Brand.dev will
38
+ # analyze the website and return a list of products with details such as name,
39
+ # description, image, pricing, features, and more.
40
+ sig do
41
+ params(
42
+ domain: String,
43
+ max_products: Integer,
44
+ timeout_ms: Integer,
45
+ request_options: BrandDev::RequestOptions::OrHash
46
+ ).returns(BrandDev::Models::BrandAIProductsResponse)
47
+ end
48
+ def ai_products(
49
+ # The domain name to analyze
50
+ domain:,
51
+ # Maximum number of products to extract.
52
+ max_products: nil,
53
+ # Optional timeout in milliseconds for the request. If the request takes longer
54
+ # than this value, it will be aborted with a 408 status code. Maximum allowed
55
+ # value is 300000ms (5 minutes).
56
+ timeout_ms: nil,
57
+ request_options: {}
58
+ )
59
+ end
60
+
61
+ # Use AI to extract specific data points from a brand's website. The AI will crawl
62
+ # the website and extract the requested information based on the provided data
63
+ # points.
40
64
  sig do
41
65
  params(
42
66
  data_to_extract:
@@ -62,8 +86,8 @@ module BrandDev
62
86
  )
63
87
  end
64
88
 
65
- # Beta feature: Extract font information from a brand's website including font
66
- # families, usage statistics, fallbacks, and element/word counts.
89
+ # Extract font information from a brand's website including font families, usage
90
+ # statistics, fallbacks, and element/word counts.
67
91
  sig do
68
92
  params(
69
93
  domain: String,
@@ -353,10 +377,10 @@ module BrandDev
353
377
  )
354
378
  end
355
379
 
356
- # Beta feature: Capture a screenshot of a website. Supports both viewport
357
- # (standard browser view) and full-page screenshots. Can also screenshot specific
358
- # page types (login, pricing, etc.) by using heuristics to find the appropriate
359
- # URL. Returns a URL to the uploaded screenshot image hosted on our CDN.
380
+ # Capture a screenshot of a website. Supports both viewport (standard browser
381
+ # view) and full-page screenshots. Can also screenshot specific page types (login,
382
+ # pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
383
+ # the uploaded screenshot image hosted on our CDN.
360
384
  sig do
361
385
  params(
362
386
  domain: String,
@@ -388,9 +412,8 @@ module BrandDev
388
412
  )
389
413
  end
390
414
 
391
- # Beta feature: Automatically extract comprehensive design system information from
392
- # a brand's website including colors, typography, spacing, shadows, and UI
393
- # components.
415
+ # Automatically extract comprehensive design system information from a brand's
416
+ # website including colors, typography, spacing, shadows, and UI components.
394
417
  sig do
395
418
  params(
396
419
  domain: String,
@@ -0,0 +1,36 @@
1
+ module BrandDev
2
+ module Models
3
+ type brand_ai_products_params =
4
+ { domain: String, max_products: Integer, timeout_ms: Integer }
5
+ & BrandDev::Internal::Type::request_parameters
6
+
7
+ class BrandAIProductsParams < BrandDev::Internal::Type::BaseModel
8
+ extend BrandDev::Internal::Type::RequestParameters::Converter
9
+ include BrandDev::Internal::Type::RequestParameters
10
+
11
+ attr_accessor domain: String
12
+
13
+ attr_reader max_products: Integer?
14
+
15
+ def max_products=: (Integer) -> Integer
16
+
17
+ attr_reader timeout_ms: Integer?
18
+
19
+ def timeout_ms=: (Integer) -> Integer
20
+
21
+ def initialize: (
22
+ domain: String,
23
+ ?max_products: Integer,
24
+ ?timeout_ms: Integer,
25
+ ?request_options: BrandDev::request_opts
26
+ ) -> void
27
+
28
+ def to_hash: -> {
29
+ domain: String,
30
+ max_products: Integer,
31
+ timeout_ms: Integer,
32
+ request_options: BrandDev::RequestOptions
33
+ }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,121 @@
1
+ module BrandDev
2
+ module Models
3
+ type brand_ai_products_response =
4
+ { products: ::Array[BrandDev::Models::BrandAIProductsResponse::Product] }
5
+
6
+ class BrandAIProductsResponse < BrandDev::Internal::Type::BaseModel
7
+ attr_reader products: ::Array[BrandDev::Models::BrandAIProductsResponse::Product]?
8
+
9
+ def products=: (
10
+ ::Array[BrandDev::Models::BrandAIProductsResponse::Product]
11
+ ) -> ::Array[BrandDev::Models::BrandAIProductsResponse::Product]
12
+
13
+ def initialize: (
14
+ ?products: ::Array[BrandDev::Models::BrandAIProductsResponse::Product]
15
+ ) -> void
16
+
17
+ def to_hash: -> {
18
+ products: ::Array[BrandDev::Models::BrandAIProductsResponse::Product]
19
+ }
20
+
21
+ type product =
22
+ {
23
+ description: String,
24
+ features: ::Array[String],
25
+ name: String,
26
+ tags: ::Array[String],
27
+ target_audience: ::Array[String],
28
+ billing_frequency: BrandDev::Models::BrandAIProductsResponse::Product::billing_frequency?,
29
+ category: String?,
30
+ currency: String?,
31
+ image_url: String?,
32
+ price: Float?,
33
+ pricing_model: BrandDev::Models::BrandAIProductsResponse::Product::pricing_model?,
34
+ url: String?
35
+ }
36
+
37
+ class Product < BrandDev::Internal::Type::BaseModel
38
+ attr_accessor description: String
39
+
40
+ attr_accessor features: ::Array[String]
41
+
42
+ attr_accessor name: String
43
+
44
+ attr_accessor tags: ::Array[String]
45
+
46
+ attr_accessor target_audience: ::Array[String]
47
+
48
+ attr_accessor billing_frequency: BrandDev::Models::BrandAIProductsResponse::Product::billing_frequency?
49
+
50
+ attr_accessor category: String?
51
+
52
+ attr_accessor currency: String?
53
+
54
+ attr_accessor image_url: String?
55
+
56
+ attr_accessor price: Float?
57
+
58
+ attr_accessor pricing_model: BrandDev::Models::BrandAIProductsResponse::Product::pricing_model?
59
+
60
+ attr_accessor url: String?
61
+
62
+ def initialize: (
63
+ description: String,
64
+ features: ::Array[String],
65
+ name: String,
66
+ tags: ::Array[String],
67
+ target_audience: ::Array[String],
68
+ ?billing_frequency: BrandDev::Models::BrandAIProductsResponse::Product::billing_frequency?,
69
+ ?category: String?,
70
+ ?currency: String?,
71
+ ?image_url: String?,
72
+ ?price: Float?,
73
+ ?pricing_model: BrandDev::Models::BrandAIProductsResponse::Product::pricing_model?,
74
+ ?url: String?
75
+ ) -> void
76
+
77
+ def to_hash: -> {
78
+ description: String,
79
+ features: ::Array[String],
80
+ name: String,
81
+ tags: ::Array[String],
82
+ target_audience: ::Array[String],
83
+ billing_frequency: BrandDev::Models::BrandAIProductsResponse::Product::billing_frequency?,
84
+ category: String?,
85
+ currency: String?,
86
+ image_url: String?,
87
+ price: Float?,
88
+ pricing_model: BrandDev::Models::BrandAIProductsResponse::Product::pricing_model?,
89
+ url: String?
90
+ }
91
+
92
+ type billing_frequency = :monthly | :yearly | :one_time | :usage_based
93
+
94
+ module BillingFrequency
95
+ extend BrandDev::Internal::Type::Enum
96
+
97
+ MONTHLY: :monthly
98
+ YEARLY: :yearly
99
+ ONE_TIME: :one_time
100
+ USAGE_BASED: :usage_based
101
+
102
+ def self?.values: -> ::Array[BrandDev::Models::BrandAIProductsResponse::Product::billing_frequency]
103
+ end
104
+
105
+ type pricing_model = :per_seat | :flat | :tiered | :freemium | :custom
106
+
107
+ module PricingModel
108
+ extend BrandDev::Internal::Type::Enum
109
+
110
+ PER_SEAT: :per_seat
111
+ FLAT: :flat
112
+ TIERED: :tiered
113
+ FREEMIUM: :freemium
114
+ CUSTOM: :custom
115
+
116
+ def self?.values: -> ::Array[BrandDev::Models::BrandAIProductsResponse::Product::pricing_model]
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -1,4 +1,6 @@
1
1
  module BrandDev
2
+ class BrandAIProductsParams = BrandDev::Models::BrandAIProductsParams
3
+
2
4
  class BrandAIQueryParams = BrandDev::Models::BrandAIQueryParams
3
5
 
4
6
  class BrandFontsParams = BrandDev::Models::BrandFontsParams
@@ -9,6 +9,13 @@ module BrandDev
9
9
  ?request_options: BrandDev::request_opts
10
10
  ) -> BrandDev::Models::BrandRetrieveResponse
11
11
 
12
+ def ai_products: (
13
+ domain: String,
14
+ ?max_products: Integer,
15
+ ?timeout_ms: Integer,
16
+ ?request_options: BrandDev::request_opts
17
+ ) -> BrandDev::Models::BrandAIProductsResponse
18
+
12
19
  def ai_query: (
13
20
  data_to_extract: ::Array[BrandDev::BrandAIQueryParams::DataToExtract],
14
21
  domain: String,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brand.dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brand Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-22 00:00:00.000000000 Z
11
+ date: 2026-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -54,6 +54,8 @@ files:
54
54
  - lib/brand_dev/internal/type/unknown.rb
55
55
  - lib/brand_dev/internal/util.rb
56
56
  - lib/brand_dev/models.rb
57
+ - lib/brand_dev/models/brand_ai_products_params.rb
58
+ - lib/brand_dev/models/brand_ai_products_response.rb
57
59
  - lib/brand_dev/models/brand_ai_query_params.rb
58
60
  - lib/brand_dev/models/brand_ai_query_response.rb
59
61
  - lib/brand_dev/models/brand_fonts_params.rb
@@ -105,6 +107,8 @@ files:
105
107
  - rbi/brand_dev/internal/type/unknown.rbi
106
108
  - rbi/brand_dev/internal/util.rbi
107
109
  - rbi/brand_dev/models.rbi
110
+ - rbi/brand_dev/models/brand_ai_products_params.rbi
111
+ - rbi/brand_dev/models/brand_ai_products_response.rbi
108
112
  - rbi/brand_dev/models/brand_ai_query_params.rbi
109
113
  - rbi/brand_dev/models/brand_ai_query_response.rbi
110
114
  - rbi/brand_dev/models/brand_fonts_params.rbi
@@ -155,6 +159,8 @@ files:
155
159
  - sig/brand_dev/internal/type/unknown.rbs
156
160
  - sig/brand_dev/internal/util.rbs
157
161
  - sig/brand_dev/models.rbs
162
+ - sig/brand_dev/models/brand_ai_products_params.rbs
163
+ - sig/brand_dev/models/brand_ai_products_response.rbs
158
164
  - sig/brand_dev/models/brand_ai_query_params.rbs
159
165
  - sig/brand_dev/models/brand_ai_query_response.rbs
160
166
  - sig/brand_dev/models/brand_fonts_params.rbs