cufinder-ruby 1.0.0 → 1.2.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: 5f02342f587a60dcb5946f69fce0aab002736425ead7614d5cecaca4af35d035
4
- data.tar.gz: '097b09d59e662d36c221de3fcc9bda06ebc0778c84daf291fb12f7047dd3f549'
3
+ metadata.gz: 44b98b86c620454eac62fab4ba87a4c2e49aaa710d4096825932e6294d037bd9
4
+ data.tar.gz: 574b9c457d9a3fbbbc0602617ba323ba7930499055b485ec162763185dce5305
5
5
  SHA512:
6
- metadata.gz: bc1ee47853ec78af1f478410b7ed54dc0dcb024d918cf0f32e145084f621751326a4f878b7ff4ec22029f39efcccb5b1e4fa0b386a42ae8bd2cc5aa937f85df4
7
- data.tar.gz: 469e8cd28fc6308b2768ffcda28a350397604908ae3ebfedc531b24c76e8a067be905f0deddad258894825f4155acd7554d131d1637cf9ee6393d1b3514ec0a7
6
+ metadata.gz: 2a786c6a1b6f151223eff85114283d736e24e93ee0e946b0eac1900a2b57952261ee7eccb947ca5129fc735ba636c5d259c2cd0ff21aa4a54597801db5bd48c1
7
+ data.tar.gz: 29967a91c181832949a7f9092d96507a3a4cad5bc140cfb5d262fdf2f2b0a0c203d109c790893593a2f22813b16381fcc7d22d125367f2e006db3115f55ae5cc
data/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Cufinder Ruby SDK Changelog
2
+
3
+
4
+ ## 1.2.0 (June 21, 2026)
5
+
6
+ #### Features
7
+ - **New V2 API services**: Add new V2 services including `CEF`, `NAC`, `CAA` and `CJA`
8
+
9
+
10
+
11
+
12
+
13
+ ## 1.1.0 (February 01, 2026)
14
+
15
+ #### Features
16
+ - **New V2 API services**: Add new V2 services including `BCD`, `CCP`, `ISC`, `CBC`, `CSC`, `CSN`, `NAO` and `NAA`
17
+
18
+
19
+ #### Documentation
20
+ - **Updated README.md**: Add API reference for all new services
data/README.md CHANGED
@@ -1,6 +1,19 @@
1
- # CUFinder Ruby Client
1
+ # CUFinder Ruby SDK
2
2
 
3
- Official Ruby Client for accessing CUFinder's comprehensive business intelligence and lead generation services.
3
+ [![](https://img.shields.io/badge/repo%20status-Active-28a745)](https://github.com/cufinder/cufinder-ruby)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-514BEE.svg)](https://opensource.org/licenses/MIT)
5
+ [![Gem Version](https://img.shields.io/gem/v/cufinder-ruby.svg)](https://rubygems.org/gems/cufinder-ruby)
6
+
7
+ A Ruby SDK for the CUFinder API that provides access to all company and person enrichment services.
8
+
9
+ ## Table of Contents
10
+
11
+ - [Installation](#installation)
12
+ - [Usage](#usage)
13
+ - [API Reference](#api-reference)
14
+ - [Error Handling](#error-handling)
15
+ - [Types](#types)
16
+ - [Support](#support)
4
17
 
5
18
  ## Installation
6
19
 
@@ -24,168 +37,479 @@ gem install cufinder-ruby
24
37
 
25
38
  ## Usage
26
39
 
27
- ### Basic Setup
28
-
29
40
  ```ruby
30
41
  require 'cufinder_ruby'
31
42
 
32
- # Initialize the client with your API key
43
+ # Initialize the client
33
44
  client = Cufinder::Client.new(api_key: 'your-api-key-here')
45
+
46
+ # Initialize with more options
47
+ client = Cufinder::Client.new(
48
+ api_key: 'your-api-key-here',
49
+ timeout: 60,
50
+ max_retries: 3
51
+ )
52
+ ```
53
+
54
+ ## API Reference
55
+
56
+ This SDK covers all 32 Cufinder API (v2) endpoints:
57
+
58
+ - **CUF** - [Company Name to Domain](https://apidoc.cufinder.io/apis/company-name-to-domain)
59
+ - **LCUF** - [LinkedIn Company URL Finder](https://apidoc.cufinder.io/apis/company-linkedin-url-finder)
60
+ - **DTC** - [Domain to Company Name](https://apidoc.cufinder.io/apis/domain-to-company-name)
61
+ - **DTE** - [Company Email Finder](https://apidoc.cufinder.io/apis/company-email-finder)
62
+ - **NTP** - [Company Phone Finder](https://apidoc.cufinder.io/apis/company-phone-finder)
63
+ - **REL** - [Reverse Email Lookup](https://apidoc.cufinder.io/apis/reverse-email-lookup)
64
+ - **FCL** - [Company Lookalikes Finder](https://apidoc.cufinder.io/apis/company-lookalikes-finder)
65
+ - **ELF** - [Company Fundraising](https://apidoc.cufinder.io/apis/company-fundraising)
66
+ - **CAR** - [Company Revenue Finder](https://apidoc.cufinder.io/apis/company-revenue-finder)
67
+ - **FCC** - [Company Subsidiaries Finder](https://apidoc.cufinder.io/apis/company-subsidiaries-finder)
68
+ - **FTS** - [Company Tech Stack Finder](https://apidoc.cufinder.io/apis/company-tech-stack-finder)
69
+ - **EPP** - [LinkedIn Profile Enrichment](https://apidoc.cufinder.io/apis/linkedin-profile-enrichment)
70
+ - **FWE** - [LinkedIn Profile Email Finder](https://apidoc.cufinder.io/apis/linkedin-profile-email-finder)
71
+ - **TEP** - [Person Enrichment](https://apidoc.cufinder.io/apis/person-enrichment)
72
+ - **ENC** - [Company Enrichment](https://apidoc.cufinder.io/apis/company-enrichment)
73
+ - **CEC** - [Company Employee Count](https://apidoc.cufinder.io/apis/company-employee-count)
74
+ - **CLO** - [Company Locations](https://apidoc.cufinder.io/apis/company-locations)
75
+ - **CSE** - [Company Search](https://apidoc.cufinder.io/apis/company-search)
76
+ - **PSE** - [Person Search](https://apidoc.cufinder.io/apis/person-search)
77
+ - **LBS** - [Local Business Search (Google Maps Search API)](https://apidoc.cufinder.io/apis/local-business-search-google-maps-search-api)
78
+ - **BCD** - [B2B Customers Finder](https://apidoc.cufinder.io/apis/b2b-customers-finder)
79
+ - **CCP** - [Company Career Page Finder](https://apidoc.cufinder.io/apis/company-career-page-finder)
80
+ - **ISC** - [Company Saas Checker](https://apidoc.cufinder.io/apis/company-saas-checker)
81
+ - **CBC** - [Company B2B or B2C Checker](https://apidoc.cufinder.io/apis/company-b2b-or-b2c-checker)
82
+ - **CSC** - [Company Mission Statement](https://apidoc.cufinder.io/apis/company-mission-statement)
83
+ - **CSN** - [Company Snapshot](https://apidoc.cufinder.io/apis/company-snapshot)
84
+ - **NAO** - [Phone Number Normalizer](https://apidoc.cufinder.io/apis/phone-number-normalizer)
85
+ - **NAA** - [Address Normalizer](https://apidoc.cufinder.io/apis/address-normalizer)
86
+ - **CEF** - [Company Employees Finder](https://apidoc.cufinder.io/apis/company-employees-finder)
87
+ - **NAC** - [Company Name Normalizer](https://apidoc.cufinder.io/apis/company-name-normalizer)
88
+ - **CAA** - [Company Activities API](https://apidoc.cufinder.io/apis/company-activities-api)
89
+ - **CJA** - [Company Jobs API](https://apidoc.cufinder.io/apis/company-jobs-api)
90
+
91
+
92
+ **CUF - Company Name to Domain**
93
+
94
+ Returns the official website URL of a company based on its name.
95
+
96
+ ```ruby
97
+ result = client.cuf(company_name: 'cufinder', country_code: 'US')
98
+ puts result
99
+ ```
100
+
101
+ **LCUF - LinkedIn Company URL Finder**
102
+
103
+ Finds the official LinkedIn company profile URL from a company name.
104
+
105
+ ```ruby
106
+ result = client.lcuf(company_name: 'cufinder')
107
+ puts result
108
+ ```
109
+
110
+ **DTC - Domain to Company Name**
111
+
112
+ Retrieves the registered company name associated with a given website domain.
113
+
114
+ ```ruby
115
+ result = client.dtc(company_website: 'cufinder.io')
116
+ puts result
117
+ ```
118
+
119
+ **DTE - Company Email Finder**
120
+
121
+ Returns up to five general or role-based business email addresses for a company.
122
+
123
+ ```ruby
124
+ result = client.dte(company_website: 'cufinder.io')
125
+ puts result
126
+ ```
127
+
128
+ **NTP - Company Phone Finder**
129
+
130
+ Returns up to two verified phone numbers for a company.
131
+
132
+ ```ruby
133
+ result = client.ntp(company_name: 'apple')
134
+ puts result
135
+ ```
136
+
137
+ **REL - Reverse Email Lookup**
138
+
139
+ Enriches an email address with detailed person and company information.
140
+
141
+ ```ruby
142
+ result = client.rel(email: 'iain.mckenzie@stripe.com')
143
+ puts result
144
+ ```
145
+
146
+ **FCL - Company Lookalikes Finder**
147
+
148
+ Provides a list of similar companies based on an input company's profile.
149
+
150
+ ```ruby
151
+ result = client.fcl(query: 'apple')
152
+ puts result
153
+ ```
154
+
155
+ **ELF - Company Fundraising**
156
+
157
+ Returns detailed funding information about a company.
158
+
159
+ ```ruby
160
+ result = client.elf(query: 'cufinder')
161
+ puts result
162
+ ```
163
+
164
+ **CAR - Company Revenue Finder**
165
+
166
+ Estimates a company's annual revenue based on name.
167
+
168
+ ```ruby
169
+ result = client.car(query: 'apple')
170
+ puts result
171
+ ```
172
+
173
+ **FCC - Company Subsidiaries Finder**
174
+
175
+ Identifies known subsidiaries of a parent company.
176
+
177
+ ```ruby
178
+ result = client.fcc(query: 'amazon')
179
+ puts result
34
180
  ```
35
181
 
36
- ### Available Services
182
+ **FTS - Company Tech Stack Finder**
37
183
 
38
- The Client provides access to all CUFinder API services:
184
+ Detects the technologies a company uses.
39
185
 
40
- #### 1. CUF - Company URL Finder
41
186
  ```ruby
42
- result = client.cuf(company_name: "Apple Inc", country_code: "US")
43
- puts result.domain # => "apple.com"
187
+ result = client.fts(query: 'cufinder')
188
+ puts result
44
189
  ```
45
190
 
46
- #### 2. LCUF - LinkedIn Company URL Finder
191
+ **EPP - LinkedIn Profile Enrichment**
192
+
193
+ Takes a LinkedIn profile URL and returns enriched person and company data.
194
+
47
195
  ```ruby
48
- result = client.lcuf(company_name: "Apple Inc")
49
- puts result.linkedin_url # => "linkedin.com/company/apple"
196
+ result = client.epp(linkedin_url: 'linkedin.com/in/iain-mckenzie')
197
+ puts result
50
198
  ```
51
199
 
52
- #### 3. DTC - Domain to Company
200
+ **FWE - LinkedIn Profile Email Finder**
201
+
202
+ Extracts a verified business email address from a LinkedIn profile URL.
203
+
204
+ ```ruby
205
+ result = client.fwe(linkedin_url: 'linkedin.com/in/iain-mckenzie')
206
+ puts result
207
+ ```
208
+
209
+ **TEP - Person Enrichment**
210
+
211
+ Returns enriched person data based on full name and company name.
212
+
213
+ ```ruby
214
+ result = client.tep(full_name: 'iain mckenzie', company: 'stripe')
215
+ puts result
216
+ ```
217
+
218
+ **ENC - Company Enrichment**
219
+
220
+ Provides a complete company profile from a company name.
221
+
53
222
  ```ruby
54
- result = client.dtc(company_website: "apple.com")
55
- puts result.company_name # => "Apple Inc"
223
+ result = client.enc(query: 'cufinder')
224
+ puts result
56
225
  ```
57
226
 
58
- #### 4. DTE - Domain to Emails
227
+ **CEC - Company Employee Count**
228
+
229
+ Returns an estimated number of employees for a company.
230
+
59
231
  ```ruby
60
- result = client.dte(company_website: "apple.com")
61
- puts result.emails # => ["contact@apple.com", "info@apple.com"]
232
+ result = client.cec(query: 'cufinder')
233
+ puts result
62
234
  ```
63
235
 
64
- #### 5. NTP - Name to Phones
236
+ **CLO - Company Locations**
237
+
238
+ Returns the known physical office locations of a company.
239
+
65
240
  ```ruby
66
- result = client.ntp(company_name: "Apple Inc")
67
- puts result.phones # => ["+1-408-996-1010"]
241
+ result = client.clo(query: 'apple')
242
+ puts result
68
243
  ```
69
244
 
70
- #### 6. REL - Reverse Email Lookup
245
+ **CSE - Company Search**
246
+
247
+ Search for companies by keyword, partial name, industry, location, or other filters.
248
+
71
249
  ```ruby
72
- result = client.rel(email: "tim.cook@apple.com")
73
- puts result.person.full_name # => "Tim Cook"
250
+ result = client.cse(
251
+ name: 'cufinder',
252
+ country: 'germany',
253
+ state: 'hamburg',
254
+ city: 'hamburg'
255
+ )
256
+ puts result
74
257
  ```
75
258
 
76
- #### 7. FCL - Find Company Lookalikes
259
+ **PSE - Person Search**
260
+
261
+ Search for people by name, company, job title, location, or other filters.
262
+
77
263
  ```ruby
78
- result = client.fcl(query: "tech startup")
79
- puts result.companies.length # => 10
264
+ result = client.pse(
265
+ full_name: 'iain mckenzie',
266
+ company_name: 'stripe'
267
+ )
268
+ puts result
80
269
  ```
81
270
 
82
- #### 8. ELF - Enrich LinkedIn Fundraising
271
+ **LBS - Local Business Search (Google Maps Search API)**
272
+
273
+ Search for local businesses by location, industry, or name.
274
+
83
275
  ```ruby
84
- result = client.elf(query: "tech company")
85
- puts result.fundraising.funding_money_raised # => "$5M"
276
+ result = client.lbs(
277
+ country: 'united states',
278
+ state: 'california',
279
+ page: 1
280
+ )
281
+ puts result
86
282
  ```
87
283
 
88
- #### 9. CAR - Company Annual Revenue
284
+ **BCD - B2B Customers Finder**
285
+
286
+ Returns B2B customers for a company
287
+
89
288
  ```ruby
90
- result = client.car(query: "Apple Inc")
91
- puts result.revenue # => "$394.3B"
289
+ result = client.bcd(url: "stripe.com")
290
+ puts result
92
291
  ```
93
292
 
94
- #### 10. FCC - Find Company Children
293
+ **CCP - Company Career Page Finder**
294
+
295
+ Returns company's careers page URL
296
+
95
297
  ```ruby
96
- result = client.fcc(query: "Apple Inc")
97
- puts result.subsidiaries # => ["Beats Electronics", "Shazam"]
298
+ result = client.ccp(url: "stripe.com")
299
+ puts result
98
300
  ```
99
301
 
100
- #### 11. FTS - Find Tech Stack
302
+ **ISC - Company Saas Checker**
303
+
304
+ Returns is company SaaS or not
305
+
101
306
  ```ruby
102
- result = client.fts(query: "web development")
103
- puts result.technologies # => ["React", "Node.js", "Python"]
307
+ result = client.isc(url: "stripe.com")
308
+ puts result
104
309
  ```
105
310
 
106
- #### 12. EPP - Enrich Person Profile
311
+ **CBC - Company B2B or B2C Checker**
312
+
313
+ Returns company's business type
314
+
107
315
  ```ruby
108
- result = client.epp(linkedin_url: "linkedin.com/in/tim-cook")
109
- puts result.person.full_name # => "Tim Cook"
316
+ result = client.cbc(url: "stripe.com")
317
+ puts result
110
318
  ```
111
319
 
112
- #### 13. FWE - Find Work Email
320
+ **CSC - Company Mission Statement**
321
+
322
+ Returns company's mission statement
323
+
113
324
  ```ruby
114
- result = client.fwe(linkedin_url: "linkedin.com/in/tim-cook")
115
- puts result.email # => "tim.cook@apple.com"
325
+ result = client.csc(url: "stripe.com")
326
+ puts result
116
327
  ```
117
328
 
118
- #### 14. TEP - Title Email Phone
329
+ **CSN - Company Snapshot**
330
+
331
+ Returns company's snapshot information
332
+
119
333
  ```ruby
120
- result = client.tep(full_name: "Tim Cook", company: "Apple Inc")
121
- puts result.person.email # => "tim.cook@apple.com"
122
- puts result.person.phone # => "+1-408-996-1010"
334
+ result = client.csn(url: "stripe.com")
335
+ puts result
123
336
  ```
124
337
 
125
- #### 15. ENC - Enrich Company
338
+ **NAO - Phone Number Normalizer**
339
+
340
+ Returns normalized phone
341
+
126
342
  ```ruby
127
- result = client.enc(query: "Apple Inc")
128
- puts result.company.employee_count # => 164000
343
+ result = client.nao(phone: "+18006676389")
344
+ puts result
129
345
  ```
130
346
 
131
- #### 16. CEC - Company Employee Count
347
+ **NAA - Address Normalizer**
348
+
349
+ Returns normalized address
350
+
132
351
  ```ruby
133
- result = client.cec(query: "Apple Inc")
134
- puts result.countries # => {"US" => 100000, "CA" => 5000}
352
+ result = client.naa(address: "1095 avenue of the Americas, 6th Avenue ny 10036")
353
+ puts result
135
354
  ```
136
355
 
137
- #### 17. CLO - Company Locations
356
+ **CEF - Company Employees Finder**
357
+
358
+ Returns company's employees
359
+
138
360
  ```ruby
139
- result = client.clo(query: "Apple Inc")
140
- puts result.locations.first.city # => "Cupertino"
361
+ result = client.cef(query: "cufinder", page: 1)
362
+ puts result
141
363
  ```
142
364
 
143
- #### 18. CSE - Company Search Engine
365
+ **NAC - Company Name Normalizer**
366
+
367
+ Returns normalized company name
368
+
144
369
  ```ruby
145
- result = client.cse(name: "tech", country: "US", industry: "software")
146
- puts result.companies.length # => 50
370
+ result = client.nac(company: "cufinder inc.")
371
+ puts result
147
372
  ```
148
373
 
149
- #### 19. PSE - Person Search Engine
374
+ **CAA - Company Activities API**
375
+
376
+ Returns company's LinkedIn activities
377
+
150
378
  ```ruby
151
- result = client.pse(full_name: "John", country: "US", company_name: "Apple")
152
- puts result.peoples.length # => 25
379
+ result = client.caa(query: "cufinder", page: 1)
380
+ puts result
153
381
  ```
154
382
 
155
- #### 20. LBS - Local Business Search
383
+ **CJA - Company Jobs API**
384
+
385
+ Returns company's job listings
386
+
156
387
  ```ruby
157
- result = client.lbs(name: "restaurant", city: "New York")
158
- puts result.companies.length # => 100
388
+ result = client.cja(name: "google", country: "united states", page: 1)
389
+ puts result
159
390
  ```
160
391
 
161
- ### Error Handling
392
+ ## Error Handling
162
393
 
163
- The Client provides comprehensive error handling:
394
+ The SDK provides comprehensive error handling with custom error types:
164
395
 
165
396
  ```ruby
397
+ require 'cufinder_ruby'
398
+
166
399
  begin
167
- result = client.cuf(company_name: "Apple Inc", country_code: "US")
400
+ result = client.cuf(company_name: 'cufinder', country_code: 'US')
168
401
  rescue Cufinder::AuthenticationError => e
402
+ # 401 - Invalid API key
169
403
  puts "Authentication failed: #{e.message}"
404
+ rescue Cufinder::CreditLimitError => e
405
+ # 400 - Not enough credit
406
+ puts "Not enough credit: #{e.message}"
407
+ rescue Cufinder::NotFoundError => e
408
+ # 404 - Not found result
409
+ puts "Not found result: #{e.message}"
410
+ rescue Cufinder::PayloadError => e
411
+ # 422 - Error in the payload
412
+ puts "Payload error: #{e.message}"
170
413
  rescue Cufinder::RateLimitError => e
414
+ # 429 - Rate limit exceeded
171
415
  puts "Rate limit exceeded: #{e.message}"
172
- rescue Cufinder::CreditLimitError => e
173
- puts "Credit limit exceeded: #{e.message}"
174
- rescue Cufinder::ApiError => e
175
- puts "API error #{e.status}: #{e.message}"
416
+ rescue Cufinder::ServerError => e
417
+ # 500, 501, ... - Server errors
418
+ puts "Server error (#{e.status}): #{e.message}"
419
+ rescue Cufinder::NetworkError => e
420
+ puts "Network error: #{e.message}"
176
421
  rescue Cufinder::ValidationError => e
177
422
  puts "Validation error: #{e.message}"
423
+ rescue Cufinder::ApiError => e
424
+ puts "Unknown error: #{e.message}"
178
425
  end
179
426
  ```
180
427
 
181
- ### Configuration
428
+ ## Types
182
429
 
183
- You can configure the Client with custom settings:
430
+ The SDK exports comprehensive Ruby classes for all API requests and responses:
184
431
 
185
432
  ```ruby
186
- sdk = Cufinder::Client.new(
187
- api_key: 'your-api-key',
188
- timeout: 30, # Default
189
- max_retries: 3 # Default
190
- )
191
- ```
433
+ # Response classes
434
+ class BaseResponse
435
+ attr_reader :query, :credit_count
436
+ end
437
+
438
+ # Model classes
439
+ class Company
440
+ # The Company class contains all returned company data.
441
+ attr_reader :name, :domain, :website, :linkedin_url
442
+ attr_reader :country, :state, :city, :address
443
+ attr_reader :industry, :company_size, :revenue
444
+ attr_reader :employee_count, :subsidiaries, :tech_stack
445
+ attr_reader :emails, :phones, :description
446
+ attr_reader :locations, :founded_year, :logo_url
447
+ end
448
+
449
+ class Person
450
+ # The Person class contains all returned person data.
451
+ attr_reader :full_name, :first_name, :last_name
452
+ attr_reader :company_name, :company_domain, :job_title
453
+ attr_reader :country, :state, :city
454
+ attr_reader :email, :phone, :description, :linkedin_url
455
+ end
456
+
457
+ class LookalikeCompany
458
+ # The LookalikeCompany class contains all returned lookalike company data.
459
+ attr_reader :name, :domain, :website, :linkedin_url
460
+ attr_reader :country, :state, :city, :address
461
+ attr_reader :industry, :company_size, :revenue
462
+ attr_reader :employee_count, :subsidiaries, :tech_stack
463
+ attr_reader :emails, :phones, :description
464
+ attr_reader :locations, :founded_year, :logo_url
465
+ end
466
+
467
+ class FundraisingInfo
468
+ attr_reader :funding_last_round_type
469
+ attr_reader :funding_ammount_currency_code
470
+ attr_reader :funding_money_raised
471
+ attr_reader :funding_last_round_investors_url
472
+ end
473
+
474
+ class CompanyLocation
475
+ # The CompanyLocation class contains all returned company location data.
476
+ attr_reader :country, :state, :city, :postal_code
477
+ attr_reader :line1, :line2, :latitude, :longitude
478
+ end
479
+
480
+ class CompanySearchResult
481
+ attr_reader :companies, :total_results, :page
482
+ attr_reader :query, :credit_count
483
+ end
484
+
485
+ class PersonSearchResult
486
+ attr_reader :peoples, :total_results, :page
487
+ attr_reader :query, :credit_count
488
+ end
489
+
490
+ class LocalBusinessResult
491
+ attr_reader :businesses, :total_results, :page
492
+ attr_reader :query, :credit_count
493
+ end
494
+
495
+ # Configuration
496
+ class ClientConfig
497
+ attr_accessor :api_key, :base_url, :timeout, :max_retries
498
+ end
499
+
500
+ # Error classes
501
+ class CufinderError < StandardError; end
502
+ class AuthenticationError < CufinderError; end
503
+ class CreditLimitError < CufinderError; end
504
+ class NotFoundError < CufinderError; end
505
+ class PayloadError < CufinderError; end
506
+ class RateLimitError < CufinderError; end
507
+ class ServerError < CufinderError; end
508
+ class NetworkError < CufinderError; end
509
+ class ValidationError < CufinderError; end
510
+ class ApiError < CufinderError; end
511
+ ```
512
+
513
+ ## Support
514
+
515
+ For support, please open an issue on the [GitHub repository](https://github.com/cufinder/cufinder-ruby/issues).
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "cufinder-ruby"
3
- spec.version = "1.0.0"
3
+ spec.version = "1.2.0"
4
4
  spec.authors = ["CUFinder Team"]
5
5
  spec.email = ["support@cufinder.io"]
6
6
 
@@ -109,5 +109,53 @@ module Cufinder
109
109
  def lbs(**params)
110
110
  @services.search_local_businesses(params)
111
111
  end
112
+
113
+ def bcd(url:)
114
+ @services.extract_b2b_customers(url: url)
115
+ end
116
+
117
+ def ccp(url:)
118
+ @services.find_company_careers_page(url: url)
119
+ end
120
+
121
+ def isc(url:)
122
+ @services.is_saas(url: url)
123
+ end
124
+
125
+ def cbc(url:)
126
+ @services.get_company_business_type(url: url)
127
+ end
128
+
129
+ def csc(url:)
130
+ @services.get_company_mission_statement(url: url)
131
+ end
132
+
133
+ def csn(url:)
134
+ @services.get_company_snapshot(url: url)
135
+ end
136
+
137
+ def nao(phone:)
138
+ @services.normalize_phone(phone: phone)
139
+ end
140
+
141
+ def naa(address:)
142
+ @services.normalize_address(address: address)
143
+ end
144
+
145
+ def cef(query:, page:)
146
+ @services.find_company_employees(query: query, page: page)
147
+ end
148
+
149
+ def nac(company:)
150
+ @services.normalize_company_name(company: company)
151
+ end
152
+
153
+ def caa(query:, page:)
154
+ @services.get_company_activities(query: query, page: page)
155
+ end
156
+
157
+ def cja(**params)
158
+ @services.search_company_jobs(params)
159
+ end
112
160
  end
113
161
  end
@@ -164,6 +164,100 @@ module Cufinder
164
164
  response = @client.post("/lbs", params)
165
165
  LbsResponse.new(response)
166
166
  end
167
+
168
+ # BCD Service - B2B Customers Finder
169
+ def extract_b2b_customers(params)
170
+ validate_required(params, [:url])
171
+
172
+ response = @client.post("/bcd", params)
173
+ BcdResponse.new(response)
174
+ end
175
+
176
+ # CCP Service - Company Career Page Finder
177
+ def find_company_careers_page(params)
178
+ validate_required(params, [:url])
179
+
180
+ response = @client.post("/ccp", params)
181
+ CcpResponse.new(response)
182
+ end
183
+
184
+ # ISC Service - Company Saas Checker
185
+ def is_saas(params)
186
+ validate_required(params, [:url])
187
+
188
+ response = @client.post("/isc", params)
189
+ IscResponse.new(response)
190
+ end
191
+
192
+ # CBC Service - Company B2B or B2C Checker
193
+ def get_company_business_type(params)
194
+ validate_required(params, [:url])
195
+
196
+ response = @client.post("/cbc", params)
197
+ CbcResponse.new(response)
198
+ end
199
+
200
+ # CSC Service - Company Mission Statement
201
+ def get_company_mission_statement(params)
202
+ validate_required(params, [:url])
203
+
204
+ response = @client.post("/csc", params)
205
+ CscResponse.new(response)
206
+ end
207
+
208
+ # CSN Service - Company Snapshot
209
+ def get_company_snapshot(params)
210
+ validate_required(params, [:url])
211
+
212
+ response = @client.post("/csn", params)
213
+ CsnResponse.new(response)
214
+ end
215
+
216
+ # Nao Service - Phone Number Normalizer
217
+ def normalize_phone(params)
218
+ validate_required(params, [:phone])
219
+
220
+ response = @client.post("/nao", params)
221
+ NaoResponse.new(response)
222
+ end
223
+
224
+ # Naa Service - Address Normalizer
225
+ def normalize_address(params)
226
+ validate_required(params, [:address])
227
+
228
+ response = @client.post("/naa", params)
229
+ NaaResponse.new(response)
230
+ end
231
+
232
+ # CEF Service - Company Employees Finder
233
+ def find_company_employees(params)
234
+ validate_required(params, [:query, :page])
235
+
236
+ response = @client.post("/cef", params)
237
+ CefResponse.new(response)
238
+ end
239
+
240
+ # NAC Service - Company Name Normalizer
241
+ def normalize_company_name(params)
242
+ validate_required(params, [:company])
243
+
244
+ response = @client.post("/nac", params)
245
+ NacResponse.new(response)
246
+ end
247
+
248
+ # CAA Service - Company Activities API
249
+ def get_company_activities(params)
250
+ validate_required(params, [:query, :page])
251
+
252
+ response = @client.post("/caa", params)
253
+ CaaResponse.new(response)
254
+ end
255
+
256
+ # CJA Service - Company Jobs API
257
+ def search_company_jobs(params)
258
+ response = @client.post("/cja", params)
259
+ CjaResponse.new(response)
260
+ end
167
261
 
168
262
  private
169
263
 
@@ -518,4 +518,229 @@ module Cufinder
518
518
  @companies = (data["companies"] || []).map { |c| Company.new(c) }
519
519
  end
520
520
  end
521
+
522
+ class BcdResponse < BaseResponse
523
+ attr_accessor :customers
524
+
525
+ def initialize(data = {})
526
+ super(data)
527
+ @customers = data["customers"] || []
528
+ end
529
+ end
530
+
531
+ class CcpResponse < BaseResponse
532
+ attr_accessor :customers
533
+
534
+ def initialize(data = {})
535
+ super(data)
536
+ @careers_page_url = data["careers_page_url"]
537
+ end
538
+ end
539
+
540
+ class IscResponse < BaseResponse
541
+ attr_accessor :is_saas
542
+
543
+ def initialize(data = {})
544
+ super(data)
545
+ @is_saas = data["is_saas"]
546
+ end
547
+ end
548
+
549
+ class CbcResponse < BaseResponse
550
+ attr_accessor :business_type
551
+
552
+ def initialize(data = {})
553
+ super(data)
554
+ @business_type = data["business_type"]
555
+ end
556
+ end
557
+
558
+ class CscResponse < BaseResponse
559
+ attr_accessor :mission_statement
560
+
561
+ def initialize(data = {})
562
+ super(data)
563
+ @mission_statement = data["mission_statement"]
564
+ end
565
+ end
566
+
567
+ class CsnSnapshotInfo
568
+ attr_accessor :icp, :target_industries, :target_personas, :value_proposition
569
+
570
+ def initialize(data = {})
571
+ @icp = data["icp"]
572
+ @target_industries = data["target_industries"] || []
573
+ @target_personas = data["target_personas"]
574
+ @value_proposition = data["value_proposition"]
575
+ end
576
+ end
577
+
578
+ class CsnResponse < BaseResponse
579
+ attr_accessor :company_snapshot
580
+
581
+ def initialize(data = {})
582
+ super(data)
583
+ @company_snapshot = data["company_snapshot"] ? CsnSnapshotInfo.new(data["company_snapshot"]) : nil
584
+ end
585
+ end
586
+
587
+ class NaoResponse < BaseResponse
588
+ attr_accessor :phone
589
+
590
+ def initialize(data = {})
591
+ super(data)
592
+ @phone = data["phone"]
593
+ end
594
+ end
595
+
596
+ class NaaResponse < BaseResponse
597
+ attr_accessor :address
598
+
599
+ def initialize(data = {})
600
+ super(data)
601
+ @address = data["address"]
602
+ end
603
+ end
604
+
605
+ # CEF Employee
606
+ class CefEmployee
607
+ attr_accessor :full_name, :first_name, :last_name, :linkedin_url, :summary,
608
+ :avatar, :country, :state, :city, :job_title,
609
+ :job_title_categories, :company_name, :company_linkedin,
610
+ :company_website, :company_size, :company_industry,
611
+ :company_facebook, :company_twitter, :company_country,
612
+ :company_state, :company_city
613
+
614
+ def initialize(data = {})
615
+ @full_name = data["full_name"]
616
+ @first_name = data["first_name"]
617
+ @last_name = data["last_name"]
618
+ @linkedin_url = data["linkedin_url"]
619
+ @summary = data["summary"]
620
+ @avatar = data["avatar"]
621
+ @country = data["country"]
622
+ @state = data["state"]
623
+ @city = data["city"]
624
+ @job_title = data["job_title"]
625
+ @job_title_categories = data["job_title_categories"]
626
+ @company_name = data["company_name"]
627
+ @company_linkedin = data["company_linkedin"]
628
+ @company_website = data["company_website"]
629
+ @company_size = data["company_size"]
630
+ @company_industry = data["company_industry"]
631
+ @company_facebook = data["company_facebook"]
632
+ @company_twitter = data["company_twitter"]
633
+ @company_country = data["company_country"]
634
+ @company_state = data["company_state"]
635
+ @company_city = data["company_city"]
636
+ end
637
+ end
638
+
639
+ class CefResponse < BaseResponse
640
+ attr_accessor :employees
641
+
642
+ def initialize(data = {})
643
+ super(data)
644
+ @employees = (data["employees"] || []).map { |e| CefEmployee.new(e) }
645
+ end
646
+ end
647
+
648
+ class NacResponse < BaseResponse
649
+ attr_accessor :company
650
+
651
+ def initialize(data = {})
652
+ super(data)
653
+ @company = data["company"]
654
+ end
655
+ end
656
+
657
+ # CAA Activity
658
+ class CaaActivity
659
+ attr_accessor :activity_url, :activity_id, :author_name, :author_type, :author_url,
660
+ :activity_comments_count, :activity_hashtags, :activity_headline,
661
+ :activity_images, :activity_is_video, :activity_posted_at,
662
+ :activity_reactions_count, :activity_reposts_count, :activity_text,
663
+ :activity_top_comments, :activity_videos
664
+
665
+ def initialize(data = {})
666
+ @activity_url = data["activity_url"]
667
+ @activity_id = data["activity_id"]
668
+ @author_name = data["author_name"]
669
+ @author_type = data["author_type"]
670
+ @author_url = data["author_url"]
671
+ @activity_comments_count = data["activity_comments_count"]
672
+ @activity_hashtags = data["activity_hashtags"] || []
673
+ @activity_headline = data["activity_headline"]
674
+ @activity_images = data["activity_images"] || []
675
+ @activity_is_video = data["activity_is_video"]
676
+ @activity_posted_at = data["activity_posted_at"]
677
+ @activity_reactions_count = data["activity_reactions_count"]
678
+ @activity_reposts_count = data["activity_reposts_count"]
679
+ @activity_text = data["activity_text"]
680
+ @activity_top_comments = data["activity_top_comments"] || []
681
+ @activity_videos = data["activity_videos"] || []
682
+ end
683
+ end
684
+
685
+ class CaaResponse < BaseResponse
686
+ attr_accessor :activities
687
+
688
+ def initialize(data = {})
689
+ super(data)
690
+ @activities = (data["activities"] || []).map { |a| CaaActivity.new(a) }
691
+ end
692
+ end
693
+
694
+ # CJA Company (within job listing)
695
+ class CjaCompany
696
+ attr_accessor :name, :industry, :website, :linkedin, :followers_count,
697
+ :employees, :founded_date, :annual_revenue, :funding_amount,
698
+ :main_location
699
+
700
+ def initialize(data = {})
701
+ @name = data["name"]
702
+ @industry = data["industry"]
703
+ @website = data["website"]
704
+ @linkedin = data["linkedin"]
705
+ @followers_count = data["followers_count"]
706
+ @employees = data["employees"]
707
+ @founded_date = data["founded_date"]
708
+ @annual_revenue = data["annual_revenue"]
709
+ @funding_amount = data["funding_amount"]
710
+ @main_location = data["main_location"] ? MainLocation.new(data["main_location"]) : nil
711
+ end
712
+ end
713
+
714
+ # CJA Job listing
715
+ class CjaJob
716
+ attr_accessor :job_id, :title, :url, :location, :posted_at, :posted_at_text
717
+
718
+ def initialize(data = {})
719
+ @job_id = data["job_id"]
720
+ @title = data["title"]
721
+ @url = data["url"]
722
+ @location = data["location"]
723
+ @posted_at = data["posted_at"]
724
+ @posted_at_text = data["posted_at_text"]
725
+ end
726
+ end
727
+
728
+ # CJA Company Job (combined company + job)
729
+ class CompanyJob
730
+ attr_accessor :company, :job
731
+
732
+ def initialize(data = {})
733
+ @company = data["company"] ? CjaCompany.new(data["company"]) : nil
734
+ @job = data["job"] ? CjaJob.new(data["job"]) : nil
735
+ end
736
+ end
737
+
738
+ class CjaResponse < BaseResponse
739
+ attr_accessor :jobs
740
+
741
+ def initialize(data = {})
742
+ super(data)
743
+ @jobs = (data["jobs"] || []).map { |j| CompanyJob.new(j) }
744
+ end
745
+ end
521
746
  end
@@ -1,3 +1,3 @@
1
1
  module Cufinder
2
- VERSION = "1.0.0"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cufinder-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CUFinder Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-12 00:00:00.000000000 Z
11
+ date: 2026-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -89,6 +89,7 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
91
  - ".rspec"
92
+ - CHANGELOG.md
92
93
  - Gemfile
93
94
  - LICENSE
94
95
  - README.md