space.highport.manage.getSiteTraffic
Schema Diff
+24 -24
Compatibility Analysis
Backward Compatible
No changes detected.
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
-
"description": "Traffic to one domain the caller owns, over a range: requests and bytes per hour, the busiest paths, and the status mix. Byte figures include a flat per-response header estimate, because the edge's access log records the response body only.",
5
+
"description": "Traffic to one of the caller's domains over a time range: hourly requests and bytes, the busiest paths, and status codes. Byte figures include a fixed per-response header estimate, since the edge logs only response bodies.",
6
6
"errors": [
7
7
{
8
-
"description": "Not a syntactically valid, non-reserved, public-suffix-safe domain. Distinct from DomainNotFound: the string is not a hostname at all.",
8
+
"description": "Not a valid, non-reserved, public-suffix-safe domain. Unlike DomainNotFound, the input is not a hostname at all.",
9
9
"name": "InvalidDomain"
10
10
},
11
11
{
12
-
"description": "No such domain, or it is not registered to the calling identity. The two are one answer so the method is not an existence oracle.",
12
+
"description": "No such domain, or it does not belong to the caller. Both cases get the same error, so it cannot be used to check whether a domain exists.",
13
13
"name": "DomainNotFound"
14
14
},
15
15
{
16
-
"description": "This deployment has no analytics store configured, so no traffic was ever recorded.",
16
+
"description": "No analytics store is configured, so no traffic was recorded.",
17
17
"name": "AnalyticsDisabled"
18
18
}
19
19
],
20
20
"output": {
21
21
"encoding": "application/json",
22
22
"schema": {
23
23
"properties": {
24
24
"buckets": {
25
25
"description": "Hourly buckets, oldest first.",
26
26
"items": {
27
27
"description": "One hour of a domain's traffic.",
28
28
"properties": {
29
29
"botRequests": {
30
-
"description": "How many of requests came from a client classified as a crawler, which is a subset of it and not a sibling. There is no byte-level equivalent: the bucket carries no client_class split of bytesBody or bytesBilled. Absent from a deployment that does not report the split, which a reader shows as no answer rather than as no crawlers.",
30
+
"description": "How many of requests came from crawlers. This is part of requests, not added to it. Bytes are not split this way. Absent if the deployment does not report it; show that as unknown, not as zero.",
31
31
"type": "integer"
32
32
},
33
33
"bucket": {
34
-
"description": "The hour this bucket starts.",
34
+
"description": "Start of the hour.",
35
35
"format": "datetime",
36
36
"type": "string"
37
37
},
38
38
"bytesBilled": {
39
39
"description": "Body bytes plus the per-response header estimate.",
40
40
"type": "integer"
41
41
},
42
42
"bytesBody": {
43
-
"description": "Response body bytes, as the edge logged them.",
43
+
"description": "Response body bytes, as logged by the edge.",
44
44
"type": "integer"
45
45
},
46
46
"requests": {
47
47
"description": "Responses in the hour.",
48
48
"type": "integer"
49
49
}
50
50
},
51
51
"required": [
52
52
"bucket",
53
53
"requests",
54
54
"bytesBody",
55
55
"bytesBilled"
56
56
],
57
57
"type": "object"
58
58
},
59
59
"type": "array"
60
60
},
61
61
"bytesBilled": {
62
-
"description": "Total billed bytes over the range.",
62
+
"description": "Total bytes billed over the range.",
63
63
"type": "integer"
64
64
},
65
65
"bytesBilledToVisitors": {
66
-
"description": "How much of bytesBilled an authenticated visitor paid for rather than the owner. Zero unless the domain is on the sender-pays policy.",
66
+
"description": "The part of bytesBilled that signed-in visitors paid instead of the owner. Zero unless the domain uses the visitor payer policy.",
67
67
"type": "integer"
68
68
},
69
69
"domain": {
70
70
"type": "string"
71
71
},
72
72
"headerEstimateBytes": {
73
-
"description": "The flat per-response constant added to every logged body size. Every byte figure here is an estimate by this much per response.",
73
+
"description": "The fixed per-response header estimate added to each logged body size. Every byte figure here is estimated by this much per response.",
74
74
"type": "integer"
75
75
},
76
76
"records": {
77
-
"description": "Which published version of the site record served the traffic, heaviest first. Bounded by topRecords, so a domain republished more often than that has versions this does not list. Absent from a deployment that does not report the split.",
77
+
"description": "Which versions of the site record served the traffic, heaviest first. Limited to topRecords, so a frequently republished domain may have versions not listed. Absent if the deployment does not report it.",
78
78
"items": {
79
-
"description": "One published version, and the traffic the snapshots built from it served.",
79
+
"description": "One published version and the traffic it served.",
80
80
"properties": {
81
81
"bytesBilled": {
82
82
"description": "Billed bytes.",
83
83
"type": "integer"
84
84
},
85
85
"firstSeen": {
86
-
"description": "The first response inside the range served from this version.",
86
+
"description": "The first response in the range served from this version.",
87
87
"format": "datetime",
88
88
"type": "string"
89
89
},
90
90
"lastSeen": {
91
-
"description": "The last, which with firstSeen is how long the version was serving inside the range — what makes one version's byte figure comparable to another's. Absent where the answer is not known, which a reader shows as still serving rather than as an interval it was not given.",
91
+
"description": "The last response in the range served from this version. With firstSeen, it shows how long the version served, so byte figures can be compared across versions. Absent when unknown; show that as still serving.",
92
92
"format": "datetime",
93
93
"type": "string"
94
94
},
95
95
"recordCid": {
96
-
"description": "The site record the serving snapshot was built from. Every response already names it, so the split needs nothing tagged.",
96
+
"description": "The site record the serving snapshot was built from.",
97
97
"format": "cid",
98
98
"type": "string"
99
99
},
100
100
"requests": {
101
101
"description": "Responses.",
102
102
"type": "integer"
103
103
}
104
104
},
105
105
"required": [
106
106
"recordCid",
107
107
"firstSeen",
108
108
"requests",
109
109
"bytesBilled"
110
110
],
111
111
"type": "object"
112
112
},
113
113
"type": "array"
114
114
},
115
115
"refusals": {
116
-
"description": "What the bandwidth allowance refused over the range, and what serving it would have cost. Absent from a deployment that does not report it.",
116
+
"description": "What the bandwidth allowance refused over the range, and what serving it would have cost. Absent if the deployment does not report it.",
117
117
"properties": {
118
118
"estimatedBytes": {
119
-
"description": "What serving those responses instead would have charged the owner. Absent unless the deployment records it: a refusal transferred no body, so its cost is in no logged size, and only the edge knows how large the path it refused would have been.",
119
+
"description": "What serving those responses would have cost the owner. Absent unless the deployment records it, because a refused response has no logged body size.",
120
120
"type": "integer"
121
121
},
122
122
"requests": {
123
-
"description": "Responses refused because the payer's allowance for the period was spent. The same responses the status mix counts as 402, taken from the same read so the two figures cannot disagree.",
123
+
"description": "Responses refused because the payer's allowance for the period ran out. Matches the 402 count in statuses.",
124
124
"type": "integer"
125
125
}
126
126
},
127
127
"required": [
128
128
"requests"
129
129
],
130
130
"type": "object"
131
131
},
132
132
"statuses": {
133
-
"description": "The status mix, with the crawler share alongside it.",
133
+
"description": "Requests by status code, with the crawler share.",
134
134
"items": {
135
-
"description": "One status code's share of the requests and of the bytes.",
135
+
"description": "One status code's share of requests and bytes.",
136
136
"properties": {
137
137
"botRequests": {
138
-
"description": "How many of those came from a client classified as a crawler. Crawler traffic is billed, because it is real egress and the alternative rewards user-agent spoofing.",
138
+
"description": "How many of those came from crawlers. Crawler traffic is billed: it is real egress, and not billing it would reward faking a user agent.",
139
139
"type": "integer"
140
140
},
141
141
"bytesBilled": {
142
142
"description": "Billed bytes.",
143
143
"type": "integer"
144
144
},
145
145
"requests": {
146
146
"description": "Responses with this status.",
147
147
"type": "integer"
148
148
},
149
149
"status": {
150
150
"description": "The HTTP status.",
151
151
"type": "integer"
152
152
}
153
153
},
154
154
"required": [
155
155
"status",
156
156
"requests",
157
157
"bytesBilled",
158
158
"botRequests"
159
159
],
160
160
"type": "object"
161
161
},
162
162
"type": "array"
163
163
},
164
164
"topPaths": {
165
165
"description": "The busiest paths over the range.",
166
166
"items": {
167
-
"description": "One path and what it cost.",
167
+
"description": "One path and its traffic.",
168
168
"properties": {
169
169
"bytesBilled": {
170
170
"description": "Billed bytes.",
171
171
"type": "integer"
172
172
},
173
173
"path": {
174
174
"description": "The request path.",
175
175
"type": "string"
176
176
},
177
177
"requests": {
178
178
"description": "Responses.",
179
179
"type": "integer"
180
180
}
181
181
},
182
182
"required": [
183
183
"path",
184
184
"requests",
185
185
"bytesBilled"
186
186
],
187
187
"type": "object"
188
188
},
189
189
"type": "array"
190
190
}
191
191
},
192
192
"required": [
193
193
"domain",
194
194
"bytesBilled",
195
195
"bytesBilledToVisitors",
196
196
"headerEstimateBytes",
197
197
"buckets",
198
198
"topPaths",
199
199
"statuses"
200
200
],
201
201
"type": "object"
202
202
}
203
203
},
204
204
"parameters": {
205
205
"properties": {
206
206
"domain": {
207
-
"description": "The registered hostname. Must be registered to the calling identity.",
207
+
"description": "The registered hostname. Must belong to the caller.",
208
208
"maxLength": 253,
209
209
"type": "string"
210
210
},
211
211
"from": {
212
212
"description": "Inclusive lower bound. Defaults to 30 days ago.",
213
213
"format": "datetime",
214
214
"type": "string"
215
215
},
216
216
"to": {
217
217
"description": "Exclusive upper bound. Defaults to now.",
218
218
"format": "datetime",
219
219
"type": "string"
220
220
},
221
221
"topPaths": {
222
222
"default": 20,
223
223
"description": "How many of the busiest paths to return.",
224
224
"maximum": 100,
225
225
"minimum": 0,
226
226
"type": "integer"
227
227
},
228
228
"topRecords": {
229
229
"default": 20,
230
-
"description": "How many published record versions to return. A record CID is not a small set: a domain republished often has one per publish, so this is a top-N and not the whole history.",
230
+
"description": "How many record versions to return. A domain republished often has many, so this is a top N, not the full history.",
231
231
"maximum": 100,
232
232
"minimum": 0,
233
233
"type": "integer"
234
234
}
235
235
},
236
236
"required": [
237
237
"domain"
238
238
],
239
239
"type": "params"
240
240
},
241
241
"type": "query"
242
242
}
243
243
},
244
244
"id": "space.highport.manage.getSiteTraffic",
245
245
"lexicon": 1
246
246
}