jsonseo 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.
@@ -0,0 +1,352 @@
1
+ /** Органический результат выдачи. */
2
+ export interface SearchResult {
3
+ /** Адрес страницы в выдаче. */
4
+ url: string;
5
+ /** Домен страницы. */
6
+ domain: string;
7
+ /** Заголовок результата. */
8
+ title: string;
9
+ /** Текст сниппета. */
10
+ passage: string;
11
+ /** Хлебные крошки результата. */
12
+ breadcrumbs?: string;
13
+ /** Тип документа: pdf, doc, xls. Отсутствует у обычных страниц. */
14
+ mime?: string;
15
+ /** Тот же тип полностью: application/pdf. */
16
+ mime_type?: string;
17
+ }
18
+ /** Источник, на который опирается ответ нейросети. */
19
+ export interface AiAnswerSource {
20
+ /** Номер источника: им подписаны сноски у Яндекса и Bing. */
21
+ id: number;
22
+ url: string;
23
+ domain: string;
24
+ /** У Google обрезан многоточием — так его показывает сам Google. */
25
+ title?: string;
26
+ /** Только Яндекс. */
27
+ description?: string;
28
+ /** Сколько сносок ведёт на источник. Только Яндекс и Bing. */
29
+ citations?: number;
30
+ }
31
+ /**
32
+ * Блок нейросети над выдачей: Алиса AI, AI Overview, Copilot. Приходит
33
+ * только при `ai: 1` и только если поисковик его показал.
34
+ */
35
+ export interface AiAnswer {
36
+ /** Текст ответа; у Яндекса и Bing сноски — markdown-ссылки. */
37
+ markdown: string;
38
+ /** Источники. У Google список не отдаётся, если он пуст. */
39
+ sources?: AiAnswerSource[];
40
+ /** Только Яндекс: уточняющие вопросы под ответом. */
41
+ followUps?: string[];
42
+ }
43
+ /** Быстрая ссылка под текстом объявления. */
44
+ export interface AdSitelink {
45
+ /** Подпись ссылки. */
46
+ title: string;
47
+ /** Адрес, очищенный от кликовых меток. Приходит не всегда. */
48
+ url?: string;
49
+ /** Пояснение под ссылкой. Показывает только Яндекс. */
50
+ description?: string;
51
+ }
52
+ /** Рекламное объявление со страницы выдачи. */
53
+ export interface Ad {
54
+ /** Где стоял блок относительно органики. */
55
+ block: 'top' | 'bottom' | 'inline';
56
+ /** Место среди объявлений своего блока, с единицы. */
57
+ position: number;
58
+ /** Страница выдачи, на которой объявление нашлось. Нумерация с нуля, абсолютная. */
59
+ page: number;
60
+ /** Домен рекламодателя. */
61
+ domain: string;
62
+ /** Посадочная страница без меток. Нет, если адрес не вычислен. */
63
+ url?: string;
64
+ /** Адрес в том виде, в каком его показывают человеку. */
65
+ displayUrl?: string;
66
+ /** Заголовок объявления. */
67
+ title?: string;
68
+ /** Текст объявления. */
69
+ description?: string;
70
+ /** Чем поисковик пометил объявление: «Реклама», Sponsored, ArrowTop. */
71
+ label?: string;
72
+ /** Как объявление свёрстано. Только Яндекс. */
73
+ format?: 'text' | 'gallery';
74
+ /** Номер карусели, только у `format: 'gallery'`. Только Яндекс. */
75
+ group?: number;
76
+ /** Быстрые ссылки. */
77
+ sitelinks?: AdSitelink[];
78
+ }
79
+ /** Ответ органической выдачи — общий для Яндекса, Google и Bing. */
80
+ export interface SearchResponse {
81
+ /** Сколько страниц получено — ровно за них и списано. */
82
+ pages: number;
83
+ /** Выдача закончилась, повторять с большим `pages` незачем. */
84
+ exhausted: boolean;
85
+ /** Поиск остановлен доменом из `break_domain`. */
86
+ breakDomainHit: boolean;
87
+ /** Запрос после исправления поисковиком. */
88
+ query: string;
89
+ /** Запрос, как его отправил клиент. */
90
+ rawQuery: string;
91
+ /** Подпись региона выдачи, если поисковик её отдал. */
92
+ region?: string;
93
+ /** Только Google: почему часть результатов скрыта. */
94
+ filter_description?: string;
95
+ /** Только Яндекс: сколько нашлось, округлённо самим поисковиком. */
96
+ found?: number | null;
97
+ /** Только Яндекс: та же величина словами. */
98
+ found_human?: string;
99
+ /** Только Bing: фактический рынок выдачи. */
100
+ mkt?: string;
101
+ /** Только Bing: фактический язык интерфейса выдачи. */
102
+ lang?: string;
103
+ /** Только Яндекс: регион, в котором фактически выполнен поиск. */
104
+ lr?: number;
105
+ /** Адрес страницы выдачи в поисковике. */
106
+ url?: string;
107
+ results: SearchResult[];
108
+ /** Только при `ai: 1` и только если поисковик ответ показал. */
109
+ aiAnswer?: AiAnswer;
110
+ /** Только при `ads: 1`. Пустой массив — просили, но рекламы не было. */
111
+ ads?: Ad[];
112
+ }
113
+ /** Карточка картинки: первые четыре поля есть всегда. */
114
+ export interface ImageResult {
115
+ /** Адрес самого файла картинки у первоисточника. */
116
+ url: string;
117
+ /** Заголовок карточки — обычно заголовок страницы-источника. */
118
+ title: string;
119
+ /** Домен страницы-источника, а не CDN картинки. */
120
+ domain: string;
121
+ /** Страница, на которой картинка стоит. */
122
+ sourceUrl: string;
123
+ /** Превью поисковика; у Google первые карточки приходят как data:. */
124
+ thumbnail?: string;
125
+ /** Ширина оригинала. Нет, если размер не назван. */
126
+ width?: number;
127
+ /** Высота оригинала. */
128
+ height?: number;
129
+ /** Ширина превью. Только Яндекс. */
130
+ thumbnailWidth?: number;
131
+ /** Высота превью. Только Яндекс. */
132
+ thumbnailHeight?: number;
133
+ /** Вес оригинала в байтах. Только Яндекс. */
134
+ bytes?: number;
135
+ }
136
+ /** Ответ поиска по картинкам — общий для всех трёх поисковиков. */
137
+ export interface ImagesResponse {
138
+ /** Сколько страниц получено. */
139
+ pages: number;
140
+ /** Выдача закончилась. */
141
+ exhausted: boolean;
142
+ query: string;
143
+ /** Адрес страницы выдачи в поисковике. */
144
+ url?: string;
145
+ results: ImageResult[];
146
+ /** Только при `ads: 1` и только у картинок Яндекса. */
147
+ ads?: Ad[];
148
+ }
149
+ /** Карточка видео. url, title и domain есть всегда. */
150
+ export interface VideoResult {
151
+ /** Страница с роликом у первоисточника. */
152
+ url: string;
153
+ title: string;
154
+ domain: string;
155
+ /** Кадр-заставка на CDN поисковика. */
156
+ thumbnail?: string;
157
+ /** Длительность в секундах. Нет поля — длина неизвестна, а не ноль. */
158
+ duration?: number;
159
+ /** Длительность подписью поисковика: 31:18, 1:02:44. */
160
+ durationText?: string;
161
+ /** Дата публикации в unix-секундах. Только Яндекс. */
162
+ published?: number;
163
+ /** Дата публикации словами поисковика, на языке выдачи. */
164
+ publishedText?: string;
165
+ /** Просмотры подписью: 6,8K. Точного значения за ними нет. */
166
+ views?: string;
167
+ /** Площадка: YouTube, VK Видео. */
168
+ provider?: string;
169
+ /** Канал или автор внутри площадки. Только Bing. */
170
+ channel?: string;
171
+ /** Текст сниппета. Только Яндекс. */
172
+ description?: string;
173
+ /** Путь под заголовком. Только Google. */
174
+ breadcrumbs?: string;
175
+ }
176
+ /** Ответ поиска по видео — общий для всех трёх поисковиков. */
177
+ export interface VideoResponse {
178
+ pages: number;
179
+ exhausted: boolean;
180
+ query: string;
181
+ url?: string;
182
+ results: VideoResult[];
183
+ }
184
+ /** Ответ поисковых подсказок. */
185
+ export interface SuggestResponse {
186
+ query: string;
187
+ results: string[];
188
+ /** Только Яндекс: регион, в котором собраны подсказки. */
189
+ lr?: string;
190
+ }
191
+ /** Регион Яндекса из справочника. */
192
+ export interface YandexRegion {
193
+ id: number;
194
+ name: string;
195
+ /** Что это за регион: область, республика, страна. */
196
+ subname: string;
197
+ lat: number;
198
+ lon: number;
199
+ }
200
+ /** Ответ справочника регионов Яндекса. */
201
+ export interface YandexRegionsResponse {
202
+ name: string;
203
+ lang: string;
204
+ regions: YandexRegion[];
205
+ }
206
+ /** Регион Google из справочника: вместе с ID приходит готовый uule. */
207
+ export interface GoogleRegion {
208
+ id: number;
209
+ name: string;
210
+ subname: string;
211
+ type: string;
212
+ type_name: string;
213
+ canonical_name: string;
214
+ /** Готовая строка UULE для параметра `uule`. */
215
+ uule: string;
216
+ lat: number;
217
+ lon: number;
218
+ }
219
+ /** Ответ справочника регионов Google. */
220
+ export interface GoogleRegionsResponse {
221
+ name: string;
222
+ lang: string;
223
+ regions: GoogleRegion[];
224
+ }
225
+ /** Строка списка запросов Вордстата. */
226
+ export interface WordstatPhrase {
227
+ text: string;
228
+ value: number;
229
+ }
230
+ /** Ответ со списками популярных и похожих запросов. */
231
+ export interface WordstatResponse {
232
+ text: string;
233
+ region: string;
234
+ device: string;
235
+ results: {
236
+ /** Что ищут вместе с этой фразой. */
237
+ popular: WordstatPhrase[];
238
+ /** Соседняя семантика. */
239
+ associations: WordstatPhrase[];
240
+ };
241
+ }
242
+ /** Ответ с частотой запроса. */
243
+ export interface WordstatFrequencyResponse {
244
+ text: string;
245
+ region: string;
246
+ device: string;
247
+ results: {
248
+ /** Частота запроса одним числом. */
249
+ totalValue: number;
250
+ };
251
+ }
252
+ /** Точка динамики показов. */
253
+ export interface WordstatGraphPoint {
254
+ /** Дата начала периода. */
255
+ date: string;
256
+ /** Подпись периода словами: «июнь 2026». */
257
+ text: string;
258
+ /** Показы за период. */
259
+ absolute: number;
260
+ /** Доля среди всех показов Яндекса. */
261
+ relative: number;
262
+ }
263
+ /** Ответ с динамикой запроса. */
264
+ export interface WordstatGraphResponse {
265
+ text: string;
266
+ region: string;
267
+ device: string;
268
+ /** Шаг динамики, который применился. */
269
+ type: string;
270
+ results: {
271
+ graph: WordstatGraphPoint[];
272
+ };
273
+ }
274
+ /** Строка географии показов. */
275
+ export interface WordstatMapRow {
276
+ /** Разрез строки: regions или cities. */
277
+ type: string;
278
+ /** Название региона или города. */
279
+ text: string;
280
+ /** Показы. */
281
+ absolute: number;
282
+ /** Affinity-индекс: 100 — средний интерес, выше — повышенный. */
283
+ popularity: number;
284
+ /** Доля среди всех показов Яндекса. */
285
+ relative: number;
286
+ /** ID региона для `region`; null, если название неоднозначно. */
287
+ region_id: number | null;
288
+ }
289
+ /** Ответ с географией запроса. */
290
+ export interface WordstatMapResponse {
291
+ text: string;
292
+ device: string;
293
+ type: string;
294
+ results: {
295
+ rows: WordstatMapRow[];
296
+ };
297
+ }
298
+ /** Прогноз по одному месту аукциона. */
299
+ export interface DirectPosition {
300
+ /** Ставка. */
301
+ bid: number;
302
+ /** Бюджет за период. */
303
+ budget: number;
304
+ /** Прогноз кликов. */
305
+ clicks: number;
306
+ /** Прогноз CTR в процентах. */
307
+ ctr: number;
308
+ /** Прогноз показов. */
309
+ shows: number;
310
+ }
311
+ /** Прогноз по одной фразе. */
312
+ export interface DirectForecast {
313
+ phrase: string;
314
+ /** Сколько раз объявление будет показано за период. */
315
+ shows: number;
316
+ /** Места аукциона: набор задаёт сам Директ. */
317
+ positions: Record<string, DirectPosition>;
318
+ }
319
+ /** Ответ прогноза показов Яндекс Директа. */
320
+ export interface DirectResponse {
321
+ /** Регион, по которому считался прогноз. */
322
+ geo: number;
323
+ period: string;
324
+ /** На сколько пачек разбит список — по ним считается стоимость. */
325
+ batches: number;
326
+ /** Сколько пачек посчитано. */
327
+ processed: number;
328
+ results: DirectForecast[];
329
+ /** Ошибки Директа по отдельным фразам. */
330
+ errors: string[];
331
+ }
332
+ /** Ответ геолокации по IP. */
333
+ export interface GeoipResponse {
334
+ ip: string;
335
+ latitude: number;
336
+ longitude: number;
337
+ /** ID тот же, что у Яндекса: годится для `region`. */
338
+ region: {
339
+ id: number;
340
+ name: string;
341
+ };
342
+ country: {
343
+ id: number;
344
+ name: string;
345
+ iso_name: string;
346
+ };
347
+ }
348
+ /** Ответ с остатком на счёте. */
349
+ export interface BalanceResponse {
350
+ balance: number;
351
+ currency: string;
352
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "jsonseo",
3
+ "version": "1.0.0",
4
+ "description": "Официальный SDK JSON SEO API: выдача Яндекса, Google и Bing, Вордстат, прогноз Директа и геолокация по IP",
5
+ "license": "MIT",
6
+ "homepage": "https://jsonseo.ru",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/jsonseo/node-sdk.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/jsonseo/node-sdk/issues"
13
+ },
14
+ "keywords": [
15
+ "jsonseo",
16
+ "seo",
17
+ "serp",
18
+ "yandex",
19
+ "google",
20
+ "bing",
21
+ "wordstat",
22
+ "xmlriver",
23
+ "api"
24
+ ],
25
+ "type": "module",
26
+ "main": "./dist/cjs/index.js",
27
+ "module": "./dist/esm/index.js",
28
+ "types": "./dist/cjs/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "import": {
32
+ "types": "./dist/esm/index.d.ts",
33
+ "default": "./dist/esm/index.js"
34
+ },
35
+ "require": {
36
+ "types": "./dist/cjs/index.d.ts",
37
+ "default": "./dist/cjs/index.js"
38
+ },
39
+ "default": "./dist/esm/index.js"
40
+ },
41
+ "./package.json": "./package.json"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "engines": {
49
+ "node": ">=18"
50
+ },
51
+ "sideEffects": false,
52
+ "scripts": {
53
+ "build": "npm run clean && tsc -p tsconfig.build.json && tsc -p tsconfig.cjs.json && node scripts/finish-build.mjs",
54
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
55
+ "typecheck": "tsc -p tsconfig.json --noEmit",
56
+ "test": "npm run build && node --test test/client.test.js test/errors.test.js test/package.test.js test/params.test.js test/retry.test.js",
57
+ "smoke": "node scripts/smoke.mjs",
58
+ "check:consumer": "node scripts/check-consumer.mjs",
59
+ "prepublishOnly": "npm run build"
60
+ },
61
+ "devDependencies": {
62
+ "typescript": "^7.0.2"
63
+ }
64
+ }