cufinder-ruby 1.2.0 → 1.3.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: 44b98b86c620454eac62fab4ba87a4c2e49aaa710d4096825932e6294d037bd9
4
- data.tar.gz: 574b9c457d9a3fbbbc0602617ba323ba7930499055b485ec162763185dce5305
3
+ metadata.gz: cc7f5e63b564fee6e9888b8bd083c59d0d68a706c30347e577ac5ca5c16156ae
4
+ data.tar.gz: 287db7dcf6eee9afe5accc262dbbc2bfaa12b3f66cac1579fa6241aba21674e0
5
5
  SHA512:
6
- metadata.gz: 2a786c6a1b6f151223eff85114283d736e24e93ee0e946b0eac1900a2b57952261ee7eccb947ca5129fc735ba636c5d259c2cd0ff21aa4a54597801db5bd48c1
7
- data.tar.gz: 29967a91c181832949a7f9092d96507a3a4cad5bc140cfb5d262fdf2f2b0a0c203d109c790893593a2f22813b16381fcc7d22d125367f2e006db3115f55ae5cc
6
+ metadata.gz: 9312069155fbf85312c434e7f7b5e1609146b4bbfe4953d19868b67a9ac4fb43471e47209125612dde3612d42050304531b0e3cd36e748dc6ba92b2e14f4116e
7
+ data.tar.gz: 705a265b7dd088a5baf4b228006f724e9b34d894906b9cf9605f983925aa1aa322ad3386157d45a43904085ba409a12ec9e2d28d92fc642663565b864d607264
data/CHANGELOG.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # Cufinder Ruby SDK Changelog
2
2
 
3
3
 
4
+ ## 1.3.0 (August 16, 2026)
5
+
6
+ #### Features
7
+ - **New V2 API services**: Add new V2 services including `PSA`, `CSA`, `JCA`, `CLF`, `NAP`, `NAU`, `GDC` and `COT`
8
+
9
+
4
10
  ## 1.2.0 (June 21, 2026)
5
11
 
6
12
  #### Features
data/README.md CHANGED
@@ -53,7 +53,7 @@ client = Cufinder::Client.new(
53
53
 
54
54
  ## API Reference
55
55
 
56
- This SDK covers all 32 Cufinder API (v2) endpoints:
56
+ This SDK covers all 40 Cufinder API (v2) endpoints:
57
57
 
58
58
  - **CUF** - [Company Name to Domain](https://apidoc.cufinder.io/apis/company-name-to-domain)
59
59
  - **LCUF** - [LinkedIn Company URL Finder](https://apidoc.cufinder.io/apis/company-linkedin-url-finder)
@@ -87,6 +87,14 @@ This SDK covers all 32 Cufinder API (v2) endpoints:
87
87
  - **NAC** - [Company Name Normalizer](https://apidoc.cufinder.io/apis/company-name-normalizer)
88
88
  - **CAA** - [Company Activities API](https://apidoc.cufinder.io/apis/company-activities-api)
89
89
  - **CJA** - [Company Jobs API](https://apidoc.cufinder.io/apis/company-jobs-api)
90
+ - **PSA** - [Contact Signals API](https://apidoc.cufinder.io/apis/contact-signals-api)
91
+ - **CSA** - [Company Signals API](https://apidoc.cufinder.io/apis/company-signals-api)
92
+ - **JCA** - [Job Changes API](https://apidoc.cufinder.io/apis/job-changes-api)
93
+ - **CLF** - [Contact Lookalikes API](https://apidoc.cufinder.io/apis/contact-lookalikes-api)
94
+ - **NAP** - [Person Name Normalizer](https://apidoc.cufinder.io/apis/person-name-normalizer)
95
+ - **NAU** - [URL Normalizer](https://apidoc.cufinder.io/apis/url-normalizer)
96
+ - **GDC** - [Gives Demo Checker](https://apidoc.cufinder.io/apis/gives-demo-checker)
97
+ - **COT** - [Offers Free Trial Checker](https://apidoc.cufinder.io/apis/offers-free-trial-checker)
90
98
 
91
99
 
92
100
  **CUF - Company Name to Domain**
@@ -389,6 +397,86 @@ result = client.cja(name: "google", country: "united states", page: 1)
389
397
  puts result
390
398
  ```
391
399
 
400
+ **PSA - Contact Signals API**
401
+
402
+ Returns contacts based on company signals
403
+
404
+ ```ruby
405
+ result = client.psa(signal_name: "employee_growth", time_frame: 90, bucket: "high", page: 1)
406
+ result.contacts.each do |contact|
407
+ puts "#{contact.full_name} - #{contact.company['name']}"
408
+ end
409
+ ```
410
+
411
+ **CSA - Company Signals API**
412
+
413
+ Returns companies based on signals
414
+
415
+ ```ruby
416
+ result = client.csa(signal_name: "employee_growth", time_frame: 90, bucket: "high", page: 1)
417
+ result.companies.each do |company|
418
+ puts "#{company.name} - #{company.domain}"
419
+ end
420
+ ```
421
+
422
+ **JCA - Job Changes API**
423
+
424
+ Returns job changes within a date range
425
+
426
+ ```ruby
427
+ result = client.jca(start_date: "2026-01-01", end_date: "2026-08-16", type: "promotion")
428
+ result.job_changes.each do |change|
429
+ puts "#{change.type}: #{change.from.title} -> #{change.to.title}"
430
+ end
431
+ ```
432
+
433
+ **CLF - Contact Lookalikes API**
434
+
435
+ Returns similar contacts based on a query
436
+
437
+ ```ruby
438
+ result = client.clf(query: "linkedin.com/in/mortezaheydari1997")
439
+ result.profiles.each do |profile|
440
+ puts "#{profile.full_name} - #{profile.company_name}"
441
+ end
442
+ ```
443
+
444
+ **NAP - Person Name Normalizer**
445
+
446
+ Normalizes a person name
447
+
448
+ ```ruby
449
+ result = client.nap(person_name: "morteza heydari")
450
+ puts result.normalized_name
451
+ ```
452
+
453
+ **NAU - URL Normalizer**
454
+
455
+ Normalizes a URL
456
+
457
+ ```ruby
458
+ result = client.nau(url: "https://www.cufinder.io/about-us")
459
+ puts result.normalized_url
460
+ ```
461
+
462
+ **GDC - Gives Demo Checker**
463
+
464
+ Checks if a company offers demos
465
+
466
+ ```ruby
467
+ result = client.gdc(url: "https://www.stripe.com")
468
+ puts result.offers_demo
469
+ ```
470
+
471
+ **COT - Offers Free Trial Checker**
472
+
473
+ Checks if a company offers a free trial
474
+
475
+ ```ruby
476
+ result = client.cot(url: "https://www.stripe.com")
477
+ puts result.offers_free_trial
478
+ ```
479
+
392
480
  ## Error Handling
393
481
 
394
482
  The SDK provides comprehensive error handling with custom error types:
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "cufinder-ruby"
3
- spec.version = "1.2.0"
3
+ spec.version = "1.3.0"
4
4
  spec.authors = ["CUFinder Team"]
5
5
  spec.email = ["support@cufinder.io"]
6
6
 
@@ -157,5 +157,37 @@ module Cufinder
157
157
  def cja(**params)
158
158
  @services.search_company_jobs(params)
159
159
  end
160
+
161
+ def psa(**params)
162
+ @services.get_contact_signals(params)
163
+ end
164
+
165
+ def csa(**params)
166
+ @services.get_company_signals(params)
167
+ end
168
+
169
+ def jca(**params)
170
+ @services.get_job_changes(params)
171
+ end
172
+
173
+ def clf(**params)
174
+ @services.find_contact_lookalikes(params)
175
+ end
176
+
177
+ def nap(**params)
178
+ @services.normalize_person_name(params)
179
+ end
180
+
181
+ def nau(**params)
182
+ @services.normalize_url(params)
183
+ end
184
+
185
+ def gdc(**params)
186
+ @services.gives_demo(params)
187
+ end
188
+
189
+ def cot(**params)
190
+ @services.offers_free_trial(params)
191
+ end
160
192
  end
161
193
  end
@@ -258,6 +258,70 @@ module Cufinder
258
258
  response = @client.post("/cja", params)
259
259
  CjaResponse.new(response)
260
260
  end
261
+
262
+ # PSA Service - Contact Signals API
263
+ def get_contact_signals(params)
264
+ validate_required(params, [:signal_name, :time_frame, :bucket])
265
+
266
+ response = @client.post("/psa", params)
267
+ PsaResponse.new(response)
268
+ end
269
+
270
+ # CSA Service - Company Signals API
271
+ def get_company_signals(params)
272
+ validate_required(params, [:signal_name, :time_frame, :bucket])
273
+
274
+ response = @client.post("/csa", params)
275
+ CsaResponse.new(response)
276
+ end
277
+
278
+ # JCA Service - Job Changes API
279
+ def get_job_changes(params)
280
+ validate_required(params, [:start_date, :end_date])
281
+
282
+ response = @client.post("/jca", params)
283
+ JcaResponse.new(response)
284
+ end
285
+
286
+ # CLF Service - Contact Lookalikes API
287
+ def find_contact_lookalikes(params)
288
+ validate_required(params, [:query])
289
+
290
+ response = @client.post("/clf", params)
291
+ ClfResponse.new(response)
292
+ end
293
+
294
+ # NAP Service - Person Name Normalizer
295
+ def normalize_person_name(params)
296
+ validate_required(params, [:person_name])
297
+
298
+ response = @client.post("/nap", params)
299
+ NapResponse.new(response)
300
+ end
301
+
302
+ # NAU Service - URL Normalizer
303
+ def normalize_url(params)
304
+ validate_required(params, [:url])
305
+
306
+ response = @client.post("/nau", params)
307
+ NauResponse.new(response)
308
+ end
309
+
310
+ # GDC Service - Gives Demo Checker
311
+ def gives_demo(params)
312
+ validate_required(params, [:url])
313
+
314
+ response = @client.post("/gdc", params)
315
+ GdcResponse.new(response)
316
+ end
317
+
318
+ # COT Service - Offers Free Trial Checker
319
+ def offers_free_trial(params)
320
+ validate_required(params, [:url])
321
+
322
+ response = @client.post("/cot", params)
323
+ CotResponse.new(response)
324
+ end
261
325
 
262
326
  private
263
327
 
@@ -743,4 +743,186 @@ module Cufinder
743
743
  @jobs = (data["jobs"] || []).map { |j| CompanyJob.new(j) }
744
744
  end
745
745
  end
746
+
747
+ # Signal model
748
+ class Signal
749
+ attr_accessor :name, :time_frame, :bucket
750
+
751
+ def initialize(data = {})
752
+ @name = data["name"]
753
+ @time_frame = data["time_frame"]
754
+ @bucket = data["bucket"]
755
+ end
756
+ end
757
+
758
+ # PSA Contact Signal
759
+ class ContactSignal
760
+ attr_accessor :full_name, :current_job, :company, :location, :social, :signal
761
+
762
+ def initialize(data = {})
763
+ @full_name = data["full_name"]
764
+ @current_job = data["current_job"]
765
+ @company = data["company"]
766
+ @location = data["location"]
767
+ @social = data["social"]
768
+ @signal = data["signal"] ? Signal.new(data["signal"]) : nil
769
+ end
770
+ end
771
+
772
+ class PsaResponse < BaseResponse
773
+ attr_accessor :contacts
774
+
775
+ def initialize(data = {})
776
+ super(data)
777
+ @contacts = (data["contacts"] || []).map { |c| ContactSignal.new(c) }
778
+ end
779
+ end
780
+
781
+ # CSA Company Signal
782
+ class CompanySignal
783
+ attr_accessor :name, :website, :domain, :employees, :industry, :overview,
784
+ :type, :main_location, :social, :signal
785
+
786
+ def initialize(data = {})
787
+ @name = data["name"]
788
+ @website = data["website"]
789
+ @domain = data["domain"]
790
+ @employees = data["employees"]
791
+ @industry = data["industry"]
792
+ @overview = data["overview"]
793
+ @type = data["type"]
794
+ @main_location = data["main_location"] ? MainLocation.new(data["main_location"]) : nil
795
+ @social = data["social"]
796
+ @signal = data["signal"] ? Signal.new(data["signal"]) : nil
797
+ end
798
+ end
799
+
800
+ class CsaResponse < BaseResponse
801
+ attr_accessor :companies
802
+
803
+ def initialize(data = {})
804
+ super(data)
805
+ @companies = (data["companies"] || []).map { |c| CompanySignal.new(c) }
806
+ end
807
+ end
808
+
809
+ # JCA Job Change company snapshot
810
+ class JobChangeCompanySnapshot
811
+ attr_accessor :company_linkedin_url, :company_linkedin_id, :company_name, :title
812
+
813
+ def initialize(data = {})
814
+ @company_linkedin_url = data["company_linkedin_url"]
815
+ @company_linkedin_id = data["company_linkedin_id"]
816
+ @company_name = data["company_name"]
817
+ @title = data["title"]
818
+ end
819
+ end
820
+
821
+ # JCA Job Change
822
+ class JobChange
823
+ attr_accessor :type, :linkedin_url, :detected_at, :from, :to
824
+
825
+ def initialize(data = {})
826
+ @type = data["type"]
827
+ @linkedin_url = data["linkedin_url"]
828
+ @detected_at = data["detected_at"]
829
+ @from = data["from"] ? JobChangeCompanySnapshot.new(data["from"]) : nil
830
+ @to = data["to"] ? JobChangeCompanySnapshot.new(data["to"]) : nil
831
+ end
832
+ end
833
+
834
+ class JcaResponse < BaseResponse
835
+ attr_accessor :job_changes
836
+
837
+ def initialize(data = {})
838
+ super(data)
839
+ @job_changes = (data["job_changes"] || []).map { |j| JobChange.new(j) }
840
+ end
841
+ end
842
+
843
+ # CLF Contact Lookalike profile
844
+ class ClfProfile
845
+ attr_accessor :first_name, :last_name, :full_name, :linkedin_url, :summary,
846
+ :followers_count, :facebook, :twitter, :avatar, :country, :state,
847
+ :city, :job_title, :job_title_categories, :company_name,
848
+ :company_linkedin, :company_website, :company_size,
849
+ :company_industry, :company_facebook, :company_twitter,
850
+ :company_country, :company_state, :company_city
851
+
852
+ def initialize(data = {})
853
+ @first_name = data["first_name"]
854
+ @last_name = data["last_name"]
855
+ @full_name = data["full_name"]
856
+ @linkedin_url = data["linkedin_url"]
857
+ @summary = data["summary"]
858
+ @followers_count = data["followers_count"]
859
+ @facebook = data["facebook"]
860
+ @twitter = data["twitter"]
861
+ @avatar = data["avatar"]
862
+ @country = data["country"]
863
+ @state = data["state"]
864
+ @city = data["city"]
865
+ @job_title = data["job_title"]
866
+ @job_title_categories = data["job_title_categories"]
867
+ @company_name = data["company_name"]
868
+ @company_linkedin = data["company_linkedin"]
869
+ @company_website = data["company_website"]
870
+ @company_size = data["company_size"]
871
+ @company_industry = data["company_industry"]
872
+ @company_facebook = data["company_facebook"]
873
+ @company_twitter = data["company_twitter"]
874
+ @company_country = data["company_country"]
875
+ @company_state = data["company_state"]
876
+ @company_city = data["company_city"]
877
+ end
878
+ end
879
+
880
+ class ClfResponse < BaseResponse
881
+ attr_accessor :profiles
882
+
883
+ def initialize(data = {})
884
+ super(data)
885
+ @profiles = (data["profiles"] || []).map { |p| ClfProfile.new(p) }
886
+ end
887
+ end
888
+
889
+ # NAP - Person Name Normalizer
890
+ class NapResponse < BaseResponse
891
+ attr_accessor :normalized_name
892
+
893
+ def initialize(data = {})
894
+ super(data)
895
+ @normalized_name = data["normalized_name"]
896
+ end
897
+ end
898
+
899
+ # NAU - URL Normalizer
900
+ class NauResponse < BaseResponse
901
+ attr_accessor :normalized_url
902
+
903
+ def initialize(data = {})
904
+ super(data)
905
+ @normalized_url = data["normalized_url"]
906
+ end
907
+ end
908
+
909
+ # GDC - Gives Demo Checker
910
+ class GdcResponse < BaseResponse
911
+ attr_accessor :offers_demo
912
+
913
+ def initialize(data = {})
914
+ super(data)
915
+ @offers_demo = data["offers_demo"]
916
+ end
917
+ end
918
+
919
+ # COT - Offers Free Trial Checker
920
+ class CotResponse < BaseResponse
921
+ attr_accessor :offers_free_trial
922
+
923
+ def initialize(data = {})
924
+ super(data)
925
+ @offers_free_trial = data["offers_free_trial"]
926
+ end
927
+ end
746
928
  end
@@ -1,3 +1,3 @@
1
1
  module Cufinder
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.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.2.0
4
+ version: 1.3.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: 2026-06-21 00:00:00.000000000 Z
11
+ date: 2026-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty