zelf-sdk 1.0.0 → 1.1.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: be165e235f7671006c27aae0337edc329110bf9258cd05605cc94a870ff1a3b0
4
- data.tar.gz: 740b0f1f5d79af41e7372b7ca334512f994814ee60b78416593dbcd783554fb1
3
+ metadata.gz: d948897bb81022c440c848f71c2ce80b9584399ba05f71c116851872dd02da00
4
+ data.tar.gz: 527540f8d27cbf861e2f0ce5074ac3c0dac4e63df46066adcbcf6b001bdee478
5
5
  SHA512:
6
- metadata.gz: a9ec10f087875657afc2b048aea894699ea106046927c241ecfd88b661e75deeb73146fa23d45ca78ebb3bb5c3ce50ef3efef0fe7d59443d1877a30283dea3c1
7
- data.tar.gz: dd02c43770515f577e624e7847072edc71e49f0920774ebd3e7b1667d9098dc522e404fb0eefe3276d9d75b72171acf156ab6fda5021b1c7d0c18ba75f8fbd26
6
+ metadata.gz: 24a574903b9793393e2d1bee281af5c79bd160204bbb1371e4daadaf81a13fbe0299e86cdd369be6bc2f85f59f83ff860db329a531795633bc964e759f7fa60f
7
+ data.tar.gz: 0ab78f10d9af08b4b357405fd2503a1a8d9dbefca7b93fdbca5c1f688c91b52d852fd8e1546d2dfc55cab6589d3a5fab047bcac4476097c935e5af90f1cc7c3f
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  # zelf-sdk (Ruby)
2
2
 
3
3
  Official client for the Zelf API. Part of
4
- [hellozelf/zelf-sdk](https://github.com/hellozelf/zelf-sdk), which holds the
5
- same client in eight languages.
4
+ [hellozelf/zelf-sdk](https://github.com/hellozelf/zelf-sdk).
6
5
 
7
6
  ## Install
8
7
 
data/lib/zelf/models.rb CHANGED
@@ -94,14 +94,18 @@ module Zelf
94
94
  class AiAnalysisCreateRequest < Zelf::Model; end
95
95
  class AiAnalysisResult < Zelf::Model; end
96
96
  class AiAnalysisRun < Zelf::Model; end
97
+ class AnalyticsBrand < Zelf::Model; end
97
98
  class Brand < Zelf::Model; end
98
99
  class BrandAccount < Zelf::Model; end
99
100
  class BrandAccountGroups < Zelf::Model; end
100
101
  class BrandAccountsWriteRequest < Zelf::Model; end
101
102
  class BrandCatalog < Zelf::Model; end
102
103
  class BrandCatalogItem < Zelf::Model; end
104
+ class BrandComparison < Zelf::Model; end
103
105
  class BrandCreateSubBrandRequest < Zelf::Model; end
106
+ class BrandFollowers < Zelf::Model; end
104
107
  class BrandKeywords < Zelf::Model; end
108
+ class BrandStatistics < Zelf::Model; end
105
109
  class Comment < Zelf::Model; end
106
110
  class CommentAuthor < Zelf::Model; end
107
111
  class Content < Zelf::Model; end
@@ -134,11 +138,18 @@ module Zelf
134
138
  class DetectionResult < Zelf::Model; end
135
139
  class DetectionSummary < Zelf::Model; end
136
140
  class DetectionVideo < Zelf::Model; end
141
+ class FollowerAccount < Zelf::Model; end
142
+ class FollowerPeriod < Zelf::Model; end
143
+ class FollowerTimeseries < Zelf::Model; end
137
144
  class PatchedBrandUpdateRequest < Zelf::Model; end
138
145
  class PatchedWebhookSubscriptionUpdateRequest < Zelf::Model; end
146
+ class PostedCommentCategory < Zelf::Model; end
147
+ class PostedComments < Zelf::Model; end
139
148
  class ResultFile < Zelf::Model; end
140
149
  class SafetyCheckRequest < Zelf::Model; end
141
150
  class Usage < Zelf::Model; end
151
+ class UsageDay < Zelf::Model; end
152
+ class UsageHistory < Zelf::Model; end
142
153
  class UsageScope < Zelf::Model; end
143
154
  class UsageWindow < Zelf::Model; end
144
155
  class WebhookAvailableEvent < Zelf::Model; end
@@ -213,6 +224,18 @@ module Zelf
213
224
  field :status, "status"
214
225
  end
215
226
 
227
+ # The brand a row of analytics belongs to.
228
+ class AnalyticsBrand
229
+ # Unique identifier for the brand
230
+ field :id, "id"
231
+ # Display name of the brand
232
+ field :title, "title"
233
+ # true for the brand the request named, false for a sub-brand
234
+ field :is_primary, "is_primary"
235
+ # COMPETITIVE or THEME for a sub-brand; null for the top-level brand the request named
236
+ field :sub_brand_type, "sub_brand_type"
237
+ end
238
+
216
239
  # A brand you can reach.
217
240
  class Brand
218
241
  # Unique identifier for the brand
@@ -233,7 +256,7 @@ module Zelf
233
256
  class BrandAccount
234
257
  # The account's handle
235
258
  field :username, "username"
236
- # instagram or tiktok
259
+ # instagram, tiktok or youtube
237
260
  field :platform, "platform"
238
261
  # The account's profile URL, when available
239
262
  field :external_url, "external_url"
@@ -256,7 +279,7 @@ module Zelf
256
279
  field :brand_id, "brand_id"
257
280
  # The list to modify: tracked, influencer, or owned for the brand's own profiles
258
281
  field :account_type, "account_type"
259
- # Profile URLs on a supported platform (instagram or tiktok)
282
+ # Profile URLs on a supported platform (instagram, tiktok or youtube)
260
283
  field :profile_urls, "profile_urls"
261
284
  end
262
285
 
@@ -290,6 +313,16 @@ module Zelf
290
313
  field :parent_id, "parent_id"
291
314
  end
292
315
 
316
+ # One brand's performance in the comparison.
317
+ class BrandComparison
318
+ # The brand this row covers
319
+ field :brand, "brand", cast: AnalyticsBrand
320
+ # Totals over the window
321
+ field :statistics, "statistics", cast: BrandStatistics
322
+ # Follower counts as they stand now, not over the window
323
+ field :followers, "followers", cast: BrandFollowers
324
+ end
325
+
293
326
  # Create a sub-brand under the workspace brand.
294
327
  class BrandCreateSubBrandRequest
295
328
  # Plain keywords the brand monitors across platforms, matched as-is (case-...
@@ -312,6 +345,14 @@ module Zelf
312
345
  field :sub_brand_type, "sub_brand_type"
313
346
  end
314
347
 
348
+ # Followers across the handles a brand owns.
349
+ class BrandFollowers
350
+ # Followers across every owned handle
351
+ field :total, "total"
352
+ # Per handle counts that add up to total
353
+ field :accounts, "accounts", cast: [FollowerAccount]
354
+ end
355
+
315
356
  # The terms this brand uses to monitor social platforms.
316
357
  class BrandKeywords
317
358
  # Plain keywords the brand monitors across platforms, matched as-is (case-...
@@ -330,13 +371,41 @@ module Zelf
330
371
  field :boolean_query, "boolean_query"
331
372
  end
332
373
 
374
+ # Totals over the content matched to a brand in the window.
375
+ class BrandStatistics
376
+ # Number of posts matched to the brand
377
+ field :post_count, "post_count"
378
+ # Total views across those posts
379
+ field :total_views, "total_views"
380
+ # Total likes across those posts
381
+ field :total_likes, "total_likes"
382
+ # Total comments across those posts
383
+ field :total_comments, "total_comments"
384
+ # Total shares across those posts
385
+ field :total_shares, "total_shares"
386
+ # Likes, comments and shares across those posts
387
+ field :total_engagement, "total_engagement"
388
+ # Estimated marketing value across those posts, in US cents
389
+ field :total_earned_media_value_cents, "total_earned_media_value_cents"
390
+ # Total engagement divided by total views
391
+ field :engagement_rate, "engagement_rate"
392
+ # Number of distinct creators who posted
393
+ field :unique_creator_count, "unique_creator_count"
394
+ # Engagement on positive posts
395
+ field :total_positive_nps, "total_positive_nps"
396
+ # Engagement on neutral posts
397
+ field :total_neutral_nps, "total_neutral_nps"
398
+ # Engagement on negative posts
399
+ field :total_negative_nps, "total_negative_nps"
400
+ end
401
+
333
402
  # A comment left on a piece of content.
334
403
  class Comment
335
404
  # Unique identifier for the comment
336
405
  field :id, "id"
337
406
  # The comment's text content
338
407
  field :text, "text"
339
- # The platform the comment was posted on
408
+ # The platform the comment was posted on: instagram, tiktok or youtube
340
409
  field :platform, "platform"
341
410
  # Number of likes the comment has received
342
411
  field :like_count, "like_count"
@@ -370,7 +439,7 @@ module Zelf
370
439
  field :id, "id"
371
440
  # The post's identifier on its platform
372
441
  field :platform_post_id, "platform_post_id"
373
- # The platform the content was published on
442
+ # The platform the content was published on: instagram, tiktok or youtube
374
443
  field :platform, "platform"
375
444
  # Whether the content is a video or an image
376
445
  field :content_form, "content_form"
@@ -875,6 +944,36 @@ module Zelf
875
944
  field :duration_s, "duration_s"
876
945
  end
877
946
 
947
+ # One owned handle and the followers it carries.
948
+ class FollowerAccount
949
+ # The platform the handle is on
950
+ field :platform, "platform"
951
+ # The handle
952
+ field :username, "username"
953
+ # Follower count for this handle
954
+ field :followers, "followers"
955
+ end
956
+
957
+ # Followers at the end of one period.
958
+ class FollowerPeriod
959
+ # Followers across every owned handle
960
+ field :followers, "followers"
961
+ # First day of the period
962
+ field :start_date, "start_date"
963
+ # Last day of the period
964
+ field :end_date, "end_date"
965
+ # Per handle counts that add up to followers
966
+ field :accounts, "accounts", cast: [FollowerAccount]
967
+ end
968
+
969
+ # One brand's follower history.
970
+ class FollowerTimeseries
971
+ # The brand this row covers
972
+ field :brand, "brand", cast: AnalyticsBrand
973
+ # One entry per period, oldest first
974
+ field :periods, "periods", cast: [FollowerPeriod]
975
+ end
976
+
878
977
  # Partial update for a brand's monitoring keywords. Every field is optional, and only
879
978
  # the supplied fields are changed, but at least one field is required.
880
979
  class PatchedBrandUpdateRequest
@@ -912,6 +1011,26 @@ module Zelf
912
1011
  field :enabled, "enabled"
913
1012
  end
914
1013
 
1014
+ # Comments the brand posted on one category of content.
1015
+ class PostedCommentCategory
1016
+ # brand, owned, competitors, themes or other
1017
+ field :category, "category"
1018
+ # Comments posted on this category
1019
+ field :comments, "comments"
1020
+ # Likes those comments received
1021
+ field :likes, "likes"
1022
+ # Replies those comments received
1023
+ field :replies, "replies"
1024
+ end
1025
+
1026
+ # Comments the brand posted, split by the content they were posted on.
1027
+ class PostedComments
1028
+ # Comments the brand posted in the window, across every category
1029
+ field :total_comments_posted, "total_comments_posted"
1030
+ # One entry per category
1031
+ field :categories, "categories", cast: [PostedCommentCategory]
1032
+ end
1033
+
915
1034
  # Signed, time-limited download of an analysis run's result payload.
916
1035
  class ResultFile
917
1036
  # Unix epoch seconds after which download_url expires
@@ -938,24 +1057,58 @@ module Zelf
938
1057
  field :brand_id, "brand_id"
939
1058
  # api_key or mcp, whichever made this call
940
1059
  field :authenticated_as, "authenticated_as"
941
- # Keyed by group
942
- field :scopes, "scopes"
1060
+ # One entry per metered group
1061
+ field :scopes, "scopes", cast: [UsageScope]
1062
+ # What was actually spent, day by day, from the usage ledger
1063
+ field :history, "history", cast: UsageHistory
1064
+ end
1065
+
1066
+ # One day of consumption for one source.
1067
+ class UsageDay
1068
+ # api for direct requests, mcp for AI clients
1069
+ field :source, "source"
1070
+ # Every counted call that day
1071
+ field :general, "general"
1072
+ # Calls counted against the AI analysis group
1073
+ field :ai_analysis, "ai_analysis"
1074
+ # Calls counted against creator vetting
1075
+ field :creator_vetting, "creator_vetting"
1076
+ # Calls counted against data records
1077
+ field :data_records, "data_records"
1078
+ # Records those calls returned
1079
+ field :data_records_items, "data_records_items"
1080
+ # The day, in the brand's billing timezone
1081
+ field :date, "date"
1082
+ end
1083
+
1084
+ # Daily consumption over the window the ledger keeps.
1085
+ class UsageHistory
1086
+ # First day covered
1087
+ field :start_date, "start_date"
1088
+ # Last day covered
1089
+ field :end_date, "end_date"
1090
+ # One entry per day and source that saw usage, oldest first
1091
+ field :days, "days", cast: [UsageDay]
943
1092
  end
944
1093
 
945
1094
  # One metered group, with every window that has a limit.
946
1095
  class UsageScope
1096
+ # Identifier of the metered group
1097
+ field :scope, "scope"
947
1098
  # Name of the group, as an admin sees it
948
1099
  field :human_name, "human_name"
949
1100
  # request counts calls; item counts rows returned
950
1101
  field :kind, "kind"
951
1102
  # Which product the group meters: api for direct requests, mcp for AI clients
952
1103
  field :section, "section"
953
- # Keyed by window: rps, rpm, rph, rpd, rpmonth, or the item windows
954
- field :windows, "windows"
1104
+ # Every window that has a limit configured
1105
+ field :windows, "windows", cast: [UsageWindow]
955
1106
  end
956
1107
 
957
1108
  # Consumption of one window, e.g. requests in the current hour.
958
1109
  class UsageWindow
1110
+ # Which window this is: rps, rpm, rph, rpd, rpmonth, or an item window
1111
+ field :window, "window"
959
1112
  # Most that may be spent in this window
960
1113
  field :limit, "limit"
961
1114
  # Spent so far in this window
@@ -966,7 +1119,7 @@ module Zelf
966
1119
  field :reset_in, "reset_in"
967
1120
  end
968
1121
 
969
- # The WebhookAvailableEvent object.
1122
+ # An event type a subscription may ask for.
970
1123
  class WebhookAvailableEvent
971
1124
  # Event type identifier, e.g
972
1125
  field :event, "event"
@@ -991,7 +1144,7 @@ module Zelf
991
1144
  field :items, "items"
992
1145
  end
993
1146
 
994
- # The WebhookDeleteAcknowledgement object.
1147
+ # Confirmation that a webhook resource was deleted.
995
1148
  class WebhookDeleteAcknowledgement
996
1149
  # Always true; confirms the webhook resource delete was acknowledged
997
1150
  field :acknowledged, "acknowledged"
@@ -1001,7 +1154,7 @@ module Zelf
1001
1154
  field :status, "status"
1002
1155
  end
1003
1156
 
1004
- # The WebhookDelivery object.
1157
+ # One attempt to deliver one push, with its outcome.
1005
1158
  class WebhookDelivery
1006
1159
  # Encoded identifier of the webhook delivery
1007
1160
  field :id, "id"
@@ -1033,9 +1186,8 @@ module Zelf
1033
1186
  field :modified, "modified", cast: :time
1034
1187
  end
1035
1188
 
1036
- # One downloadable snapshot file in a manifest push. A delivery currently consists of
1037
- # a single file, so `files` carries one entry. The array shape allows a snapshot to be
1038
- # sharded across several files in the future without changing the envelope.
1189
+ # One downloadable snapshot file in a manifest push. `files` is an array, so read
1190
+ # every entry rather than assuming one.
1039
1191
  class WebhookFile
1040
1192
  # File encoding
1041
1193
  field :format, "format"
@@ -1077,7 +1229,7 @@ module Zelf
1077
1229
  field :data, "data", cast: WebhookData
1078
1230
  end
1079
1231
 
1080
- # The WebhookSecret object.
1232
+ # A signing secret, identified by its prefix rather than its value.
1081
1233
  class WebhookSecret
1082
1234
  # Encoded identifier of the webhook secret
1083
1235
  field :id, "id"
@@ -1103,7 +1255,8 @@ module Zelf
1103
1255
  field :make_default, "make_default"
1104
1256
  end
1105
1257
 
1106
- # The WebhookSecretCreated object.
1258
+ # A secret just created or rotated, carrying the value once. Store it now: later reads
1259
+ # return the prefix alone.
1107
1260
  class WebhookSecretCreated
1108
1261
  # Encoded identifier of the webhook secret
1109
1262
  field :id, "id"
@@ -1123,7 +1276,7 @@ module Zelf
1123
1276
  field :secret, "secret"
1124
1277
  end
1125
1278
 
1126
- # The WebhookSubscription object.
1279
+ # A registered endpoint and the events it receives.
1127
1280
  class WebhookSubscription
1128
1281
  # Encoded identifier of the webhook subscription
1129
1282
  field :id, "id"
@@ -1179,7 +1332,8 @@ module Zelf
1179
1332
  field :secret_type, "secret_type"
1180
1333
  end
1181
1334
 
1182
- # The WebhookSubscriptionCreated object.
1335
+ # A subscription just created, with the signing secret attached. The secret is shown
1336
+ # on this response only and never again.
1183
1337
  class WebhookSubscriptionCreated
1184
1338
  # Encoded identifier of the webhook subscription
1185
1339
  field :id, "id"
@@ -0,0 +1,72 @@
1
+ # Generated by codegen. Do not edit by hand.
2
+ module Zelf
3
+ module Resources
4
+ # The analytics endpoints.
5
+ class Analytics
6
+ def initialize(transport)
7
+ @transport = transport
8
+ end
9
+
10
+ # Compare Brand Performance. Returns one row of totals per brand: the top-level brand
11
+ # named by `brand_id`, followed by each of its competitor sub-brands. The statistics
12
+ # block matches `content.statistics`, so the same parsing works for both. `brand_id`
13
+ # must name a top-level brand. A sub-brand is refused with the id of the parent to use
14
+ # instead.
15
+ #
16
+ # Calls GET /api/v1/analytics/brand_comparison/ (analytics.brand_comparison).
17
+ def brand_comparison(brand_id:, platform: nil, posted_after: nil, posted_before: nil, posted_within_days: nil, posted_within_hours: nil)
18
+ query = {
19
+ "brand_id" => brand_id,
20
+ "platform" => platform,
21
+ "posted_after" => posted_after,
22
+ "posted_before" => posted_before,
23
+ "posted_within_days" => posted_within_days,
24
+ "posted_within_hours" => posted_within_hours,
25
+ }.reject { |_, value| value.nil? }
26
+ envelope = @transport.request(:get, "/api/v1/analytics/brand_comparison/", query: query)
27
+ Zelf.one(envelope, Models::BrandComparison, "BrandComparison")
28
+ end
29
+
30
+ # Get Brand Follower Time Series. Returns follower history for the top-level brand
31
+ # named by `brand_id` and each of its competitor sub-brands, bucketed by `period`. A
32
+ # brand appears only for the periods in which one of its owned handles was measured.
33
+ # Follower counts carry forward: a handle with no reading in a period keeps the last
34
+ # one recorded before it.
35
+ #
36
+ # Calls GET /api/v1/analytics/follower_timeseries/ (analytics.follower_timeseries).
37
+ def follower_timeseries(brand_id:, period: nil, platform: nil, posted_after: nil, posted_before: nil, posted_within_days: nil, posted_within_hours: nil)
38
+ query = {
39
+ "brand_id" => brand_id,
40
+ "period" => period,
41
+ "platform" => platform,
42
+ "posted_after" => posted_after,
43
+ "posted_before" => posted_before,
44
+ "posted_within_days" => posted_within_days,
45
+ "posted_within_hours" => posted_within_hours,
46
+ }.reject { |_, value| value.nil? }
47
+ envelope = @transport.request(:get, "/api/v1/analytics/follower_timeseries/", query: query)
48
+ Zelf.one(envelope, Models::FollowerTimeseries, "FollowerTimeseries")
49
+ end
50
+
51
+ # Get Posted Comment Analytics. Returns the comments the brand posted in the window,
52
+ # grouped by the kind of content they were posted on, together with the likes and
53
+ # replies those comments received. These are comments the brand wrote, not comments
54
+ # left on its content; `comments.list` returns the latter. The five categories add up
55
+ # to `total_comments_posted`.
56
+ #
57
+ # Calls GET /api/v1/analytics/posted_comments/ (analytics.posted_comments).
58
+ def posted_comments(brand_id:, platform: nil, posted_after: nil, posted_before: nil, posted_within_days: nil, posted_within_hours: nil)
59
+ query = {
60
+ "brand_id" => brand_id,
61
+ "platform" => platform,
62
+ "posted_after" => posted_after,
63
+ "posted_before" => posted_before,
64
+ "posted_within_days" => posted_within_days,
65
+ "posted_within_hours" => posted_within_hours,
66
+ }.reject { |_, value| value.nil? }
67
+ envelope = @transport.request(:get, "/api/v1/analytics/posted_comments/", query: query)
68
+ Zelf.one(envelope, Models::PostedComments, "PostedComments")
69
+ end
70
+ end
71
+ end
72
+ end
@@ -39,16 +39,16 @@ module Zelf
39
39
  Zelf::Page.new(envelope, Models::Content, @transport, path, query)
40
40
  end
41
41
 
42
- # Create Creator Vetting. Vets a creator identified by `profile_url`, running or
43
- # reusing the profile scrape and the AI safety and brand-fit analysis. Runs complete
44
- # asynchronously, so this method returns immediately with the created vetting. The
45
- # vetting analyzes up to 150 of the creator's posts per connection type, or the limit
46
- # configured for your workspace. The created vetting is returned as the single item in
47
- # `results`. Take its `id` and poll `creator_vetting.list` until a run reports
48
- # `COMPLETED`. A vetting can take an hour or more to complete, so prefer the
49
- # `creator_vetting.completed` webhook over frequent polling, which can trigger
50
- # `RATE_LIMIT_EXCEEDED`. Once a run is complete, retrieve the payload from
51
- # `creator_vetting.results`, passing `vetting_id=<id>`.
42
+ # Create Creator Vetting. Vets a creator identified by `profile_url`, retrieving the
43
+ # profile and scoring its safety and brand fit. Runs complete asynchronously, so this
44
+ # method returns immediately with the created vetting. The vetting analyzes up to 150
45
+ # of the creator's posts per connection type, or the limit configured for your
46
+ # workspace. The created vetting is returned as the single item in `results`. Take its
47
+ # `id` and poll `creator_vetting.list` until a run reports `COMPLETED`. A vetting can
48
+ # take an hour or more to complete, so prefer the `creator_vetting.completed` webhook
49
+ # over frequent polling, which can trigger `RATE_LIMIT_EXCEEDED`. Once a run is
50
+ # complete, retrieve the payload from `creator_vetting.results`, passing
51
+ # `vetting_id=<id>`.
52
52
  #
53
53
  # Calls POST /api/v1/creator/vetting/ (creator_vetting.create).
54
54
  def create(profile_url:, resync_profile: nil, content_scope: nil, safety_checks: nil)
data/lib/zelf/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # Generated by codegen. Do not edit by hand.
2
2
 
3
3
  module Zelf
4
- VERSION = '1.0.0'.freeze
4
+ VERSION = '1.1.0'.freeze
5
5
  end
data/lib/zelf.rb CHANGED
@@ -7,6 +7,7 @@ require_relative 'zelf/transport'
7
7
  require_relative 'zelf/page'
8
8
  require_relative 'zelf/webhooks'
9
9
  require_relative 'zelf/resources/ai_analysis'
10
+ require_relative 'zelf/resources/analytics'
10
11
  require_relative 'zelf/resources/brand_accounts'
11
12
  require_relative 'zelf/resources/brands'
12
13
  require_relative 'zelf/resources/comments'
@@ -19,7 +20,7 @@ require_relative 'zelf/resources/sub_brands'
19
20
  require_relative 'zelf/resources/usage'
20
21
  require_relative 'zelf/resources/webhooks'
21
22
 
22
- # Ruby client for the ZelfAI APIs (spec version 1.0.0).
23
+ # Ruby client for the ZelfAI APIs (spec version 1.1.0).
23
24
  module Zelf
24
25
  # Client for the ZelfAI APIs.
25
26
  #
@@ -27,7 +28,7 @@ module Zelf
27
28
  # ZELF_API_KEY environment variable. It is sent as the x-api-key header
28
29
  # and is kept out of inspect output.
29
30
  class Client
30
- attr_reader :ai_analysis, :brand_accounts, :brands, :comments, :content, :creator_sync, :creator_vetting, :creators, :detection, :sub_brands, :usage, :webhooks
31
+ attr_reader :ai_analysis, :analytics, :brand_accounts, :brands, :comments, :content, :creator_sync, :creator_vetting, :creators, :detection, :sub_brands, :usage, :webhooks
31
32
 
32
33
  def initialize(api_key: nil, base_url: nil, timeout: 60,
33
34
  max_retries: 2, retry_writes: false, headers: {})
@@ -35,6 +36,7 @@ module Zelf
35
36
  max_retries: max_retries, retry_writes: retry_writes,
36
37
  headers: headers)
37
38
  @ai_analysis = Resources::AiAnalysis.new(@transport)
39
+ @analytics = Resources::Analytics.new(@transport)
38
40
  @brand_accounts = Resources::BrandAccounts.new(@transport)
39
41
  @brands = Resources::Brands.new(@transport)
40
42
  @comments = Resources::Comments.new(@transport)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zelf-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zelf
@@ -22,6 +22,7 @@ files:
22
22
  - lib/zelf/models.rb
23
23
  - lib/zelf/page.rb
24
24
  - lib/zelf/resources/ai_analysis.rb
25
+ - lib/zelf/resources/analytics.rb
25
26
  - lib/zelf/resources/brand_accounts.rb
26
27
  - lib/zelf/resources/brands.rb
27
28
  - lib/zelf/resources/comments.rb