zelf-sdk 1.0.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 +7 -0
- data/LICENSE +202 -0
- data/README.md +119 -0
- data/lib/zelf/errors.rb +101 -0
- data/lib/zelf/model.rb +57 -0
- data/lib/zelf/models.rb +1213 -0
- data/lib/zelf/page.rb +114 -0
- data/lib/zelf/resources/ai_analysis.rb +110 -0
- data/lib/zelf/resources/brand_accounts.rb +65 -0
- data/lib/zelf/resources/brands.rb +83 -0
- data/lib/zelf/resources/comments.rb +33 -0
- data/lib/zelf/resources/content.rb +256 -0
- data/lib/zelf/resources/creator_sync.rb +57 -0
- data/lib/zelf/resources/creator_vetting.rb +124 -0
- data/lib/zelf/resources/creators.rb +33 -0
- data/lib/zelf/resources/detection.rb +89 -0
- data/lib/zelf/resources/sub_brands.rb +33 -0
- data/lib/zelf/resources/usage.rb +26 -0
- data/lib/zelf/resources/webhooks.rb +199 -0
- data/lib/zelf/transport.rb +170 -0
- data/lib/zelf/version.rb +5 -0
- data/lib/zelf/webhooks.rb +293 -0
- data/lib/zelf.rb +59 -0
- metadata +64 -0
data/lib/zelf/models.rb
ADDED
|
@@ -0,0 +1,1213 @@
|
|
|
1
|
+
# Generated by codegen. Do not edit by hand.
|
|
2
|
+
require_relative 'model'
|
|
3
|
+
|
|
4
|
+
module Zelf
|
|
5
|
+
module Models
|
|
6
|
+
# Accepted values for AccountTypeEnum.
|
|
7
|
+
AccountTypeEnum = [
|
|
8
|
+
"tracked",
|
|
9
|
+
"influencer",
|
|
10
|
+
"owned",
|
|
11
|
+
].freeze
|
|
12
|
+
|
|
13
|
+
# Accepted values for AnalysisScopeEnum.
|
|
14
|
+
AnalysisScopeEnum = [
|
|
15
|
+
"CONTENT",
|
|
16
|
+
"COMMENT",
|
|
17
|
+
].freeze
|
|
18
|
+
|
|
19
|
+
# Accepted values for BlankEnum.
|
|
20
|
+
BlankEnum = [
|
|
21
|
+
"",
|
|
22
|
+
].freeze
|
|
23
|
+
|
|
24
|
+
# Accepted values for ContentFormEnum.
|
|
25
|
+
ContentFormEnum = [
|
|
26
|
+
"VIDEO",
|
|
27
|
+
"IMAGE",
|
|
28
|
+
].freeze
|
|
29
|
+
|
|
30
|
+
# Accepted values for KindEnum.
|
|
31
|
+
KindEnum = [
|
|
32
|
+
"snapshot",
|
|
33
|
+
"event",
|
|
34
|
+
].freeze
|
|
35
|
+
|
|
36
|
+
# Accepted values for LastStatusEnum.
|
|
37
|
+
LastStatusEnum = [
|
|
38
|
+
"SUCCESS",
|
|
39
|
+
"FAILED",
|
|
40
|
+
].freeze
|
|
41
|
+
|
|
42
|
+
# Accepted values for MentionTypeEnum.
|
|
43
|
+
MentionTypeEnum = [
|
|
44
|
+
"content",
|
|
45
|
+
"comment",
|
|
46
|
+
].freeze
|
|
47
|
+
|
|
48
|
+
# Accepted values for PlatformEnum.
|
|
49
|
+
PlatformEnum = [
|
|
50
|
+
"instagram",
|
|
51
|
+
"tiktok",
|
|
52
|
+
"youtube",
|
|
53
|
+
].freeze
|
|
54
|
+
|
|
55
|
+
# Accepted values for ResourceEnum.
|
|
56
|
+
ResourceEnum = [
|
|
57
|
+
"content",
|
|
58
|
+
"creator",
|
|
59
|
+
].freeze
|
|
60
|
+
|
|
61
|
+
# Accepted values for SecretTypeEnum.
|
|
62
|
+
SecretTypeEnum = [
|
|
63
|
+
"default",
|
|
64
|
+
"new",
|
|
65
|
+
].freeze
|
|
66
|
+
|
|
67
|
+
# Accepted values for StateEnum.
|
|
68
|
+
StateEnum = [
|
|
69
|
+
"PENDING",
|
|
70
|
+
"SUCCEEDED",
|
|
71
|
+
"FAILED",
|
|
72
|
+
"EXHAUSTED",
|
|
73
|
+
"QUOTA_EXHAUSTED",
|
|
74
|
+
].freeze
|
|
75
|
+
|
|
76
|
+
# Accepted values for SubBrandTypeEnum.
|
|
77
|
+
SubBrandTypeEnum = [
|
|
78
|
+
"COMPETITIVE",
|
|
79
|
+
"THEME",
|
|
80
|
+
].freeze
|
|
81
|
+
|
|
82
|
+
# Accepted values for TypeEnum.
|
|
83
|
+
TypeEnum = [
|
|
84
|
+
"USER_DEFINED_SAFETY_CRITERION",
|
|
85
|
+
"ADULT_CONTENT",
|
|
86
|
+
"ARMS_AND_AMMUNITION",
|
|
87
|
+
"MISINFORMATION",
|
|
88
|
+
"PROFANITY",
|
|
89
|
+
"POLITICS",
|
|
90
|
+
"DISCLOSURE",
|
|
91
|
+
].freeze
|
|
92
|
+
|
|
93
|
+
class AiAnalysis < Zelf::Model; end
|
|
94
|
+
class AiAnalysisCreateRequest < Zelf::Model; end
|
|
95
|
+
class AiAnalysisResult < Zelf::Model; end
|
|
96
|
+
class AiAnalysisRun < Zelf::Model; end
|
|
97
|
+
class Brand < Zelf::Model; end
|
|
98
|
+
class BrandAccount < Zelf::Model; end
|
|
99
|
+
class BrandAccountGroups < Zelf::Model; end
|
|
100
|
+
class BrandAccountsWriteRequest < Zelf::Model; end
|
|
101
|
+
class BrandCatalog < Zelf::Model; end
|
|
102
|
+
class BrandCatalogItem < Zelf::Model; end
|
|
103
|
+
class BrandCreateSubBrandRequest < Zelf::Model; end
|
|
104
|
+
class BrandKeywords < Zelf::Model; end
|
|
105
|
+
class Comment < Zelf::Model; end
|
|
106
|
+
class CommentAuthor < Zelf::Model; end
|
|
107
|
+
class Content < Zelf::Model; end
|
|
108
|
+
class ContentActionRequestRequest < Zelf::Model; end
|
|
109
|
+
class ContentActionResponse < Zelf::Model; end
|
|
110
|
+
class ContentCreator < Zelf::Model; end
|
|
111
|
+
class ContentDiscovery < Zelf::Model; end
|
|
112
|
+
class ContentDiscoveryRequestRequest < Zelf::Model; end
|
|
113
|
+
class ContentFilterInputRequest < Zelf::Model; end
|
|
114
|
+
class ContentScopeRequest < Zelf::Model; end
|
|
115
|
+
class ContentStatistics < Zelf::Model; end
|
|
116
|
+
class Creator < Zelf::Model; end
|
|
117
|
+
class CreatorSync < Zelf::Model; end
|
|
118
|
+
class CreatorSyncCreateRequest < Zelf::Model; end
|
|
119
|
+
class CreatorVetting < Zelf::Model; end
|
|
120
|
+
class CreatorVettingRequest < Zelf::Model; end
|
|
121
|
+
class CreatorVettingResult < Zelf::Model; end
|
|
122
|
+
class CreatorVettingRun < Zelf::Model; end
|
|
123
|
+
class Detection < Zelf::Model; end
|
|
124
|
+
class DetectionBrandHint < Zelf::Model; end
|
|
125
|
+
class DetectionBrandHintRequest < Zelf::Model; end
|
|
126
|
+
class DetectionBrandResult < Zelf::Model; end
|
|
127
|
+
class DetectionBrandSummary < Zelf::Model; end
|
|
128
|
+
class DetectionContext < Zelf::Model; end
|
|
129
|
+
class DetectionContextInputRequest < Zelf::Model; end
|
|
130
|
+
class DetectionCreateRequest < Zelf::Model; end
|
|
131
|
+
class DetectionHints < Zelf::Model; end
|
|
132
|
+
class DetectionHintsRequest < Zelf::Model; end
|
|
133
|
+
class DetectionPlacement < Zelf::Model; end
|
|
134
|
+
class DetectionResult < Zelf::Model; end
|
|
135
|
+
class DetectionSummary < Zelf::Model; end
|
|
136
|
+
class DetectionVideo < Zelf::Model; end
|
|
137
|
+
class PatchedBrandUpdateRequest < Zelf::Model; end
|
|
138
|
+
class PatchedWebhookSubscriptionUpdateRequest < Zelf::Model; end
|
|
139
|
+
class ResultFile < Zelf::Model; end
|
|
140
|
+
class SafetyCheckRequest < Zelf::Model; end
|
|
141
|
+
class Usage < Zelf::Model; end
|
|
142
|
+
class UsageScope < Zelf::Model; end
|
|
143
|
+
class UsageWindow < Zelf::Model; end
|
|
144
|
+
class WebhookAvailableEvent < Zelf::Model; end
|
|
145
|
+
class WebhookData < Zelf::Model; end
|
|
146
|
+
class WebhookDeleteAcknowledgement < Zelf::Model; end
|
|
147
|
+
class WebhookDelivery < Zelf::Model; end
|
|
148
|
+
class WebhookFile < Zelf::Model; end
|
|
149
|
+
class WebhookPush < Zelf::Model; end
|
|
150
|
+
class WebhookSecret < Zelf::Model; end
|
|
151
|
+
class WebhookSecretCreateRequest < Zelf::Model; end
|
|
152
|
+
class WebhookSecretCreated < Zelf::Model; end
|
|
153
|
+
class WebhookSubscription < Zelf::Model; end
|
|
154
|
+
class WebhookSubscriptionCreateRequest < Zelf::Model; end
|
|
155
|
+
class WebhookSubscriptionCreated < Zelf::Model; end
|
|
156
|
+
|
|
157
|
+
# Response body for the AI analysis root.
|
|
158
|
+
class AiAnalysis
|
|
159
|
+
# ID of the analysis
|
|
160
|
+
field :id, "id"
|
|
161
|
+
# Always AI_ANALYSIS here
|
|
162
|
+
field :analysis_type, "analysis_type"
|
|
163
|
+
# The analysis label
|
|
164
|
+
field :name, "name"
|
|
165
|
+
# The subject the analysis focuses on
|
|
166
|
+
field :topic, "topic"
|
|
167
|
+
# When the analysis was created (UTC, ISO-8601)
|
|
168
|
+
field :created_at, "created_at", cast: :time
|
|
169
|
+
# When the analysis was last modified (UTC, ISO-8601)
|
|
170
|
+
field :modified_at, "modified_at", cast: :time
|
|
171
|
+
# The runs that make up this analysis, one per scope, ordered newest first
|
|
172
|
+
field :analyses, "analyses", cast: [AiAnalysisRun]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Request body for ``POST /api/v1/ai_analysis/``.
|
|
176
|
+
class AiAnalysisCreateRequest
|
|
177
|
+
# A label for this analysis
|
|
178
|
+
field :name, "name"
|
|
179
|
+
# The brand, product, person or event to analyze, as a short term
|
|
180
|
+
field :topic, "topic"
|
|
181
|
+
# What to analyze: any of CONTENT, COMMENT
|
|
182
|
+
field :analysis_scope, "analysis_scope"
|
|
183
|
+
# Selects which content the analysis runs over
|
|
184
|
+
field :content_filters, "content_filters", cast: ContentFilterInputRequest
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# A single analysis run with its downloadable ``result``.
|
|
188
|
+
class AiAnalysisResult
|
|
189
|
+
# ID of the analysis run
|
|
190
|
+
field :id, "id"
|
|
191
|
+
# ID of the analysis this run belongs to
|
|
192
|
+
field :analysis_id, "analysis_id"
|
|
193
|
+
# What this run covers: CONTENT or COMMENT
|
|
194
|
+
field :scope, "scope"
|
|
195
|
+
# Run status: one of IN_PROGRESS, COMPLETED, EMPTY_RESULT (finished with no...
|
|
196
|
+
field :status, "status"
|
|
197
|
+
# Signed, time-limited download of the run's analysis payload: download_url...
|
|
198
|
+
field :result, "result", cast: ResultFile
|
|
199
|
+
# When the run was created (UTC, ISO-8601)
|
|
200
|
+
field :created_at, "created_at", cast: :time
|
|
201
|
+
# When the run was last modified (UTC, ISO-8601)
|
|
202
|
+
field :modified_at, "modified_at", cast: :time
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# A single analysis run, without its result payload. The run ``result`` is not
|
|
206
|
+
# included; retrieve it from `ai_analysis.results` once ``status`` is `COMPLETED`.
|
|
207
|
+
class AiAnalysisRun
|
|
208
|
+
# ID of the analysis run
|
|
209
|
+
field :id, "id"
|
|
210
|
+
# What this run covers: CONTENT or COMMENT
|
|
211
|
+
field :scope, "scope"
|
|
212
|
+
# Run status: one of IN_PROGRESS, COMPLETED, EMPTY_RESULT (finished with no...
|
|
213
|
+
field :status, "status"
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# A brand you can reach.
|
|
217
|
+
class Brand
|
|
218
|
+
# Unique identifier for the brand
|
|
219
|
+
field :id, "id"
|
|
220
|
+
# Display name of the brand
|
|
221
|
+
field :title, "title"
|
|
222
|
+
# true for the brand this access belongs to, and false for every other brand the...
|
|
223
|
+
field :is_primary, "is_primary"
|
|
224
|
+
# COMPETITIVE or THEME for a sub-brand; null for a top-level brand
|
|
225
|
+
field :sub_brand_type, "sub_brand_type"
|
|
226
|
+
# Id of the parent brand for a sub-brand; null for a top-level brand
|
|
227
|
+
field :parent_brand_id, "parent_brand_id"
|
|
228
|
+
# The terms this brand uses to monitor social platforms
|
|
229
|
+
field :keywords, "keywords", cast: BrandKeywords
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# An account tracked, marked as an influencer, or owned by the brand.
|
|
233
|
+
class BrandAccount
|
|
234
|
+
# The account's handle
|
|
235
|
+
field :username, "username"
|
|
236
|
+
# instagram or tiktok
|
|
237
|
+
field :platform, "platform"
|
|
238
|
+
# The account's profile URL, when available
|
|
239
|
+
field :external_url, "external_url"
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# A brand's accounts, grouped into one list per account type. Every key is optional
|
|
243
|
+
# because `account_type` narrows the response to the single list it names.
|
|
244
|
+
class BrandAccountGroups
|
|
245
|
+
# Accounts the brand monitors
|
|
246
|
+
field :tracked, "tracked", cast: [BrandAccount]
|
|
247
|
+
# Accounts the brand treats as partnership candidates
|
|
248
|
+
field :influencer, "influencer", cast: [BrandAccount]
|
|
249
|
+
# Profiles the brand operates itself
|
|
250
|
+
field :owned, "owned", cast: [BrandAccount]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Add or remove profiles in a brand's tracked/influencer/owned list.
|
|
254
|
+
class BrandAccountsWriteRequest
|
|
255
|
+
# Brand to modify, specified as an id from brands.list
|
|
256
|
+
field :brand_id, "brand_id"
|
|
257
|
+
# The list to modify: tracked, influencer, or owned for the brand's own profiles
|
|
258
|
+
field :account_type, "account_type"
|
|
259
|
+
# Profile URLs on a supported platform (instagram or tiktok)
|
|
260
|
+
field :profile_urls, "profile_urls"
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# A brand in the curated catalog, readable by every api key.
|
|
264
|
+
class BrandCatalog
|
|
265
|
+
# Unique identifier for the brand
|
|
266
|
+
field :id, "id"
|
|
267
|
+
# Display name of the brand
|
|
268
|
+
field :title, "title"
|
|
269
|
+
# URL of the brand's logo, when one is on file
|
|
270
|
+
field :brand_logo, "brand_logo"
|
|
271
|
+
# Identifier of the brand's industry
|
|
272
|
+
field :industry_id, "industry_id"
|
|
273
|
+
# Name of the brand's industry
|
|
274
|
+
field :industry_name, "industry_name"
|
|
275
|
+
# Identifier of the brand's category
|
|
276
|
+
field :category_id, "category_id"
|
|
277
|
+
# Name of the brand's category
|
|
278
|
+
field :category_name, "category_name"
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# An industry or a category, used to filter the brand catalog.
|
|
282
|
+
class BrandCatalogItem
|
|
283
|
+
# Identifier to pass as industry_id or category_id to brands.catalog
|
|
284
|
+
field :id, "id"
|
|
285
|
+
# Display name of the industry or category
|
|
286
|
+
field :name, "name"
|
|
287
|
+
# industry or category
|
|
288
|
+
field :level, "level"
|
|
289
|
+
# Industry id a category belongs to; null for an industry
|
|
290
|
+
field :parent_id, "parent_id"
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
# Create a sub-brand under the workspace brand.
|
|
294
|
+
class BrandCreateSubBrandRequest
|
|
295
|
+
# Plain keywords the brand monitors across platforms, matched as-is (case-...
|
|
296
|
+
field :search_terms, "search_terms"
|
|
297
|
+
# Terms that must be present for content to match
|
|
298
|
+
field :inclusion_terms, "inclusion_terms"
|
|
299
|
+
# Terms that disqualify content from matching
|
|
300
|
+
field :exclusion_terms, "exclusion_terms"
|
|
301
|
+
# Secondary inclusion terms layered on top of inclusion_terms
|
|
302
|
+
field :compound_inclusion_terms, "compound_inclusion_terms"
|
|
303
|
+
# Terms that mark matched content as influencer content
|
|
304
|
+
field :influencer_terms, "influencer_terms"
|
|
305
|
+
# ISO 639-1 codes to track, or the single value all
|
|
306
|
+
field :allowed_languages, "allowed_languages"
|
|
307
|
+
# Full-text search across the caption, transcript, summary, and hashtags
|
|
308
|
+
field :boolean_query, "boolean_query"
|
|
309
|
+
# Display name of the new sub-brand
|
|
310
|
+
field :title, "title"
|
|
311
|
+
# Type of sub-brand: COMPETITIVE or THEME
|
|
312
|
+
field :sub_brand_type, "sub_brand_type"
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# The terms this brand uses to monitor social platforms.
|
|
316
|
+
class BrandKeywords
|
|
317
|
+
# Plain keywords the brand monitors across platforms, matched as-is (case-...
|
|
318
|
+
field :search_terms, "search_terms"
|
|
319
|
+
# Terms that must be present for content to match
|
|
320
|
+
field :inclusion_terms, "inclusion_terms"
|
|
321
|
+
# Terms that disqualify content from matching, even when other criteria are met
|
|
322
|
+
field :exclusion_terms, "exclusion_terms"
|
|
323
|
+
# Secondary inclusion terms layered on top of inclusion_terms
|
|
324
|
+
field :compound_inclusion_terms, "compound_inclusion_terms"
|
|
325
|
+
# Terms that mark matched content as influencer content (for example, sponsored,...
|
|
326
|
+
field :influencer_terms, "influencer_terms"
|
|
327
|
+
# ISO 639-1 codes for the languages the brand tracks
|
|
328
|
+
field :allowed_languages, "allowed_languages"
|
|
329
|
+
# Full-text search across the caption, transcript, summary, and hashtags
|
|
330
|
+
field :boolean_query, "boolean_query"
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
# A comment left on a piece of content.
|
|
334
|
+
class Comment
|
|
335
|
+
# Unique identifier for the comment
|
|
336
|
+
field :id, "id"
|
|
337
|
+
# The comment's text content
|
|
338
|
+
field :text, "text"
|
|
339
|
+
# The platform the comment was posted on
|
|
340
|
+
field :platform, "platform"
|
|
341
|
+
# Number of likes the comment has received
|
|
342
|
+
field :like_count, "like_count"
|
|
343
|
+
# Time the comment was posted on its platform (UTC)
|
|
344
|
+
field :posted_at, "posted_at", cast: :time
|
|
345
|
+
# Identifier of the content the comment was left on
|
|
346
|
+
field :content_id, "content_id"
|
|
347
|
+
# Identifier of the comment this is a reply to
|
|
348
|
+
field :parent_comment_id, "parent_comment_id"
|
|
349
|
+
# Whether this is a top-level comment, rather than a reply to another comment
|
|
350
|
+
field :is_parent_comment, "is_parent_comment"
|
|
351
|
+
# The creator who wrote the comment
|
|
352
|
+
field :author, "author", cast: CommentAuthor
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
# A short profile of the creator who wrote the comment.
|
|
356
|
+
class CommentAuthor
|
|
357
|
+
# Unique identifier for the author
|
|
358
|
+
field :id, "id"
|
|
359
|
+
# The author's username or handle on the platform (without the leading @)
|
|
360
|
+
field :username, "username"
|
|
361
|
+
# The author's display name on the platform
|
|
362
|
+
field :name, "name"
|
|
363
|
+
# URL of the author's profile picture
|
|
364
|
+
field :profile_picture_url, "profile_picture_url"
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# A piece of content (a post, video, or image) and its metrics.
|
|
368
|
+
class Content
|
|
369
|
+
# Unique identifier for this piece of content
|
|
370
|
+
field :id, "id"
|
|
371
|
+
# The post's identifier on its platform
|
|
372
|
+
field :platform_post_id, "platform_post_id"
|
|
373
|
+
# The platform the content was published on
|
|
374
|
+
field :platform, "platform"
|
|
375
|
+
# Whether the content is a video or an image
|
|
376
|
+
field :content_form, "content_form"
|
|
377
|
+
# URL of the content's thumbnail image
|
|
378
|
+
field :thumbnail_url, "thumbnail_url"
|
|
379
|
+
# Time the content was originally published on its platform (UTC)
|
|
380
|
+
field :posted_at, "posted_at", cast: :time
|
|
381
|
+
# Total number of times the content has been viewed
|
|
382
|
+
field :view_count, "view_count"
|
|
383
|
+
# Total number of likes the content has received
|
|
384
|
+
field :like_count, "like_count"
|
|
385
|
+
# Total number of comments on the content
|
|
386
|
+
field :comment_count, "comment_count"
|
|
387
|
+
# Total number of times the content has been shared
|
|
388
|
+
field :share_count, "share_count"
|
|
389
|
+
# Sum of the likes, comments, and shares the content has received
|
|
390
|
+
field :total_engagement, "total_engagement"
|
|
391
|
+
# ISO 639 code of the content's primary language
|
|
392
|
+
field :language, "language"
|
|
393
|
+
# Length of the media in seconds
|
|
394
|
+
field :media_duration, "media_duration"
|
|
395
|
+
# Engagement per view (likes plus comments plus shares, divided by views)
|
|
396
|
+
field :engagement_rate, "engagement_rate"
|
|
397
|
+
# Estimated marketing value of the content, in US cents
|
|
398
|
+
field :earned_media_value_cents, "earned_media_value_cents"
|
|
399
|
+
# The creator who published the content
|
|
400
|
+
field :creator, "creator", cast: ContentCreator
|
|
401
|
+
# Identifier of the brand that the brand-specific signals on this row (is_owned,...
|
|
402
|
+
field :brand_id, "brand_id"
|
|
403
|
+
# Net promoter score for the content from the perspective of the scoped brand
|
|
404
|
+
field :net_promoter_score, "net_promoter_score"
|
|
405
|
+
# Whether the scoped brand owns the content; that is, whether it was published by...
|
|
406
|
+
field :is_owned, "is_owned"
|
|
407
|
+
# Whether the post tags the scoped brand on the platform
|
|
408
|
+
field :is_tagged, "is_tagged"
|
|
409
|
+
# Whether the scoped brand counts the content as influencer content: it matches the...
|
|
410
|
+
field :is_influencer, "is_influencer"
|
|
411
|
+
# How the scoped brand is mentioned in the content
|
|
412
|
+
field :mention_type, "mention_type"
|
|
413
|
+
# Short caption or title of the post (the primary user-visible text)
|
|
414
|
+
field :caption, "caption"
|
|
415
|
+
# Long-form description of the post
|
|
416
|
+
field :description, "description"
|
|
417
|
+
# Transcribed speech from the content's audio, when available
|
|
418
|
+
field :transcript, "transcript"
|
|
419
|
+
# Direct URL to the post on its platform
|
|
420
|
+
field :platform_url, "platform_url"
|
|
421
|
+
# Short AI-generated summary of the content
|
|
422
|
+
field :ai_summary, "ai_summary"
|
|
423
|
+
# The search term the content was most recently found by
|
|
424
|
+
field :last_keyword, "last_keyword"
|
|
425
|
+
# Hashtags used in the post, normalized to lowercase and without the leading #
|
|
426
|
+
field :hashtags, "hashtags"
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# Request body for the content transcribe and AI summarize actions.
|
|
430
|
+
class ContentActionRequestRequest
|
|
431
|
+
# Identifier of the content, as returned by content.list
|
|
432
|
+
field :content_id, "content_id"
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
# State of a content transcribe or AI summarize request.
|
|
436
|
+
class ContentActionResponse
|
|
437
|
+
# Identifier of the content
|
|
438
|
+
field :content_id, "content_id"
|
|
439
|
+
# PENDING when the work was queued, COMPLETED when the content already has the result
|
|
440
|
+
field :status, "status"
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# The creator who published the content.
|
|
444
|
+
class ContentCreator
|
|
445
|
+
# Unique identifier for the creator
|
|
446
|
+
field :id, "id"
|
|
447
|
+
# The creator's username or handle on the platform (without an @)
|
|
448
|
+
field :username, "username"
|
|
449
|
+
# The creator's display name on the platform
|
|
450
|
+
field :name, "name"
|
|
451
|
+
# The platform the creator publishes on
|
|
452
|
+
field :platform, "platform"
|
|
453
|
+
# The platform-side identifier of the creator's account
|
|
454
|
+
field :platform_handle, "platform_handle"
|
|
455
|
+
# Direct URL to the creator's profile on the platform
|
|
456
|
+
field :platform_url, "platform_url"
|
|
457
|
+
# URL of the creator's profile picture
|
|
458
|
+
field :profile_picture_url, "profile_picture_url"
|
|
459
|
+
# The creator's profile bio as it appears on the platform
|
|
460
|
+
field :profile_bio, "profile_bio"
|
|
461
|
+
# The creator's follower count as of the most recent observation
|
|
462
|
+
field :follower_count, "follower_count"
|
|
463
|
+
# Number of active content items attributed to the creator
|
|
464
|
+
field :active_content_count, "active_content_count"
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
# A content discovery job started for a search term.
|
|
468
|
+
class ContentDiscovery
|
|
469
|
+
# Identifier of the discovery job
|
|
470
|
+
field :id, "id"
|
|
471
|
+
# The search term the discovery job was started for
|
|
472
|
+
field :search_term, "search_term"
|
|
473
|
+
# When the discovery job was created (UTC, ISO 8601)
|
|
474
|
+
field :created_at, "created_at", cast: :time
|
|
475
|
+
# Time of the most recent change to the discovery job (UTC, ISO 8601)
|
|
476
|
+
field :updated_at, "updated_at", cast: :time
|
|
477
|
+
# Platforms the indexing job was dispatched to
|
|
478
|
+
field :platforms, "platforms"
|
|
479
|
+
# Status of the discovery job
|
|
480
|
+
field :status, "status"
|
|
481
|
+
# Whether a new indexing job was dispatched
|
|
482
|
+
field :dispatched, "dispatched"
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# Request body for ``POST /api/v1/content/discovery/``.
|
|
486
|
+
class ContentDiscoveryRequestRequest
|
|
487
|
+
# The term to index content for (for example, nike running)
|
|
488
|
+
field :search_term, "search_term"
|
|
489
|
+
# Platforms to index (instagram, tiktok, youtube)
|
|
490
|
+
field :platforms, "platforms"
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
# Selects which content the analysis runs over. These parameters correspond one-to-one
|
|
494
|
+
# with the `content.list` filter parameters. At least one of `search`, `creator_id`,
|
|
495
|
+
# `creator_username`, `external_id`, or `brand_id` is required to scope the analysis.
|
|
496
|
+
# Supplied filters are combined with AND; min/max pairs are inclusive bounds, and
|
|
497
|
+
# dates are UTC ISO-8601 instants. When `posted_after`, `posted_before`, and
|
|
498
|
+
# `posted_within_days` are all omitted, the analysis defaults to the most recent
|
|
499
|
+
# window. The window between `posted_after` and `posted_before` must not exceed 366
|
|
500
|
+
# days. The analysis runs over the highest-ranked matching content by `order_by`, up
|
|
501
|
+
# to 500 items or the limit configured for your workspace. When `order_by` is omitted,
|
|
502
|
+
# content is ranked by `earned_media_value_cents` descending.
|
|
503
|
+
class ContentFilterInputRequest
|
|
504
|
+
# Include only content with at least this many views
|
|
505
|
+
field :view_count_min, "view_count_min"
|
|
506
|
+
# Include only content with at most this many views
|
|
507
|
+
field :view_count_max, "view_count_max"
|
|
508
|
+
# Include only content with at least this many comments
|
|
509
|
+
field :comment_count_min, "comment_count_min"
|
|
510
|
+
# Include only content with at most this many comments
|
|
511
|
+
field :comment_count_max, "comment_count_max"
|
|
512
|
+
# Include only content with at least this many likes
|
|
513
|
+
field :like_count_min, "like_count_min"
|
|
514
|
+
# Include only content with at most this many likes
|
|
515
|
+
field :like_count_max, "like_count_max"
|
|
516
|
+
# Include only content with at least this many shares
|
|
517
|
+
field :share_count_min, "share_count_min"
|
|
518
|
+
# Include only content with at most this many shares
|
|
519
|
+
field :share_count_max, "share_count_max"
|
|
520
|
+
# Minimum total engagement (likes + comments + shares)
|
|
521
|
+
field :total_engagement_min, "total_engagement_min"
|
|
522
|
+
# Maximum total engagement (likes + comments + shares)
|
|
523
|
+
field :total_engagement_max, "total_engagement_max"
|
|
524
|
+
# Minimum estimated earned media value, in cents
|
|
525
|
+
field :earned_media_value_cents_min, "earned_media_value_cents_min"
|
|
526
|
+
# Maximum estimated earned media value, in cents
|
|
527
|
+
field :earned_media_value_cents_max, "earned_media_value_cents_max"
|
|
528
|
+
# Include only content at least this many seconds long
|
|
529
|
+
field :media_duration_min, "media_duration_min"
|
|
530
|
+
# Include only content at most this many seconds long
|
|
531
|
+
field :media_duration_max, "media_duration_max"
|
|
532
|
+
# Include only content posted at or after this UTC ISO-8601 time
|
|
533
|
+
field :posted_after, "posted_after", cast: :time
|
|
534
|
+
# Include only content posted at or before this UTC ISO-8601 time
|
|
535
|
+
field :posted_before, "posted_before", cast: :time
|
|
536
|
+
# Platforms to include
|
|
537
|
+
field :platform, "platform"
|
|
538
|
+
# Language codes to include, for example en or es
|
|
539
|
+
field :language, "language"
|
|
540
|
+
# Content medium
|
|
541
|
+
field :content_form, "content_form"
|
|
542
|
+
# Full-text search across caption, transcript, and summary
|
|
543
|
+
field :search, "search"
|
|
544
|
+
# Restrict to a single creator by id (from creators.list)
|
|
545
|
+
field :creator_id, "creator_id"
|
|
546
|
+
# Restrict to an accessible brand id (from brands.list)
|
|
547
|
+
field :brand_id, "brand_id"
|
|
548
|
+
# Include only content owned by the brand
|
|
549
|
+
field :is_owned, "is_owned"
|
|
550
|
+
# Include only content where the brand is tagged
|
|
551
|
+
field :is_tagged, "is_tagged"
|
|
552
|
+
# Include only the brand's influencer content, or exclude it with false
|
|
553
|
+
field :is_influencer, "is_influencer"
|
|
554
|
+
# Platform-side post id
|
|
555
|
+
field :external_id, "external_id"
|
|
556
|
+
# Creator username substring
|
|
557
|
+
field :creator_username, "creator_username"
|
|
558
|
+
# Restrict to these mention kinds
|
|
559
|
+
field :mention_type, "mention_type"
|
|
560
|
+
# Exclude these mention kinds
|
|
561
|
+
field :mention_type_not, "mention_type_not"
|
|
562
|
+
# Include only content whose creator has at least this many followers
|
|
563
|
+
field :creator_follower_count_min, "creator_follower_count_min"
|
|
564
|
+
# Include only content whose creator has at most this many followers
|
|
565
|
+
field :creator_follower_count_max, "creator_follower_count_max"
|
|
566
|
+
# Minimum engagement as a fraction of views (e.g
|
|
567
|
+
field :engagement_rate_min, "engagement_rate_min"
|
|
568
|
+
# Maximum engagement as a fraction of views (e.g
|
|
569
|
+
field :engagement_rate_max, "engagement_rate_max"
|
|
570
|
+
# Minimum brand net promoter score for the content
|
|
571
|
+
field :net_promoter_score_min, "net_promoter_score_min"
|
|
572
|
+
# Maximum brand net promoter score for the content
|
|
573
|
+
field :net_promoter_score_max, "net_promoter_score_max"
|
|
574
|
+
# Start of the window, counted back from the current time, in days (1-365)
|
|
575
|
+
field :posted_within_days, "posted_within_days"
|
|
576
|
+
# Start of the window, counted back from the current time, in hours (1-8760)
|
|
577
|
+
field :posted_within_hours, "posted_within_hours"
|
|
578
|
+
# Sort the selected content
|
|
579
|
+
field :order_by, "order_by"
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
# Specifies which of the creator's content relationships feed the analysis. Flags that
|
|
583
|
+
# are omitted default to owned content only.
|
|
584
|
+
class ContentScopeRequest
|
|
585
|
+
# Whether to include content the creator originally posted
|
|
586
|
+
field :owned, "owned"
|
|
587
|
+
# Whether to include content the creator reposted
|
|
588
|
+
field :repost, "repost"
|
|
589
|
+
# Whether to include content the creator liked
|
|
590
|
+
field :liked, "liked"
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
# Aggregated totals for a filtered set of content.
|
|
594
|
+
class ContentStatistics
|
|
595
|
+
# Number of unique pieces of content in the filtered set
|
|
596
|
+
field :post_count, "post_count"
|
|
597
|
+
# Total views across the filtered set
|
|
598
|
+
field :total_views, "total_views"
|
|
599
|
+
# Total likes across the filtered set
|
|
600
|
+
field :total_likes, "total_likes"
|
|
601
|
+
# Total comments across the filtered set
|
|
602
|
+
field :total_comments, "total_comments"
|
|
603
|
+
# Total shares across the filtered set
|
|
604
|
+
field :total_shares, "total_shares"
|
|
605
|
+
# Total engagement (likes + comments + shares) across the filtered set
|
|
606
|
+
field :total_engagement, "total_engagement"
|
|
607
|
+
# Total estimated marketing value across the filtered set, in US cents
|
|
608
|
+
field :total_earned_media_value_cents, "total_earned_media_value_cents"
|
|
609
|
+
# Total media length in seconds across the filtered set
|
|
610
|
+
field :total_media_duration, "total_media_duration"
|
|
611
|
+
# Total engagement divided by total views across the filtered set
|
|
612
|
+
field :engagement_rate, "engagement_rate"
|
|
613
|
+
# Number of distinct creators represented in the filtered set
|
|
614
|
+
field :unique_creator_count, "unique_creator_count"
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
# A creator and their public profile fields.
|
|
618
|
+
class Creator
|
|
619
|
+
# Unique identifier of the creator
|
|
620
|
+
field :id, "id"
|
|
621
|
+
# The creator's username or handle on the platform, without the @
|
|
622
|
+
field :username, "username"
|
|
623
|
+
# The creator's display name on the platform
|
|
624
|
+
field :name, "name"
|
|
625
|
+
# The creator's email address when known by the platform; empty otherwise
|
|
626
|
+
field :email, "email"
|
|
627
|
+
# The platform the creator is on
|
|
628
|
+
field :platform, "platform"
|
|
629
|
+
# The platform-side identifier of the account
|
|
630
|
+
field :platform_handle, "platform_handle"
|
|
631
|
+
# The creator's follower count as of the most recent observation
|
|
632
|
+
field :follower_count, "follower_count"
|
|
633
|
+
# Number of active content items attributed to the creator
|
|
634
|
+
field :active_content_count, "active_content_count"
|
|
635
|
+
# The creator's profile bio as it appears on the platform
|
|
636
|
+
field :profile_bio, "profile_bio"
|
|
637
|
+
# Direct URL to the creator's profile on the platform
|
|
638
|
+
field :platform_url, "platform_url"
|
|
639
|
+
# URL of the creator's profile picture
|
|
640
|
+
field :profile_picture_url, "profile_picture_url"
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
# One creator sync job.
|
|
644
|
+
class CreatorSync
|
|
645
|
+
# Identifier of the sync job
|
|
646
|
+
field :id, "id"
|
|
647
|
+
# Time the job was created (UTC, ISO-8601)
|
|
648
|
+
field :created_at, "created_at", cast: :time
|
|
649
|
+
# Time the job was most recently modified (UTC, ISO-8601)
|
|
650
|
+
field :updated_at, "updated_at", cast: :time
|
|
651
|
+
# Identifier of the synced creator
|
|
652
|
+
field :creator_id, "creator_id"
|
|
653
|
+
# The profile URL this job syncs
|
|
654
|
+
field :profile_url, "profile_url"
|
|
655
|
+
# Where the job has got to
|
|
656
|
+
field :status, "status"
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
# Request body for ``POST /api/v1/creator_sync/``.
|
|
660
|
+
class CreatorSyncCreateRequest
|
|
661
|
+
# Direct URL to the creator's profile on a supported platform (tiktok, instagram,...
|
|
662
|
+
field :profile_url, "profile_url"
|
|
663
|
+
end
|
|
664
|
+
|
|
665
|
+
# A creator vetting, including its analysis runs and request settings.
|
|
666
|
+
class CreatorVetting
|
|
667
|
+
# Identifier of the vetting
|
|
668
|
+
field :id, "id"
|
|
669
|
+
# Time the vetting was created (UTC, ISO-8601)
|
|
670
|
+
field :created_at, "created_at", cast: :time
|
|
671
|
+
# Time the vetting was most recently modified (UTC, ISO-8601)
|
|
672
|
+
field :updated_at, "updated_at", cast: :time
|
|
673
|
+
# Identifier of the creator the vetting is tied to
|
|
674
|
+
field :creator_id, "creator_id"
|
|
675
|
+
# Status of the vetting
|
|
676
|
+
field :status, "status"
|
|
677
|
+
# The creator tied to this vetting
|
|
678
|
+
field :creator, "creator", cast: Creator
|
|
679
|
+
# Always CREATOR_ANALYSIS here
|
|
680
|
+
field :type, "type"
|
|
681
|
+
# Identifier of the scrape job triggered for this request
|
|
682
|
+
field :sync_job_id, "sync_job_id"
|
|
683
|
+
# The analysis runs tied to this vetting, ordered newest first
|
|
684
|
+
field :analysis, "analysis", cast: [CreatorVettingRun]
|
|
685
|
+
# The safety criteria submitted with this vetting request
|
|
686
|
+
field :safety_checks, "safety_checks"
|
|
687
|
+
# The content relationships analyzed for this creator
|
|
688
|
+
field :content_scope, "content_scope"
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
# Request body for ``POST /api/v1/creator/vetting/``.
|
|
692
|
+
class CreatorVettingRequest
|
|
693
|
+
# When true, re-indexes the creator even if they already exist in our database
|
|
694
|
+
field :resync_profile, "resync_profile"
|
|
695
|
+
# Direct URL to the creator's profile on a supported platform (instagram, tiktok,...
|
|
696
|
+
field :profile_url, "profile_url"
|
|
697
|
+
# The creator's content relationships to analyze
|
|
698
|
+
field :content_scope, "content_scope", cast: ContentScopeRequest
|
|
699
|
+
# Safety criteria for the AI pipeline to evaluate for this creator
|
|
700
|
+
field :safety_checks, "safety_checks", cast: [SafetyCheckRequest]
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
# An analysis run together with its downloadable ``result``. Returned by
|
|
704
|
+
# `creator_vetting.results` for the analysis `creator_vetting.list` points to.
|
|
705
|
+
class CreatorVettingResult
|
|
706
|
+
# Identifier of the analysis record
|
|
707
|
+
field :id, "id"
|
|
708
|
+
# The subject this analysis covers: CONTENT or COMMENT
|
|
709
|
+
field :scope, "scope"
|
|
710
|
+
# Time the analysis was created (UTC, ISO-8601)
|
|
711
|
+
field :created_at, "created_at", cast: :time
|
|
712
|
+
# Time the analysis was most recently modified (UTC, ISO-8601)
|
|
713
|
+
field :modified_at, "modified_at", cast: :time
|
|
714
|
+
# Identifier of the vetting this analysis belongs to
|
|
715
|
+
field :vetting_id, "vetting_id"
|
|
716
|
+
# Status of the analysis
|
|
717
|
+
field :status, "status"
|
|
718
|
+
# Signed, time-limited download of the run's analysis payload
|
|
719
|
+
field :result, "result", cast: ResultFile
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
# A lightweight analysis run that belongs to a vetting. This representation omits the
|
|
723
|
+
# ``result``. Retrieve it from `creator_vetting.results` once ``status`` is
|
|
724
|
+
# ``COMPLETED``.
|
|
725
|
+
class CreatorVettingRun
|
|
726
|
+
# Identifier of the analysis record
|
|
727
|
+
field :id, "id"
|
|
728
|
+
# The subject this analysis covers: CONTENT or COMMENT
|
|
729
|
+
field :scope, "scope"
|
|
730
|
+
# Status of the analysis
|
|
731
|
+
field :status, "status"
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
# One brand placement detection run.
|
|
735
|
+
class Detection
|
|
736
|
+
# Identifier of the detection
|
|
737
|
+
field :id, "id"
|
|
738
|
+
# Time the detection was created (UTC, ISO-8601)
|
|
739
|
+
field :created_at, "created_at", cast: :time
|
|
740
|
+
# Time the detection was most recently modified (UTC, ISO-8601)
|
|
741
|
+
field :updated_at, "updated_at", cast: :time
|
|
742
|
+
# Where the detection has got to
|
|
743
|
+
field :status, "status"
|
|
744
|
+
# The input this detection was created with
|
|
745
|
+
field :context, "context", cast: DetectionContext
|
|
746
|
+
# The placements document
|
|
747
|
+
field :result, "result", cast: DetectionResult
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
# One brand to look for, and what counts as evidence for it.
|
|
751
|
+
class DetectionBrandHint
|
|
752
|
+
# Display name of the brand, at most 60 characters
|
|
753
|
+
field :name, "name"
|
|
754
|
+
# 2 to 10 words, logos and product names that count as evidence of this brand, the...
|
|
755
|
+
field :identifiers, "identifiers"
|
|
756
|
+
# Up to 12 look-alikes that must not count, each at most 200 characters, for...
|
|
757
|
+
field :negatives, "negatives"
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
# One brand to look for, and what counts as evidence for it.
|
|
761
|
+
class DetectionBrandHintRequest
|
|
762
|
+
# Display name of the brand, at most 60 characters
|
|
763
|
+
field :name, "name"
|
|
764
|
+
# 2 to 10 words, logos and product names that count as evidence of this brand, the...
|
|
765
|
+
field :identifiers, "identifiers"
|
|
766
|
+
# Up to 12 look-alikes that must not count, each at most 200 characters, for...
|
|
767
|
+
field :negatives, "negatives"
|
|
768
|
+
end
|
|
769
|
+
|
|
770
|
+
# Everything found for one requested brand.
|
|
771
|
+
class DetectionBrandResult
|
|
772
|
+
# The requested brand, named exactly as it was asked for
|
|
773
|
+
field :brand_name, "brand_name"
|
|
774
|
+
# Whether the brand was present at all
|
|
775
|
+
field :found, "found"
|
|
776
|
+
# Counts for this brand
|
|
777
|
+
field :summary, "summary", cast: DetectionBrandSummary
|
|
778
|
+
# Every placement for this brand, earliest first
|
|
779
|
+
field :placements, "placements", cast: [DetectionPlacement]
|
|
780
|
+
end
|
|
781
|
+
|
|
782
|
+
# Counts for one brand.
|
|
783
|
+
class DetectionBrandSummary
|
|
784
|
+
# Placements for this brand
|
|
785
|
+
field :placements, "placements"
|
|
786
|
+
# Of those, confirmed
|
|
787
|
+
field :confirmed, "confirmed"
|
|
788
|
+
# Of those, left for review
|
|
789
|
+
field :review, "review"
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
# The input the detection run was given, as stored.
|
|
793
|
+
class DetectionContext
|
|
794
|
+
# URL of the content being analysed
|
|
795
|
+
field :external_url, "external_url"
|
|
796
|
+
# The brands to detect and the evidence that counts for each
|
|
797
|
+
field :hints, "hints", cast: DetectionHints
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
# What the caller supplies as the detection's input.
|
|
801
|
+
class DetectionContextInputRequest
|
|
802
|
+
# The brands to detect and the evidence that counts for each
|
|
803
|
+
field :hints, "hints", cast: DetectionHintsRequest
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
# Request body for ``POST /api/v1/detection/``.
|
|
807
|
+
class DetectionCreateRequest
|
|
808
|
+
# Identifier of content Zelf already holds, obtained from content.list
|
|
809
|
+
field :content_id, "content_id"
|
|
810
|
+
# Direct URL to the post or video to analyse
|
|
811
|
+
field :content_url, "content_url"
|
|
812
|
+
# The brands to detect and the evidence that counts for each
|
|
813
|
+
field :context, "context", cast: DetectionContextInputRequest
|
|
814
|
+
end
|
|
815
|
+
|
|
816
|
+
# What the detector is asked to look for.
|
|
817
|
+
class DetectionHints
|
|
818
|
+
# 1 to 200 brands to detect, in the order the results report them
|
|
819
|
+
field :brands, "brands", cast: [DetectionBrandHint]
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
# What the detector is asked to look for.
|
|
823
|
+
class DetectionHintsRequest
|
|
824
|
+
# 1 to 200 brands to detect, in the order the results report them
|
|
825
|
+
field :brands, "brands", cast: [DetectionBrandHintRequest]
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
# One brand present in the content at one moment, with its evidence.
|
|
829
|
+
class DetectionPlacement
|
|
830
|
+
# mm:ss-mm:ss, or mm:ss for a single moment
|
|
831
|
+
field :timestamp, "timestamp"
|
|
832
|
+
# YouTube: opens the video 5 seconds before the placement
|
|
833
|
+
field :video_url_at_timestamp, "video_url_at_timestamp"
|
|
834
|
+
# How it was detected
|
|
835
|
+
field :modality, "modality"
|
|
836
|
+
# What was observed, in the detector's own words
|
|
837
|
+
field :what_detected, "what_detected"
|
|
838
|
+
# Why the observation counts as this brand
|
|
839
|
+
field :reasoning, "reasoning"
|
|
840
|
+
# confirmed: passed a final check against the video's frames
|
|
841
|
+
field :confidence, "confidence"
|
|
842
|
+
end
|
|
843
|
+
|
|
844
|
+
# The placements document a finished detection produces.
|
|
845
|
+
class DetectionResult
|
|
846
|
+
# The content that was analysed
|
|
847
|
+
field :video, "video", cast: DetectionVideo
|
|
848
|
+
# Counts across the whole run
|
|
849
|
+
field :summary, "summary", cast: DetectionSummary
|
|
850
|
+
# One entry per requested brand, in request order, including the brands that were...
|
|
851
|
+
field :brands, "brands", cast: [DetectionBrandResult]
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
# Counts across the whole run.
|
|
855
|
+
class DetectionSummary
|
|
856
|
+
# How many brands the rubric asked for
|
|
857
|
+
field :brands_requested, "brands_requested"
|
|
858
|
+
# How many of those brands were present
|
|
859
|
+
field :brands_found, "brands_found"
|
|
860
|
+
# Total placements reported
|
|
861
|
+
field :placements, "placements"
|
|
862
|
+
# Placements that passed the final frame check
|
|
863
|
+
field :confirmed, "confirmed"
|
|
864
|
+
# Placements that did not pass the final frame check, including every Audio placement
|
|
865
|
+
field :review, "review"
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
# The content the placements were found in.
|
|
869
|
+
class DetectionVideo
|
|
870
|
+
# URL of the analysed content
|
|
871
|
+
field :video_url, "video_url"
|
|
872
|
+
# Platform the content was posted on
|
|
873
|
+
field :platform, "platform"
|
|
874
|
+
# Length of the content in seconds
|
|
875
|
+
field :duration_s, "duration_s"
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
# Partial update for a brand's monitoring keywords. Every field is optional, and only
|
|
879
|
+
# the supplied fields are changed, but at least one field is required.
|
|
880
|
+
class PatchedBrandUpdateRequest
|
|
881
|
+
# Plain keywords the brand monitors across platforms, matched as-is (case-...
|
|
882
|
+
field :search_terms, "search_terms"
|
|
883
|
+
# Terms that must be present for content to match
|
|
884
|
+
field :inclusion_terms, "inclusion_terms"
|
|
885
|
+
# Terms that disqualify content from matching
|
|
886
|
+
field :exclusion_terms, "exclusion_terms"
|
|
887
|
+
# Secondary inclusion terms layered on top of inclusion_terms
|
|
888
|
+
field :compound_inclusion_terms, "compound_inclusion_terms"
|
|
889
|
+
# Terms that mark matched content as influencer content
|
|
890
|
+
field :influencer_terms, "influencer_terms"
|
|
891
|
+
# ISO 639-1 codes to track, or the single value all
|
|
892
|
+
field :allowed_languages, "allowed_languages"
|
|
893
|
+
# Full-text search across the caption, transcript, summary, and hashtags
|
|
894
|
+
field :boolean_query, "boolean_query"
|
|
895
|
+
# Brand to update, specified as an id from brands.list
|
|
896
|
+
field :brand_id, "brand_id"
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
# The PatchedWebhookSubscriptionUpdateRequest object.
|
|
900
|
+
class PatchedWebhookSubscriptionUpdateRequest
|
|
901
|
+
# Destination URL where webhook payloads are sent
|
|
902
|
+
field :url, "url"
|
|
903
|
+
# Filters that scope which resources are delivered
|
|
904
|
+
field :resource_filters, "resource_filters"
|
|
905
|
+
# Extra HTTP headers sent with each webhook request
|
|
906
|
+
field :custom_headers, "custom_headers"
|
|
907
|
+
# Hours between snapshot deliveries
|
|
908
|
+
field :interval_hours, "interval_hours"
|
|
909
|
+
# Maximum number of items per delivery
|
|
910
|
+
field :max_items, "max_items"
|
|
911
|
+
# Whether this subscription is active and will be dispatched
|
|
912
|
+
field :enabled, "enabled"
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
# Signed, time-limited download of an analysis run's result payload.
|
|
916
|
+
class ResultFile
|
|
917
|
+
# Unix epoch seconds after which download_url expires
|
|
918
|
+
field :expires_at, "expires_at"
|
|
919
|
+
# Payload encoding
|
|
920
|
+
field :format, "format"
|
|
921
|
+
# Signed URL to request the JSON payload
|
|
922
|
+
field :download_url, "download_url"
|
|
923
|
+
end
|
|
924
|
+
|
|
925
|
+
# A single safety criterion the AI pipeline evaluates against the creator. Only
|
|
926
|
+
# ``type`` is required. The ``extra`` field supplies the label for the
|
|
927
|
+
# ``USER_DEFINED_SAFETY_CRITERION`` type and is ignored for the predefined types.
|
|
928
|
+
class SafetyCheckRequest
|
|
929
|
+
# Category of the safety criterion
|
|
930
|
+
field :type, "type"
|
|
931
|
+
# Label for USER_DEFINED_SAFETY_CRITERION, stored as the criterion's value
|
|
932
|
+
field :extra, "extra"
|
|
933
|
+
end
|
|
934
|
+
|
|
935
|
+
# Live consumption for the brand behind the current credentials.
|
|
936
|
+
class Usage
|
|
937
|
+
# Brand these figures belong to
|
|
938
|
+
field :brand_id, "brand_id"
|
|
939
|
+
# api_key or mcp, whichever made this call
|
|
940
|
+
field :authenticated_as, "authenticated_as"
|
|
941
|
+
# Keyed by group
|
|
942
|
+
field :scopes, "scopes"
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
# One metered group, with every window that has a limit.
|
|
946
|
+
class UsageScope
|
|
947
|
+
# Name of the group, as an admin sees it
|
|
948
|
+
field :human_name, "human_name"
|
|
949
|
+
# request counts calls; item counts rows returned
|
|
950
|
+
field :kind, "kind"
|
|
951
|
+
# Which product the group meters: api for direct requests, mcp for AI clients
|
|
952
|
+
field :section, "section"
|
|
953
|
+
# Keyed by window: rps, rpm, rph, rpd, rpmonth, or the item windows
|
|
954
|
+
field :windows, "windows"
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
# Consumption of one window, e.g. requests in the current hour.
|
|
958
|
+
class UsageWindow
|
|
959
|
+
# Most that may be spent in this window
|
|
960
|
+
field :limit, "limit"
|
|
961
|
+
# Spent so far in this window
|
|
962
|
+
field :used, "used"
|
|
963
|
+
# Still available in this window
|
|
964
|
+
field :remaining, "remaining"
|
|
965
|
+
# Seconds until the window resets
|
|
966
|
+
field :reset_in, "reset_in"
|
|
967
|
+
end
|
|
968
|
+
|
|
969
|
+
# The WebhookAvailableEvent object.
|
|
970
|
+
class WebhookAvailableEvent
|
|
971
|
+
# Event type identifier, e.g
|
|
972
|
+
field :event, "event"
|
|
973
|
+
# Human-readable grouping label
|
|
974
|
+
field :group, "group"
|
|
975
|
+
# What triggers the event and what the payload holds
|
|
976
|
+
field :description, "description"
|
|
977
|
+
end
|
|
978
|
+
|
|
979
|
+
# The carried content of a push. The populated key depends on `delivery_mode`.
|
|
980
|
+
# `manifest` deliveries populate `files` (downloadable snapshot files) and, for the
|
|
981
|
+
# content resource, `statistics`. `inline` deliveries populate `items` (the rows
|
|
982
|
+
# directly). The unused key is omitted.
|
|
983
|
+
class WebhookData
|
|
984
|
+
# Total number of rows in this delivery, summed across files or equal to the length...
|
|
985
|
+
field :item_count, "item_count"
|
|
986
|
+
# Aggregate totals over the snapshot, including post count, views, engagement,...
|
|
987
|
+
field :statistics, "statistics"
|
|
988
|
+
# Manifest mode only
|
|
989
|
+
field :files, "files", cast: [WebhookFile]
|
|
990
|
+
# Inline mode only
|
|
991
|
+
field :items, "items"
|
|
992
|
+
end
|
|
993
|
+
|
|
994
|
+
# The WebhookDeleteAcknowledgement object.
|
|
995
|
+
class WebhookDeleteAcknowledgement
|
|
996
|
+
# Always true; confirms the webhook resource delete was acknowledged
|
|
997
|
+
field :acknowledged, "acknowledged"
|
|
998
|
+
# Action that was performed
|
|
999
|
+
field :action, "action"
|
|
1000
|
+
# Completion status of the action
|
|
1001
|
+
field :status, "status"
|
|
1002
|
+
end
|
|
1003
|
+
|
|
1004
|
+
# The WebhookDelivery object.
|
|
1005
|
+
class WebhookDelivery
|
|
1006
|
+
# Encoded identifier of the webhook delivery
|
|
1007
|
+
field :id, "id"
|
|
1008
|
+
# Encoded identifier of the parent subscription
|
|
1009
|
+
field :subscription, "subscription"
|
|
1010
|
+
# When this delivery is scheduled to be sent
|
|
1011
|
+
field :scheduled_at, "scheduled_at", cast: :time
|
|
1012
|
+
# Number of delivery attempts made so far
|
|
1013
|
+
field :attempt_count, "attempt_count"
|
|
1014
|
+
# Current state of the delivery
|
|
1015
|
+
field :state, "state"
|
|
1016
|
+
# HTTP status code returned by the most recent attempt
|
|
1017
|
+
field :last_status_code, "last_status_code"
|
|
1018
|
+
# Error message from the most recent failed attempt
|
|
1019
|
+
field :last_error, "last_error"
|
|
1020
|
+
# Excerpt of the response body returned by the endpoint
|
|
1021
|
+
field :response_excerpt, "response_excerpt"
|
|
1022
|
+
# When the delivery finished (succeeded or exhausted)
|
|
1023
|
+
field :finished_at, "finished_at", cast: :time
|
|
1024
|
+
# Number of items included in the delivered payload
|
|
1025
|
+
field :item_count, "item_count"
|
|
1026
|
+
# SHA-256 checksum of the delivered payload
|
|
1027
|
+
field :sha256, "sha256"
|
|
1028
|
+
# Size of the delivered payload in bytes
|
|
1029
|
+
field :size_bytes, "size_bytes"
|
|
1030
|
+
# Timestamp set once when the row is first created
|
|
1031
|
+
field :created, "created", cast: :time
|
|
1032
|
+
# Timestamp updated automatically on every save
|
|
1033
|
+
field :modified, "modified", cast: :time
|
|
1034
|
+
end
|
|
1035
|
+
|
|
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.
|
|
1039
|
+
class WebhookFile
|
|
1040
|
+
# File encoding
|
|
1041
|
+
field :format, "format"
|
|
1042
|
+
# Unix epoch seconds after which download_url stops working
|
|
1043
|
+
field :expires_at, "expires_at"
|
|
1044
|
+
# Hex SHA-256 of the file body
|
|
1045
|
+
field :sha256, "sha256"
|
|
1046
|
+
# Size of the file in bytes
|
|
1047
|
+
field :size_bytes, "size_bytes"
|
|
1048
|
+
# Number of rows in this file
|
|
1049
|
+
field :item_count, "item_count"
|
|
1050
|
+
# Signed, time-limited URL from which to retrieve the file
|
|
1051
|
+
field :download_url, "download_url"
|
|
1052
|
+
end
|
|
1053
|
+
|
|
1054
|
+
# The outer payload ZelfAI POSTs to receivers, uniform across all pushes. Top-level
|
|
1055
|
+
# fields are delivery metadata and remain identical across modes. `data` carries the
|
|
1056
|
+
# content; which key inside it is populated (`files` or `items`) is determined by
|
|
1057
|
+
# `delivery_mode`. `manifest` deliveries use `data.files`, while `inline` event pushes
|
|
1058
|
+
# use `data.items`.
|
|
1059
|
+
class WebhookPush
|
|
1060
|
+
# Unique id of this delivery attempt, stable across retries of the same push
|
|
1061
|
+
field :id, "id"
|
|
1062
|
+
# Event type
|
|
1063
|
+
field :type, "type"
|
|
1064
|
+
# Id of the subscription that produced this push
|
|
1065
|
+
field :subscription_id, "subscription_id"
|
|
1066
|
+
# Unix epoch seconds at which ZelfAI sent this push
|
|
1067
|
+
field :delivered_at, "delivered_at"
|
|
1068
|
+
# true for production data; false for test deliveries
|
|
1069
|
+
field :livemode, "livemode"
|
|
1070
|
+
# Resource the push covers (content or creator) for snapshots; null for event pushes
|
|
1071
|
+
field :resource, "resource"
|
|
1072
|
+
# The subscription's stored filters that scoped this snapshot, using the same query...
|
|
1073
|
+
field :resource_filters, "resource_filters"
|
|
1074
|
+
# manifest: data.files holds downloadable snapshot files
|
|
1075
|
+
field :delivery_mode, "delivery_mode"
|
|
1076
|
+
# The push payload
|
|
1077
|
+
field :data, "data", cast: WebhookData
|
|
1078
|
+
end
|
|
1079
|
+
|
|
1080
|
+
# The WebhookSecret object.
|
|
1081
|
+
class WebhookSecret
|
|
1082
|
+
# Encoded identifier of the webhook secret
|
|
1083
|
+
field :id, "id"
|
|
1084
|
+
# Type of webhook this secret applies to
|
|
1085
|
+
field :kind, "kind"
|
|
1086
|
+
# Non-sensitive prefix of the secret, shown for identification
|
|
1087
|
+
field :secret_prefix, "secret_prefix"
|
|
1088
|
+
# Whether this secret is currently active
|
|
1089
|
+
field :is_active, "is_active"
|
|
1090
|
+
# Whether this is the default secret for the brand and kind
|
|
1091
|
+
field :is_default, "is_default"
|
|
1092
|
+
# Timestamp set once when the row is first created
|
|
1093
|
+
field :created, "created", cast: :time
|
|
1094
|
+
# Timestamp updated automatically on every save
|
|
1095
|
+
field :modified, "modified", cast: :time
|
|
1096
|
+
end
|
|
1097
|
+
|
|
1098
|
+
# The WebhookSecretCreateRequest object.
|
|
1099
|
+
class WebhookSecretCreateRequest
|
|
1100
|
+
# Whether the secret is for snapshot or event webhooks
|
|
1101
|
+
field :kind, "kind"
|
|
1102
|
+
# Set this secret as the default for its kind
|
|
1103
|
+
field :make_default, "make_default"
|
|
1104
|
+
end
|
|
1105
|
+
|
|
1106
|
+
# The WebhookSecretCreated object.
|
|
1107
|
+
class WebhookSecretCreated
|
|
1108
|
+
# Encoded identifier of the webhook secret
|
|
1109
|
+
field :id, "id"
|
|
1110
|
+
# Type of webhook this secret applies to
|
|
1111
|
+
field :kind, "kind"
|
|
1112
|
+
# Non-sensitive prefix of the secret, shown for identification
|
|
1113
|
+
field :secret_prefix, "secret_prefix"
|
|
1114
|
+
# Whether this secret is currently active
|
|
1115
|
+
field :is_active, "is_active"
|
|
1116
|
+
# Whether this is the default secret for the brand and kind
|
|
1117
|
+
field :is_default, "is_default"
|
|
1118
|
+
# Timestamp set once when the row is first created
|
|
1119
|
+
field :created, "created", cast: :time
|
|
1120
|
+
# Timestamp updated automatically on every save
|
|
1121
|
+
field :modified, "modified", cast: :time
|
|
1122
|
+
# Full signing secret, returned only once on creation
|
|
1123
|
+
field :secret, "secret"
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
# The WebhookSubscription object.
|
|
1127
|
+
class WebhookSubscription
|
|
1128
|
+
# Encoded identifier of the webhook subscription
|
|
1129
|
+
field :id, "id"
|
|
1130
|
+
# Type of webhook this subscription delivers
|
|
1131
|
+
field :kind, "kind"
|
|
1132
|
+
# Resource type the subscription is for (content or creator)
|
|
1133
|
+
field :resource, "resource"
|
|
1134
|
+
# Event types the subscription listens for
|
|
1135
|
+
field :event_types, "event_types"
|
|
1136
|
+
# Filters applied to select which resources are delivered
|
|
1137
|
+
field :resource_filters, "resource_filters"
|
|
1138
|
+
# Destination URL where webhook payloads are sent
|
|
1139
|
+
field :url, "url"
|
|
1140
|
+
# Custom HTTP headers to include with each delivery
|
|
1141
|
+
field :custom_headers, "custom_headers"
|
|
1142
|
+
# Hours between snapshot deliveries
|
|
1143
|
+
field :interval_hours, "interval_hours"
|
|
1144
|
+
# Max rows a real snapshot delivers
|
|
1145
|
+
field :max_items, "max_items"
|
|
1146
|
+
# Public prefix of the subscription signing secret
|
|
1147
|
+
field :secret_prefix, "secret_prefix"
|
|
1148
|
+
# Whether this subscription is active and will be dispatched
|
|
1149
|
+
field :enabled, "enabled"
|
|
1150
|
+
# When this subscription last dispatched a delivery
|
|
1151
|
+
field :last_run_at, "last_run_at", cast: :time
|
|
1152
|
+
# Outcome status of the most recent delivery
|
|
1153
|
+
field :last_status, "last_status"
|
|
1154
|
+
# Timestamp set once when the row is first created
|
|
1155
|
+
field :created, "created", cast: :time
|
|
1156
|
+
# Timestamp updated automatically on every save
|
|
1157
|
+
field :modified, "modified", cast: :time
|
|
1158
|
+
end
|
|
1159
|
+
|
|
1160
|
+
# The WebhookSubscriptionCreateRequest object.
|
|
1161
|
+
class WebhookSubscriptionCreateRequest
|
|
1162
|
+
# Whether the subscription is snapshot or event based
|
|
1163
|
+
field :kind, "kind"
|
|
1164
|
+
# Resource type for snapshot subscriptions
|
|
1165
|
+
field :resource, "resource"
|
|
1166
|
+
# Event names the subscription listens for
|
|
1167
|
+
field :event_types, "event_types"
|
|
1168
|
+
# Filters that scope which resources are delivered
|
|
1169
|
+
field :resource_filters, "resource_filters"
|
|
1170
|
+
# Destination URL where webhook payloads are sent
|
|
1171
|
+
field :url, "url"
|
|
1172
|
+
# Extra HTTP headers sent with each webhook request
|
|
1173
|
+
field :custom_headers, "custom_headers"
|
|
1174
|
+
# Hours between snapshot deliveries
|
|
1175
|
+
field :interval_hours, "interval_hours"
|
|
1176
|
+
# Maximum number of items per delivery
|
|
1177
|
+
field :max_items, "max_items"
|
|
1178
|
+
# Type of signing secret to attach to the subscription
|
|
1179
|
+
field :secret_type, "secret_type"
|
|
1180
|
+
end
|
|
1181
|
+
|
|
1182
|
+
# The WebhookSubscriptionCreated object.
|
|
1183
|
+
class WebhookSubscriptionCreated
|
|
1184
|
+
# Encoded identifier of the webhook subscription
|
|
1185
|
+
field :id, "id"
|
|
1186
|
+
# Type of webhook this subscription delivers
|
|
1187
|
+
field :kind, "kind"
|
|
1188
|
+
# Resource type the subscription is for (content or creator)
|
|
1189
|
+
field :resource, "resource"
|
|
1190
|
+
# Event types the subscription listens for
|
|
1191
|
+
field :event_types, "event_types"
|
|
1192
|
+
# Filters applied to select which resources are delivered
|
|
1193
|
+
field :resource_filters, "resource_filters"
|
|
1194
|
+
# Destination URL where webhook payloads are sent
|
|
1195
|
+
field :url, "url"
|
|
1196
|
+
# Custom HTTP headers to include with each delivery
|
|
1197
|
+
field :custom_headers, "custom_headers"
|
|
1198
|
+
# Hours between snapshot deliveries
|
|
1199
|
+
field :interval_hours, "interval_hours"
|
|
1200
|
+
# Max rows a real snapshot delivers
|
|
1201
|
+
field :max_items, "max_items"
|
|
1202
|
+
# Public prefix of the subscription signing secret
|
|
1203
|
+
field :secret_prefix, "secret_prefix"
|
|
1204
|
+
# Full signing secret, returned only once, at the moment it is minted
|
|
1205
|
+
field :secret, "secret"
|
|
1206
|
+
# Whether this subscription is active and will be dispatched
|
|
1207
|
+
field :enabled, "enabled"
|
|
1208
|
+
# Timestamp set once when the row is first created
|
|
1209
|
+
field :created, "created", cast: :time
|
|
1210
|
+
end
|
|
1211
|
+
|
|
1212
|
+
end
|
|
1213
|
+
end
|