0

Track site events

by
Published Oct 17, 2025
Script gitbook Verified

The script

Submitted by hugo697 Bun
Verified 235 days ago
1
//native
2
type Gitbook = {
3
  token: string;
4
};
5
/**
6
 * Track site events
7
 *
8
 */
9
export async function main(
10
  auth: Gitbook,
11
  organizationId: string,
12
  siteId: string,
13
  body: {
14
    events:
15
      | ({
16
          session: {
17
            visitorId: string;
18
            sessionId: string;
19
            cookies: {};
20
            ip?: string;
21
            userAgent: string;
22
            language: string;
23
            referrer: string;
24
            visitorAuthToken?: string;
25
            visitorAuthClaims?: {};
26
          };
27
          location: {
28
            url: string;
29
            siteSection: string;
30
            siteSpace: string;
31
            siteShareKey: string;
32
            space: string;
33
            revision: string;
34
            page: string;
35
          };
36
          timestamp?: string;
37
        } & { type: "page_view" })
38
      | ({
39
          session: {
40
            visitorId: string;
41
            sessionId: string;
42
            cookies: {};
43
            ip?: string;
44
            userAgent: string;
45
            language: string;
46
            referrer: string;
47
            visitorAuthToken?: string;
48
            visitorAuthClaims?: {};
49
          };
50
          location: {
51
            url: string;
52
            siteSection: string;
53
            siteSpace: string;
54
            siteShareKey: string;
55
            space: string;
56
            revision: string;
57
            page: string;
58
          };
59
          timestamp?: string;
60
        } & { type: "search_open" })
61
      | ({
62
          session: {
63
            visitorId: string;
64
            sessionId: string;
65
            cookies: {};
66
            ip?: string;
67
            userAgent: string;
68
            language: string;
69
            referrer: string;
70
            visitorAuthToken?: string;
71
            visitorAuthClaims?: {};
72
          };
73
          location: {
74
            url: string;
75
            siteSection: string;
76
            siteSpace: string;
77
            siteShareKey: string;
78
            space: string;
79
            revision: string;
80
            page: string;
81
          };
82
          timestamp?: string;
83
        } & { type: "search_type_query"; query: string })
84
      | ({
85
          session: {
86
            visitorId: string;
87
            sessionId: string;
88
            cookies: {};
89
            ip?: string;
90
            userAgent: string;
91
            language: string;
92
            referrer: string;
93
            visitorAuthToken?: string;
94
            visitorAuthClaims?: {};
95
          };
96
          location: {
97
            url: string;
98
            siteSection: string;
99
            siteSpace: string;
100
            siteShareKey: string;
101
            space: string;
102
            revision: string;
103
            page: string;
104
          };
105
          timestamp?: string;
106
        } & {
107
          type: "search_open_result";
108
          query: string;
109
          result: { spaceId: string; pageId: string };
110
        })
111
      | ({
112
          session: {
113
            visitorId: string;
114
            sessionId: string;
115
            cookies: {};
116
            ip?: string;
117
            userAgent: string;
118
            language: string;
119
            referrer: string;
120
            visitorAuthToken?: string;
121
            visitorAuthClaims?: {};
122
          };
123
          location: {
124
            url: string;
125
            siteSection: string;
126
            siteSpace: string;
127
            siteShareKey: string;
128
            space: string;
129
            revision: string;
130
            page: string;
131
          };
132
          timestamp?: string;
133
        } & {
134
          type: "page_post_feedback";
135
          feedback: { rating: "bad" | "ok" | "good" };
136
        })
137
      | ({
138
          session: {
139
            visitorId: string;
140
            sessionId: string;
141
            cookies: {};
142
            ip?: string;
143
            userAgent: string;
144
            language: string;
145
            referrer: string;
146
            visitorAuthToken?: string;
147
            visitorAuthClaims?: {};
148
          };
149
          location: {
150
            url: string;
151
            siteSection: string;
152
            siteSpace: string;
153
            siteShareKey: string;
154
            space: string;
155
            revision: string;
156
            page: string;
157
          };
158
          timestamp?: string;
159
        } & {
160
          type: "page_post_feedback_comment";
161
          feedback: { rating: "bad" | "ok" | "good"; comment: string };
162
        })
163
      | ({
164
          session: {
165
            visitorId: string;
166
            sessionId: string;
167
            cookies: {};
168
            ip?: string;
169
            userAgent: string;
170
            language: string;
171
            referrer: string;
172
            visitorAuthToken?: string;
173
            visitorAuthClaims?: {};
174
          };
175
          location: {
176
            url: string;
177
            siteSection: string;
178
            siteSpace: string;
179
            siteShareKey: string;
180
            space: string;
181
            revision: string;
182
            page: string;
183
          };
184
          timestamp?: string;
185
        } & { type: "ask_question"; query: string })
186
      | ({
187
          session: {
188
            visitorId: string;
189
            sessionId: string;
190
            cookies: {};
191
            ip?: string;
192
            userAgent: string;
193
            language: string;
194
            referrer: string;
195
            visitorAuthToken?: string;
196
            visitorAuthClaims?: {};
197
          };
198
          location: {
199
            url: string;
200
            siteSection: string;
201
            siteSpace: string;
202
            siteShareKey: string;
203
            space: string;
204
            revision: string;
205
            page: string;
206
          };
207
          timestamp?: string;
208
        } & {
209
          type: "ask_rate_response";
210
          query: string;
211
          rating: 1 | -1;
212
          responseId: string;
213
        })
214
      | ({
215
          session: {
216
            visitorId: string;
217
            sessionId: string;
218
            cookies: {};
219
            ip?: string;
220
            userAgent: string;
221
            language: string;
222
            referrer: string;
223
            visitorAuthToken?: string;
224
            visitorAuthClaims?: {};
225
          };
226
          location: {
227
            url: string;
228
            siteSection: string;
229
            siteSpace: string;
230
            siteShareKey: string;
231
            space: string;
232
            revision: string;
233
            page: string;
234
          };
235
          timestamp?: string;
236
        } & {
237
          type: "link_click";
238
          link: {
239
            target:
240
              | { kind: "file"; file: string }
241
              | { kind: "url"; url: string }
242
              | { kind: "page"; page: string; space?: string }
243
              | {
244
                  kind: "anchor";
245
                  anchor: string;
246
                  space?: string;
247
                  page?: string;
248
                }
249
              | { kind: "user"; user: string }
250
              | { kind: "collection"; collection: string }
251
              | { kind: "space"; space: string }
252
              | {
253
                  kind: "reusable-content";
254
                  reusableContent: string;
255
                  space?: string;
256
                }
257
              | { kind: "openapi"; spec: string };
258
            position:
259
              | "announcement"
260
              | "header"
261
              | "footer"
262
              | "sidebar"
263
              | "content";
264
          };
265
        })
266
      | ({
267
          session: {
268
            visitorId: string;
269
            sessionId: string;
270
            cookies: {};
271
            ip?: string;
272
            userAgent: string;
273
            language: string;
274
            referrer: string;
275
            visitorAuthToken?: string;
276
            visitorAuthClaims?: {};
277
          };
278
          location: {
279
            url: string;
280
            siteSection: string;
281
            siteSpace: string;
282
            siteShareKey: string;
283
            space: string;
284
            revision: string;
285
            page: string;
286
          };
287
          timestamp?: string;
288
        } & {
289
          type: "api_client_open";
290
          operation: { path: string; method: string };
291
        })
292
      | ({
293
          session: {
294
            visitorId: string;
295
            sessionId: string;
296
            cookies: {};
297
            ip?: string;
298
            userAgent: string;
299
            language: string;
300
            referrer: string;
301
            visitorAuthToken?: string;
302
            visitorAuthClaims?: {};
303
          };
304
          location: {
305
            url: string;
306
            siteSection: string;
307
            siteSpace: string;
308
            siteShareKey: string;
309
            space: string;
310
            revision: string;
311
            page: string;
312
          };
313
          timestamp?: string;
314
        } & {
315
          type: "api_client_request";
316
          operation: { path: string; method: string };
317
        })
318
      | ({
319
          session: {
320
            visitorId: string;
321
            sessionId: string;
322
            cookies: {};
323
            ip?: string;
324
            userAgent: string;
325
            language: string;
326
            referrer: string;
327
            visitorAuthToken?: string;
328
            visitorAuthClaims?: {};
329
          };
330
          location: {
331
            url: string;
332
            siteSection: string;
333
            siteSpace: string;
334
            siteShareKey: string;
335
            space: string;
336
            revision: string;
337
            page: string;
338
          };
339
          timestamp?: string;
340
        } & {
341
          type: "trademark_click";
342
          placement: "footer" | "sidebar" | "ad" | "pdf";
343
        })
344
      | ({
345
          session: {
346
            visitorId: string;
347
            sessionId: string;
348
            cookies: {};
349
            ip?: string;
350
            userAgent: string;
351
            language: string;
352
            referrer: string;
353
            visitorAuthToken?: string;
354
            visitorAuthClaims?: {};
355
          };
356
          location: {
357
            url: string;
358
            siteSection: string;
359
            siteSpace: string;
360
            siteShareKey: string;
361
            space: string;
362
            revision: string;
363
            page: string;
364
          };
365
          timestamp?: string;
366
        } & {
367
          type: "ad_click";
368
          ad: { domain: string; zoneId: string; placement: "aside" };
369
        })
370
      | ({
371
          session: {
372
            visitorId: string;
373
            sessionId: string;
374
            cookies: {};
375
            ip?: string;
376
            userAgent: string;
377
            language: string;
378
            referrer: string;
379
            visitorAuthToken?: string;
380
            visitorAuthClaims?: {};
381
          };
382
          location: {
383
            url: string;
384
            siteSection: string;
385
            siteSpace: string;
386
            siteShareKey: string;
387
            space: string;
388
            revision: string;
389
            page: string;
390
          };
391
          timestamp?: string;
392
        } & {
393
          type: "ad_display";
394
          ad: { domain: string; zoneId: string; placement: "aside" };
395
        }[]);
396
  },
397
) {
398
  const url = new URL(
399
    `https://api.gitbook.com/v1/orgs/${organizationId}/sites/${siteId}/insights/events`,
400
  );
401

402
  const response = await fetch(url, {
403
    method: "POST",
404
    headers: {
405
      "Content-Type": "application/json",
406
      Authorization: "Bearer " + auth.token,
407
    },
408
    body: JSON.stringify(body),
409
  });
410
  if (!response.ok) {
411
    const text = await response.text();
412
    throw new Error(`${response.status} ${text}`);
413
  }
414
  return await response.text();
415
}
416