airbyte-source-google-search-console 1.6.0.dev202503282247__py3-none-any.whl → 1.7.0__py3-none-any.whl
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.
- {airbyte_source_google_search_console-1.6.0.dev202503282247.dist-info → airbyte_source_google_search_console-1.7.0.dist-info}/METADATA +4 -4
- airbyte_source_google_search_console-1.7.0.dist-info/RECORD +22 -0
- {airbyte_source_google_search_console-1.6.0.dev202503282247.dist-info → airbyte_source_google_search_console-1.7.0.dist-info}/WHEEL +1 -1
- source_google_search_console/components.py +81 -0
- source_google_search_console/config_migrations.py +4 -1
- source_google_search_console/manifest.yaml +828 -0
- source_google_search_console/run.py +47 -9
- source_google_search_console/service_account_authenticator.py +3 -1
- source_google_search_console/source.py +23 -59
- source_google_search_console/spec.json +7 -0
- source_google_search_console/streams.py +1 -121
- airbyte_source_google_search_console-1.6.0.dev202503282247.dist-info/RECORD +0 -29
- source_google_search_console/schemas/search_analytics_by_country.json +0 -41
- source_google_search_console/schemas/search_analytics_keyword_page_report.json +0 -54
- source_google_search_console/schemas/search_analytics_keyword_page_report_minimal_dimensions.json +0 -54
- source_google_search_console/schemas/search_analytics_keyword_site_report_by_page.json +0 -50
- source_google_search_console/schemas/search_analytics_keyword_site_report_by_page_minimal_dimensions.json +0 -50
- source_google_search_console/schemas/search_analytics_keyword_site_report_by_site.json +0 -50
- source_google_search_console/schemas/search_analytics_keyword_site_report_by_site_minimal_dimensions.json +0 -50
- source_google_search_console/schemas/sitemaps.json +0 -61
- source_google_search_console/schemas/sites.json +0 -14
- {airbyte_source_google_search_console-1.6.0.dev202503282247.dist-info → airbyte_source_google_search_console-1.7.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,828 @@
|
|
1
|
+
version: 6.44.0
|
2
|
+
|
3
|
+
type: DeclarativeSource
|
4
|
+
|
5
|
+
check:
|
6
|
+
type: CheckStream
|
7
|
+
stream_names:
|
8
|
+
- sites
|
9
|
+
|
10
|
+
definitions:
|
11
|
+
oauth_authenticator:
|
12
|
+
type: OAuthAuthenticator
|
13
|
+
client_id: "{{ config.get('authorization', {}).get('client_id') }}"
|
14
|
+
client_secret: "{{ config.get('authorization', {}).get('client_secret') }}"
|
15
|
+
refresh_token: "{{ config.get('authorization', {}).get('refresh_token') }}"
|
16
|
+
token_refresh_endpoint: "https://oauth2.googleapis.com/token"
|
17
|
+
|
18
|
+
jwt_profile_assertion_oauth_authenticator:
|
19
|
+
type: OAuthAuthenticator
|
20
|
+
token_refresh_endpoint: https://oauth2.googleapis.com/token
|
21
|
+
refresh_request_headers:
|
22
|
+
Content-Type: application/x-www-form-urlencoded
|
23
|
+
use_profile_assertion: true
|
24
|
+
profile_assertion:
|
25
|
+
type: JwtAuthenticator
|
26
|
+
secret_key: "{{ json_loads(config.get('authorization', {}).get('service_account_info', {})).get('private_key') }}"
|
27
|
+
algorithm: "RS256"
|
28
|
+
token_duration: 3600
|
29
|
+
jwt_payload:
|
30
|
+
aud: "{{ json_loads(config.get('authorization', {}).get('service_account_info', {})).get('token_uri') }}"
|
31
|
+
iss: "{{ json_loads(config.get('authorization', {}).get('service_account_info', {})).get('client_email') }}"
|
32
|
+
additional_jwt_payload:
|
33
|
+
scope: "https://www.googleapis.com/auth/webmasters.readonly"
|
34
|
+
|
35
|
+
selective_authenticator:
|
36
|
+
type: SelectiveAuthenticator
|
37
|
+
authenticator_selection_path: ["authorization", "auth_type"]
|
38
|
+
authenticators:
|
39
|
+
Client: "#/definitions/oauth_authenticator"
|
40
|
+
Service: "#/definitions/jwt_profile_assertion_oauth_authenticator"
|
41
|
+
|
42
|
+
search_analytics_by_country_stream:
|
43
|
+
type: DeclarativeStream
|
44
|
+
name: search_analytics_by_country
|
45
|
+
primary_key:
|
46
|
+
- site_url
|
47
|
+
- date
|
48
|
+
- country
|
49
|
+
- search_type
|
50
|
+
retriever:
|
51
|
+
type: SimpleRetriever
|
52
|
+
requester:
|
53
|
+
type: HttpRequester
|
54
|
+
url_base: https://www.googleapis.com/webmasters/v3
|
55
|
+
path: "/sites/{{ sanitize_url(stream_partition.get('site_url')) }}/searchAnalytics/query"
|
56
|
+
http_method: POST
|
57
|
+
authenticator: "#/definitions/selective_authenticator"
|
58
|
+
request_headers:
|
59
|
+
Content-Type: "application/json"
|
60
|
+
request_body_json:
|
61
|
+
startDate: "{{ stream_interval.get('start_time') }}"
|
62
|
+
endDate: "{{ stream_interval.get('end_time') }}"
|
63
|
+
dimensions: ["date", "country"]
|
64
|
+
type: "{{ stream_partition.get('search_type') }}"
|
65
|
+
aggregationType: auto
|
66
|
+
dataState: "{{ config.get('data_state', 'final') }}"
|
67
|
+
# Currently relying on the default error handler behavior. Two pieces of functionality not covered are
|
68
|
+
# - Silently skipping over 403 permissions errors and relying on partial success reporting
|
69
|
+
# - Retrying 400 errors with aggregation_type=auto instead of failing outright
|
70
|
+
paginator:
|
71
|
+
type: DefaultPaginator
|
72
|
+
page_token_option:
|
73
|
+
type: RequestOption
|
74
|
+
field_name: startRow
|
75
|
+
inject_into: body_json
|
76
|
+
page_size_option:
|
77
|
+
type: RequestOption
|
78
|
+
field_name: rowLimit
|
79
|
+
inject_into: body_json
|
80
|
+
pagination_strategy:
|
81
|
+
type: OffsetIncrement
|
82
|
+
page_size: 25000
|
83
|
+
inject_on_first_request: true
|
84
|
+
record_selector:
|
85
|
+
type: RecordSelector
|
86
|
+
extractor:
|
87
|
+
type: DpathExtractor
|
88
|
+
field_path:
|
89
|
+
- rows
|
90
|
+
partition_router:
|
91
|
+
- type: ListPartitionRouter
|
92
|
+
values: "{{ config['site_urls'] }}"
|
93
|
+
cursor_field: site_url
|
94
|
+
- type: ListPartitionRouter
|
95
|
+
values:
|
96
|
+
- web
|
97
|
+
- news
|
98
|
+
- image
|
99
|
+
- video
|
100
|
+
- discover
|
101
|
+
- googleNews
|
102
|
+
cursor_field: search_type
|
103
|
+
incremental_sync:
|
104
|
+
type: DatetimeBasedCursor
|
105
|
+
cursor_field: date
|
106
|
+
cursor_datetime_formats:
|
107
|
+
- "%Y-%m-%d"
|
108
|
+
datetime_format: "%Y-%m-%d"
|
109
|
+
start_datetime:
|
110
|
+
type: MinMaxDatetime
|
111
|
+
datetime: "{{ config.get('start_date', '2021-01-01') }}"
|
112
|
+
datetime_format: "%Y-%m-%d"
|
113
|
+
end_datetime:
|
114
|
+
type: MinMaxDatetime
|
115
|
+
datetime: "{{ config.get('end_date', today_utc()) }}"
|
116
|
+
datetime_format: "%Y-%m-%d"
|
117
|
+
step: P3D
|
118
|
+
cursor_granularity: P1D
|
119
|
+
transformations:
|
120
|
+
- type: AddFields
|
121
|
+
fields:
|
122
|
+
- path:
|
123
|
+
- site_url
|
124
|
+
value: "{{ stream_partition['site_url'] }}"
|
125
|
+
- path:
|
126
|
+
- search_type
|
127
|
+
value: "{{ stream_partition['search_type'] }}"
|
128
|
+
# The values in the 'keys' array in the record correspond to the same order that the dimensions
|
129
|
+
# are requested in the API request. For example, if the request body was `dimensions: ["date", "country"]`,
|
130
|
+
# then the first value of `keys` is placed under the `date` field. These arrays are always be the same length
|
131
|
+
# After extracting the keys, the `keys` array is removed from the record.
|
132
|
+
- type: AddFields
|
133
|
+
fields:
|
134
|
+
- path:
|
135
|
+
- date
|
136
|
+
value: "{{ record['keys'][0] }}"
|
137
|
+
- path:
|
138
|
+
- country
|
139
|
+
value: "{{ record['keys'][1] }}"
|
140
|
+
- type: RemoveFields
|
141
|
+
field_pointers:
|
142
|
+
- - keys
|
143
|
+
schema_loader:
|
144
|
+
type: InlineSchemaLoader
|
145
|
+
schema:
|
146
|
+
$ref: "#/schemas/search_analytics_by_country"
|
147
|
+
state_migrations:
|
148
|
+
- type: CustomStateMigration
|
149
|
+
class_name: source_google_search_console.components.NestedSubstreamStateMigration
|
150
|
+
|
151
|
+
sites_stream:
|
152
|
+
type: DeclarativeStream
|
153
|
+
name: sites
|
154
|
+
retriever:
|
155
|
+
type: SimpleRetriever
|
156
|
+
requester:
|
157
|
+
type: HttpRequester
|
158
|
+
url_base: https://www.googleapis.com/webmasters/v3
|
159
|
+
path: "/sites/{{ sanitize_url(stream_partition.get('site_url')) }}"
|
160
|
+
http_method: GET
|
161
|
+
authenticator: "#/definitions/selective_authenticator"
|
162
|
+
record_selector:
|
163
|
+
type: RecordSelector
|
164
|
+
extractor:
|
165
|
+
type: DpathExtractor
|
166
|
+
field_path: []
|
167
|
+
partition_router:
|
168
|
+
- type: ListPartitionRouter
|
169
|
+
values: "{{ config['site_urls'] }}"
|
170
|
+
cursor_field: site_url
|
171
|
+
schema_loader:
|
172
|
+
type: InlineSchemaLoader
|
173
|
+
schema:
|
174
|
+
$ref: "#/schemas/sites"
|
175
|
+
|
176
|
+
sitemaps_stream:
|
177
|
+
type: DeclarativeStream
|
178
|
+
name: sitemaps
|
179
|
+
retriever:
|
180
|
+
type: SimpleRetriever
|
181
|
+
requester:
|
182
|
+
type: HttpRequester
|
183
|
+
url_base: https://www.googleapis.com/webmasters/v3
|
184
|
+
path: "/sites/{{ sanitize_url(stream_partition.get('site_url')) }}/sitemaps"
|
185
|
+
http_method: GET
|
186
|
+
authenticator: "#/definitions/selective_authenticator"
|
187
|
+
record_selector:
|
188
|
+
type: RecordSelector
|
189
|
+
extractor:
|
190
|
+
type: DpathExtractor
|
191
|
+
field_path:
|
192
|
+
- "sitemap"
|
193
|
+
partition_router:
|
194
|
+
- type: ListPartitionRouter
|
195
|
+
values: "{{ config['site_urls'] }}"
|
196
|
+
cursor_field: site_url
|
197
|
+
schema_loader:
|
198
|
+
type: InlineSchemaLoader
|
199
|
+
schema:
|
200
|
+
$ref: "#/schemas/sitemaps"
|
201
|
+
|
202
|
+
# This stream is only used as a parent stream for search_by_keyword substreams
|
203
|
+
search_appearances_stream:
|
204
|
+
type: DeclarativeStream
|
205
|
+
name: search_appearances
|
206
|
+
retriever:
|
207
|
+
type: SimpleRetriever
|
208
|
+
requester:
|
209
|
+
type: HttpRequester
|
210
|
+
url_base: https://www.googleapis.com/webmasters/v3
|
211
|
+
path: "/sites/{{ sanitize_url(stream_partition.get('site_url')) }}/searchAnalytics/query"
|
212
|
+
http_method: POST
|
213
|
+
authenticator: "#/definitions/selective_authenticator"
|
214
|
+
request_headers:
|
215
|
+
Content-Type: "application/json"
|
216
|
+
request_body_json:
|
217
|
+
startDate: "{{ config.get('start_date') }}"
|
218
|
+
endDate: "{{ config.get('end_date') }}"
|
219
|
+
dimensions: ["searchAppearance"]
|
220
|
+
type: "{{ stream_partition.get('search_type') }}"
|
221
|
+
aggregationType: auto
|
222
|
+
dataState: "{{ config.get('data_state', 'final') }}"
|
223
|
+
paginator:
|
224
|
+
type: DefaultPaginator
|
225
|
+
page_token_option:
|
226
|
+
type: RequestOption
|
227
|
+
field_name: startRow
|
228
|
+
inject_into: body_json
|
229
|
+
page_size_option:
|
230
|
+
type: RequestOption
|
231
|
+
field_name: rowLimit
|
232
|
+
inject_into: body_json
|
233
|
+
pagination_strategy:
|
234
|
+
type: OffsetIncrement
|
235
|
+
page_size: 25000
|
236
|
+
inject_on_first_request: true
|
237
|
+
record_selector:
|
238
|
+
type: RecordSelector
|
239
|
+
extractor:
|
240
|
+
type: DpathExtractor
|
241
|
+
field_path:
|
242
|
+
- rows
|
243
|
+
partition_router:
|
244
|
+
- type: ListPartitionRouter
|
245
|
+
values: "{{ config['site_urls'] }}"
|
246
|
+
cursor_field: site_url
|
247
|
+
- type: ListPartitionRouter
|
248
|
+
values:
|
249
|
+
- web
|
250
|
+
- news
|
251
|
+
- image
|
252
|
+
- video
|
253
|
+
cursor_field: search_type
|
254
|
+
transformations:
|
255
|
+
- type: AddFields
|
256
|
+
fields:
|
257
|
+
- path:
|
258
|
+
- searchAppearance
|
259
|
+
value: "{{ record['keys'][0] }}"
|
260
|
+
- type: RemoveFields
|
261
|
+
field_pointers:
|
262
|
+
- - keys
|
263
|
+
|
264
|
+
base_search_analytics_keyword_stream:
|
265
|
+
type: DeclarativeStream
|
266
|
+
retriever:
|
267
|
+
type: SimpleRetriever
|
268
|
+
requester:
|
269
|
+
type: HttpRequester
|
270
|
+
url_base: https://www.googleapis.com/webmasters/v3
|
271
|
+
path: "/sites/{{ sanitize_url(stream_partition.get('site_url')) }}/searchAnalytics/query"
|
272
|
+
http_method: POST
|
273
|
+
authenticator: "#/definitions/selective_authenticator"
|
274
|
+
request_headers:
|
275
|
+
Content-Type: "application/json"
|
276
|
+
request_body_json:
|
277
|
+
startDate: "{{ stream_interval.get('start_time') }}"
|
278
|
+
endDate: "{{ stream_interval.get('end_time') }}"
|
279
|
+
dimensions: "{{ parameters.get('dimensions') }}"
|
280
|
+
type: "{{ stream_partition.get('parent_slice', {}).get('search_type') }}"
|
281
|
+
aggregationType: "{{ 'auto' if config.get('always_use_aggregation_type_auto') else parameters.get('aggregationType') }}"
|
282
|
+
dataState: "{{ config.get('data_state', 'final') }}"
|
283
|
+
dimensionFilterGroups: "{{ [{'groupType': 'and', 'filters': {'dimension': 'searchAppearance', 'operator': 'equals', 'expression': stream_partition.get('search_appearance')}}] }}"
|
284
|
+
error_handler:
|
285
|
+
type: DefaultErrorHandler
|
286
|
+
response_filters:
|
287
|
+
- type: HttpResponseFilter
|
288
|
+
action: FAIL
|
289
|
+
http_codes:
|
290
|
+
- 400
|
291
|
+
error_message: >-
|
292
|
+
Invalid aggregationType '{{ parameters.get('aggregationType') }}' used in the body of the API request. If you see this error, enable the
|
293
|
+
'always_use_aggregation_type_auto' config setting which will automatically use aggregationType=auto
|
294
|
+
paginator:
|
295
|
+
type: DefaultPaginator
|
296
|
+
page_token_option:
|
297
|
+
type: RequestOption
|
298
|
+
field_name: startRow
|
299
|
+
inject_into: body_json
|
300
|
+
page_size_option:
|
301
|
+
type: RequestOption
|
302
|
+
field_name: rowLimit
|
303
|
+
inject_into: body_json
|
304
|
+
pagination_strategy:
|
305
|
+
type: OffsetIncrement
|
306
|
+
page_size: 25000
|
307
|
+
inject_on_first_request: true
|
308
|
+
record_selector:
|
309
|
+
type: RecordSelector
|
310
|
+
extractor:
|
311
|
+
type: DpathExtractor
|
312
|
+
field_path:
|
313
|
+
- rows
|
314
|
+
partition_router:
|
315
|
+
- type: ListPartitionRouter
|
316
|
+
values: "{{ config['site_urls'] }}"
|
317
|
+
cursor_field: site_url
|
318
|
+
- type: SubstreamPartitionRouter
|
319
|
+
parent_stream_configs:
|
320
|
+
- type: ParentStreamConfig
|
321
|
+
parent_key: searchAppearance
|
322
|
+
partition_field: search_appearance
|
323
|
+
stream:
|
324
|
+
$ref: "#/definitions/search_appearances_stream"
|
325
|
+
incremental_sync:
|
326
|
+
type: DatetimeBasedCursor
|
327
|
+
cursor_field: date
|
328
|
+
cursor_datetime_formats:
|
329
|
+
- "%Y-%m-%d"
|
330
|
+
datetime_format: "%Y-%m-%d"
|
331
|
+
start_datetime:
|
332
|
+
type: MinMaxDatetime
|
333
|
+
datetime: "{{ config.get('start_date', '2021-01-01') }}"
|
334
|
+
datetime_format: "%Y-%m-%d"
|
335
|
+
end_datetime:
|
336
|
+
type: MinMaxDatetime
|
337
|
+
datetime: "{{ config.get('end_date', today_utc()) }}"
|
338
|
+
datetime_format: "%Y-%m-%d"
|
339
|
+
step: P3D
|
340
|
+
cursor_granularity: P1D
|
341
|
+
|
342
|
+
search_analytics_keyword_page_report_stream:
|
343
|
+
$ref: "#/definitions/base_search_analytics_keyword_stream"
|
344
|
+
name: search_analytics_keyword_page_report
|
345
|
+
primary_key:
|
346
|
+
- site_url
|
347
|
+
- date
|
348
|
+
- country
|
349
|
+
- device
|
350
|
+
- query
|
351
|
+
- page
|
352
|
+
- search_type
|
353
|
+
transformations:
|
354
|
+
- type: AddFields
|
355
|
+
fields:
|
356
|
+
- path:
|
357
|
+
- site_url
|
358
|
+
value: "{{ stream_partition['site_url'] }}"
|
359
|
+
- path:
|
360
|
+
- search_type
|
361
|
+
value: "{{ stream_partition.get('parent_slice', {}).get('search_type') }}"
|
362
|
+
- type: AddFields
|
363
|
+
fields:
|
364
|
+
- path:
|
365
|
+
- date
|
366
|
+
value: "{{ record['keys'][0] }}"
|
367
|
+
- path:
|
368
|
+
- country
|
369
|
+
value: "{{ record['keys'][1] }}"
|
370
|
+
- path:
|
371
|
+
- device
|
372
|
+
value: "{{ record['keys'][2] }}"
|
373
|
+
- path:
|
374
|
+
- query
|
375
|
+
value: "{{ record['keys'][3] }}"
|
376
|
+
- path:
|
377
|
+
- page
|
378
|
+
value: "{{ record['keys'][4] }}"
|
379
|
+
- type: RemoveFields
|
380
|
+
field_pointers:
|
381
|
+
- - keys
|
382
|
+
schema_loader:
|
383
|
+
type: InlineSchemaLoader
|
384
|
+
schema:
|
385
|
+
$ref: "#/schemas/search_analytics_keyword_page_report"
|
386
|
+
$parameters:
|
387
|
+
aggregationType: auto
|
388
|
+
dimensions:
|
389
|
+
- date
|
390
|
+
- country
|
391
|
+
- device
|
392
|
+
- query
|
393
|
+
- page
|
394
|
+
|
395
|
+
search_analytics_keyword_site_report_by_page_stream:
|
396
|
+
$ref: "#/definitions/base_search_analytics_keyword_stream"
|
397
|
+
name: search_analytics_keyword_site_report_by_page
|
398
|
+
primary_key:
|
399
|
+
- site_url
|
400
|
+
- date
|
401
|
+
- country
|
402
|
+
- device
|
403
|
+
- query
|
404
|
+
- search_type
|
405
|
+
transformations:
|
406
|
+
- type: AddFields
|
407
|
+
fields:
|
408
|
+
- path:
|
409
|
+
- site_url
|
410
|
+
value: "{{ stream_partition['site_url'] }}"
|
411
|
+
- path:
|
412
|
+
- search_type
|
413
|
+
value: "{{ stream_partition.get('parent_slice', {}).get('search_type') }}"
|
414
|
+
- type: AddFields
|
415
|
+
fields:
|
416
|
+
- path:
|
417
|
+
- date
|
418
|
+
value: "{{ record['keys'][0] }}"
|
419
|
+
- path:
|
420
|
+
- country
|
421
|
+
value: "{{ record['keys'][1] }}"
|
422
|
+
- path:
|
423
|
+
- device
|
424
|
+
value: "{{ record['keys'][2] }}"
|
425
|
+
- path:
|
426
|
+
- query
|
427
|
+
value: "{{ record['keys'][3] }}"
|
428
|
+
- type: RemoveFields
|
429
|
+
field_pointers:
|
430
|
+
- - keys
|
431
|
+
schema_loader:
|
432
|
+
type: InlineSchemaLoader
|
433
|
+
schema:
|
434
|
+
$ref: "#/schemas/search_analytics_keyword_site_report_by_page"
|
435
|
+
$parameters:
|
436
|
+
aggregationType: byPage
|
437
|
+
dimensions:
|
438
|
+
- date
|
439
|
+
- country
|
440
|
+
- device
|
441
|
+
- query
|
442
|
+
|
443
|
+
search_analytics_keyword_site_report_by_site_stream:
|
444
|
+
$ref: "#/definitions/base_search_analytics_keyword_stream"
|
445
|
+
name: search_analytics_keyword_site_report_by_site
|
446
|
+
primary_key:
|
447
|
+
- site_url
|
448
|
+
- date
|
449
|
+
- country
|
450
|
+
- device
|
451
|
+
- query
|
452
|
+
- search_type
|
453
|
+
transformations:
|
454
|
+
- type: AddFields
|
455
|
+
fields:
|
456
|
+
- path:
|
457
|
+
- site_url
|
458
|
+
value: "{{ stream_partition['site_url'] }}"
|
459
|
+
- path:
|
460
|
+
- search_type
|
461
|
+
value: "{{ stream_partition.get('parent_slice', {}).get('search_type') }}"
|
462
|
+
- type: AddFields
|
463
|
+
fields:
|
464
|
+
- path:
|
465
|
+
- date
|
466
|
+
value: "{{ record['keys'][0] }}"
|
467
|
+
- path:
|
468
|
+
- country
|
469
|
+
value: "{{ record['keys'][1] }}"
|
470
|
+
- path:
|
471
|
+
- device
|
472
|
+
value: "{{ record['keys'][2] }}"
|
473
|
+
- path:
|
474
|
+
- query
|
475
|
+
value: "{{ record['keys'][3] }}"
|
476
|
+
- type: RemoveFields
|
477
|
+
field_pointers:
|
478
|
+
- - keys
|
479
|
+
schema_loader:
|
480
|
+
type: InlineSchemaLoader
|
481
|
+
schema:
|
482
|
+
$ref: "#/schemas/search_analytics_keyword_site_report_by_site"
|
483
|
+
$parameters:
|
484
|
+
aggregationType: byProperty
|
485
|
+
dimensions:
|
486
|
+
- date
|
487
|
+
- country
|
488
|
+
- device
|
489
|
+
- query
|
490
|
+
|
491
|
+
streams:
|
492
|
+
# Regular streams
|
493
|
+
- "#/definitions/sites_stream"
|
494
|
+
- "#/definitions/sitemaps_stream"
|
495
|
+
# Search Analytics streams
|
496
|
+
- "#/definitions/search_analytics_by_country_stream"
|
497
|
+
# Search Analytics Keyword streams
|
498
|
+
- "#/definitions/search_analytics_keyword_page_report_stream"
|
499
|
+
- "#/definitions/search_analytics_keyword_site_report_by_page_stream"
|
500
|
+
- "#/definitions/search_analytics_keyword_site_report_by_site_stream"
|
501
|
+
|
502
|
+
schemas:
|
503
|
+
search_analytics_by_country:
|
504
|
+
$schema: "http://json-schema.org/draft-07/schema#"
|
505
|
+
type: object
|
506
|
+
properties:
|
507
|
+
site_url:
|
508
|
+
description: The URL of the site for which the search analytics data is being reported.
|
509
|
+
type:
|
510
|
+
- "null"
|
511
|
+
- string
|
512
|
+
search_type:
|
513
|
+
description: >-
|
514
|
+
The type of search (web search, image search, video search, etc.) for
|
515
|
+
which the data is being reported.
|
516
|
+
type:
|
517
|
+
- "null"
|
518
|
+
- string
|
519
|
+
date:
|
520
|
+
description: The date for which the search analytics data is being reported.
|
521
|
+
type:
|
522
|
+
- "null"
|
523
|
+
- string
|
524
|
+
format: date
|
525
|
+
country:
|
526
|
+
description: The country for which the search analytics data is being reported.
|
527
|
+
type:
|
528
|
+
- "null"
|
529
|
+
- string
|
530
|
+
clicks:
|
531
|
+
description: >-
|
532
|
+
The number of times users clicked on the search result for a specific
|
533
|
+
country.
|
534
|
+
type:
|
535
|
+
- "null"
|
536
|
+
- integer
|
537
|
+
impressions:
|
538
|
+
description: >-
|
539
|
+
The total number of times a search result was shown in search results for
|
540
|
+
a specific country.
|
541
|
+
type:
|
542
|
+
- "null"
|
543
|
+
- integer
|
544
|
+
ctr:
|
545
|
+
description: >-
|
546
|
+
The click-through rate, i.e., the ratio of clicks to impressions for a
|
547
|
+
specific country.
|
548
|
+
type:
|
549
|
+
- "null"
|
550
|
+
- number
|
551
|
+
multipleOf: 1.e-25
|
552
|
+
position:
|
553
|
+
description: >-
|
554
|
+
The average position at which the site's search result appeared for a
|
555
|
+
specific country.
|
556
|
+
type:
|
557
|
+
- "null"
|
558
|
+
- number
|
559
|
+
multipleOf: 1.e-25
|
560
|
+
sites:
|
561
|
+
$schema: "http://json-schema.org/draft-07/schema#"
|
562
|
+
type: object
|
563
|
+
properties:
|
564
|
+
siteUrl:
|
565
|
+
description: "The URL of the site data being fetched"
|
566
|
+
type: ["null", "string"]
|
567
|
+
permissionLevel:
|
568
|
+
description: "The user's permission level for the site (owner, full, restricted, etc.)"
|
569
|
+
type: ["null", "string"]
|
570
|
+
sitemaps:
|
571
|
+
$schema: "http://json-schema.org/draft-07/schema#"
|
572
|
+
type: object
|
573
|
+
properties:
|
574
|
+
path:
|
575
|
+
description: "Path to the sitemap file"
|
576
|
+
type:
|
577
|
+
- "null"
|
578
|
+
- string
|
579
|
+
lastSubmitted:
|
580
|
+
description: "Timestamp when the sitemap was last submitted"
|
581
|
+
type:
|
582
|
+
- "null"
|
583
|
+
- string
|
584
|
+
format: date-time
|
585
|
+
isPending:
|
586
|
+
description: "Flag indicating if the sitemap is pending for processing"
|
587
|
+
type:
|
588
|
+
- "null"
|
589
|
+
- boolean
|
590
|
+
isSitemapsIndex:
|
591
|
+
description: "Flag indicating if the data represents a sitemap index"
|
592
|
+
type:
|
593
|
+
- "null"
|
594
|
+
- boolean
|
595
|
+
type:
|
596
|
+
description: "Type of the sitemap"
|
597
|
+
type:
|
598
|
+
- "null"
|
599
|
+
- string
|
600
|
+
lastDownloaded:
|
601
|
+
description: "Timestamp when the sitemap was last downloaded"
|
602
|
+
type:
|
603
|
+
- "null"
|
604
|
+
- string
|
605
|
+
format: date-time
|
606
|
+
warnings:
|
607
|
+
description: "Warnings encountered while processing the sitemaps"
|
608
|
+
type:
|
609
|
+
- "null"
|
610
|
+
- string
|
611
|
+
errors:
|
612
|
+
description: "Errors encountered while processing the sitemaps"
|
613
|
+
type:
|
614
|
+
- "null"
|
615
|
+
- string
|
616
|
+
contents:
|
617
|
+
description: "Data related to the sitemap contents"
|
618
|
+
type: array
|
619
|
+
items:
|
620
|
+
type: object
|
621
|
+
properties:
|
622
|
+
type:
|
623
|
+
description: "Type of the sitemap content"
|
624
|
+
type:
|
625
|
+
- "null"
|
626
|
+
- string
|
627
|
+
submitted:
|
628
|
+
description: "Number of submitted sitemap URLs"
|
629
|
+
type:
|
630
|
+
- "null"
|
631
|
+
- string
|
632
|
+
indexed:
|
633
|
+
description: "Number of indexed sitemap URLs"
|
634
|
+
type:
|
635
|
+
- "null"
|
636
|
+
- string
|
637
|
+
|
638
|
+
search_analytics_keyword_page_report:
|
639
|
+
$schema: "https://json-schema.org/draft-07/schema#"
|
640
|
+
type: object
|
641
|
+
additionalProperties: true
|
642
|
+
properties:
|
643
|
+
site_url:
|
644
|
+
description: The URL of the website being monitored.
|
645
|
+
type:
|
646
|
+
- "null"
|
647
|
+
- string
|
648
|
+
search_type:
|
649
|
+
description: "The type of search (e.g., web, image, video)."
|
650
|
+
type:
|
651
|
+
- "null"
|
652
|
+
- string
|
653
|
+
date:
|
654
|
+
description: The date of the search data collected.
|
655
|
+
type:
|
656
|
+
- "null"
|
657
|
+
- string
|
658
|
+
format: date
|
659
|
+
country:
|
660
|
+
description: The country where the search is made.
|
661
|
+
type:
|
662
|
+
- "null"
|
663
|
+
- string
|
664
|
+
device:
|
665
|
+
description: "The device type used for the search (e.g., desktop, mobile)."
|
666
|
+
type:
|
667
|
+
- "null"
|
668
|
+
- string
|
669
|
+
page:
|
670
|
+
description: The page URL on which the keyword appears in search results.
|
671
|
+
type:
|
672
|
+
- "null"
|
673
|
+
- string
|
674
|
+
query:
|
675
|
+
description: The search query used to find the site.
|
676
|
+
type:
|
677
|
+
- "null"
|
678
|
+
- string
|
679
|
+
clicks:
|
680
|
+
description: The number of clicks for the keyword on a specific page.
|
681
|
+
type:
|
682
|
+
- "null"
|
683
|
+
- integer
|
684
|
+
impressions:
|
685
|
+
description: The number of times the keyword appeared in search results.
|
686
|
+
type:
|
687
|
+
- "null"
|
688
|
+
- integer
|
689
|
+
ctr:
|
690
|
+
description: >-
|
691
|
+
Click-through rate which is the percentage of clicks divided by
|
692
|
+
impressions.
|
693
|
+
type:
|
694
|
+
- "null"
|
695
|
+
- number
|
696
|
+
multipleOf: 1.e-25
|
697
|
+
position:
|
698
|
+
description: The average position of the keyword on search results pages.
|
699
|
+
type:
|
700
|
+
- "null"
|
701
|
+
- number
|
702
|
+
multipleOf: 1.e-25
|
703
|
+
|
704
|
+
search_analytics_keyword_site_report_by_page:
|
705
|
+
$schema: "https://json-schema.org/draft-07/schema#"
|
706
|
+
type: object
|
707
|
+
additionalProperties: true
|
708
|
+
properties:
|
709
|
+
site_url:
|
710
|
+
description: The URL of the website for which the search analytics data is retrieved.
|
711
|
+
type:
|
712
|
+
- "null"
|
713
|
+
- string
|
714
|
+
search_type:
|
715
|
+
description: "The type of search conducted (e.g., web, image, video)."
|
716
|
+
type:
|
717
|
+
- "null"
|
718
|
+
- string
|
719
|
+
date:
|
720
|
+
description: The date when the search data was recorded.
|
721
|
+
type:
|
722
|
+
- "null"
|
723
|
+
- string
|
724
|
+
format: date
|
725
|
+
country:
|
726
|
+
description: The country from which the search query originated.
|
727
|
+
type:
|
728
|
+
- "null"
|
729
|
+
- string
|
730
|
+
device:
|
731
|
+
description: "The device type used for the search query (e.g., desktop, mobile)."
|
732
|
+
type:
|
733
|
+
- "null"
|
734
|
+
- string
|
735
|
+
query:
|
736
|
+
description: The search query used by the user.
|
737
|
+
type:
|
738
|
+
- "null"
|
739
|
+
- string
|
740
|
+
clicks:
|
741
|
+
description: The number of times users clicked on your website link in search results.
|
742
|
+
type:
|
743
|
+
- "null"
|
744
|
+
- integer
|
745
|
+
impressions:
|
746
|
+
description: The number of times your website link appeared in search results.
|
747
|
+
type:
|
748
|
+
- "null"
|
749
|
+
- integer
|
750
|
+
ctr:
|
751
|
+
description: "Click-through rate: Number of clicks divided by the number of impressions."
|
752
|
+
type:
|
753
|
+
- "null"
|
754
|
+
- number
|
755
|
+
multipleOf: 1.e-25
|
756
|
+
position:
|
757
|
+
description: The average position of your website link in search results.
|
758
|
+
type:
|
759
|
+
- "null"
|
760
|
+
- number
|
761
|
+
multipleOf: 1.e-25
|
762
|
+
|
763
|
+
search_analytics_keyword_site_report_by_site:
|
764
|
+
$schema: "https://json-schema.org/draft-07/schema#"
|
765
|
+
type: object
|
766
|
+
additionalProperties: true
|
767
|
+
properties:
|
768
|
+
site_url:
|
769
|
+
description: The URL of the site for which the search analytics data is recorded.
|
770
|
+
type:
|
771
|
+
- "null"
|
772
|
+
- string
|
773
|
+
search_type:
|
774
|
+
description: >-
|
775
|
+
The type of search (e.g., web search, image search) that generated the
|
776
|
+
analytics data.
|
777
|
+
type:
|
778
|
+
- "null"
|
779
|
+
- string
|
780
|
+
date:
|
781
|
+
description: The date for which the search analytics data is recorded.
|
782
|
+
type:
|
783
|
+
- "null"
|
784
|
+
- string
|
785
|
+
format: date
|
786
|
+
country:
|
787
|
+
description: The country from which the search originated.
|
788
|
+
type:
|
789
|
+
- "null"
|
790
|
+
- string
|
791
|
+
device:
|
792
|
+
description: >-
|
793
|
+
The type of device used by the user during the search (e.g., desktop,
|
794
|
+
mobile).
|
795
|
+
type:
|
796
|
+
- "null"
|
797
|
+
- string
|
798
|
+
query:
|
799
|
+
description: The search query used by the user to find the site in search results.
|
800
|
+
type:
|
801
|
+
- "null"
|
802
|
+
- string
|
803
|
+
clicks:
|
804
|
+
description: >-
|
805
|
+
The number of times users clicked on the search result linking to the
|
806
|
+
site.
|
807
|
+
type:
|
808
|
+
- "null"
|
809
|
+
- integer
|
810
|
+
impressions:
|
811
|
+
description: The number of times the site was shown in search results to users.
|
812
|
+
type:
|
813
|
+
- "null"
|
814
|
+
- integer
|
815
|
+
ctr:
|
816
|
+
description: >-
|
817
|
+
Click-through rate represents the percentage of users who clicked on the
|
818
|
+
site's link after seeing it in search results.
|
819
|
+
type:
|
820
|
+
- "null"
|
821
|
+
- number
|
822
|
+
multipleOf: 1.e-25
|
823
|
+
position:
|
824
|
+
description: The average ranking position of the site in search results.
|
825
|
+
type:
|
826
|
+
- "null"
|
827
|
+
- number
|
828
|
+
multipleOf: 1.e-25
|