space.highport.manage.getSiteTraffic

lexicons.highport.space

Schema Diff

+24 -24

From

CID
bafyreiebijv5ixk...
Indexed At
2026-09-12 02:53 UTC
View this version

To

CID
bafyreiemsn5so73...
Indexed At
2026-09-17 17:50 UTC
View this version

Compatibility Analysis

Backward Compatible

No changes detected.

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

Compare Other Versions

Lexicon Garden

@