space.highport.manage.getSiteTraffic

lexicons.highport.space

Schema Diff

+63 -0

From

CID
bafyreicfpgybh37...
Indexed At
2026-09-04 22:52 UTC
View this version

To

CID
bafyreigaa44snhd...
Indexed At
2026-09-07 12:02 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

5 breaking changes, 15 non-breaking changes.

Breaking Changes (5)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals", src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.requests", kind: "prop", name: Some("requests") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.requests", kind: "prop", name: Some("requests") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen", kind: "prop", name: Some("firstSeen") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled", kind: "prop", name: Some("bytesBilled") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.recordCid", kind: "prop", name: Some("recordCid") }
Non-Breaking Changes (15)
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.recordCid" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.requests" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes" }
  • AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.requests" }
  • AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.records", kind: "prop", name: Some("records") }
  • AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.refusals", kind: "prop", name: Some("refusals") }
  • AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records", tgt: "space.highport.manage.getSiteTraffic:output.records:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen", kind: "prop", name: Some("lastSeen") }
  • AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes", kind: "prop", name: Some("estimatedBytes") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.recordCid" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.requests" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes" }
  • AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.requests" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals", src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.requests", kind: "prop", name: Some("requests") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.requests", kind: "prop", name: Some("requests") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen", kind: "prop", name: Some("firstSeen") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled", kind: "prop", name: Some("bytesBilled") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.recordCid", kind: "prop", name: Some("recordCid") }
  • Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.records", kind: "prop", name: Some("records") }
  • Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.refusals", kind: "prop", name: Some("refusals") }
  • Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records", tgt: "space.highport.manage.getSiteTraffic:output.records:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen", kind: "prop", name: Some("lastSeen") }
  • Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes", kind: "prop", name: Some("estimatedBytes") }
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 9
          "description": "Not a syntactically valid, non-reserved, public-suffix-safe domain. Distinct from DomainNotFound: the string is not a hostname at all."
10 10
        },
11 11
        {
12 12
          "name": "DomainNotFound",
13 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."
14 14
        },
15 15
        {
16 16
          "name": "AnalyticsDisabled",
17 17
          "description": "This deployment has no analytics store configured, so no traffic was ever 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 50
                    "description": "The hour this bucket starts."
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 58
                    "description": "Response body bytes, as the edge logged them."
59 59
                  },
60 60
                  "bytesBilled": {
61 61
                    "type": "integer",
62 62
                    "description": "Body bytes plus the per-response header estimate."
63 63
                  }
64 64
                },
65 65
                "description": "One hour of a domain's traffic."
66 66
              },
67 67
              "description": "Hourly buckets, oldest first."
68 68
            },
69 +
            "records": {
70 +
              "type": "array",
71 +
              "items": {
72 +
                "type": "object",
73 +
                "required": [
74 +
                  "recordCid",
75 +
                  "firstSeen",
76 +
                  "requests",
77 +
                  "bytesBilled"
78 +
                ],
79 +
                "properties": {
80 +
                  "lastSeen": {
81 +
                    "type": "string",
82 +
                    "format": "datetime",
83 +
                    "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."
84 +
                  },
85 +
                  "requests": {
86 +
                    "type": "integer",
87 +
                    "description": "Responses."
88 +
                  },
89 +
                  "firstSeen": {
90 +
                    "type": "string",
91 +
                    "format": "datetime",
92 +
                    "description": "The first response inside the range served from this version."
93 +
                  },
94 +
                  "recordCid": {
95 +
                    "type": "string",
96 +
                    "format": "cid",
97 +
                    "description": "The site record the serving snapshot was built from. Every response already names it, so the split needs nothing tagged."
98 +
                  },
99 +
                  "bytesBilled": {
100 +
                    "type": "integer",
101 +
                    "description": "Billed bytes."
102 +
                  }
103 +
                },
104 +
                "description": "One published version, and the traffic the snapshots built from it served."
105 +
              },
106 +
              "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."
107 +
            },
108 +
            "refusals": {
109 +
              "type": "object",
110 +
              "required": [
111 +
                "requests"
112 +
              ],
113 +
              "properties": {
114 +
                "requests": {
115 +
                  "type": "integer",
116 +
                  "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."
117 +
                },
118 +
                "estimatedBytes": {
119 +
                  "type": "integer",
120 +
                  "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."
121 +
                }
122 +
              },
123 +
              "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."
124 +
            },
69 125
            "statuses": {
70 126
              "type": "array",
71 127
              "items": {
72 128
                "type": "object",
73 129
                "required": [
74 130
                  "status",
75 131
                  "requests",
76 132
                  "bytesBilled",
77 133
                  "botRequests"
78 134
                ],
79 135
                "properties": {
80 136
                  "status": {
81 137
                    "type": "integer",
82 138
                    "description": "The HTTP status."
83 139
                  },
84 140
                  "requests": {
85 141
                    "type": "integer",
86 142
                    "description": "Responses with this status."
87 143
                  },
88 144
                  "botRequests": {
89 145
                    "type": "integer",
90 146
                    "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."
91 147
                  },
92 148
                  "bytesBilled": {
93 149
                    "type": "integer",
94 150
                    "description": "Billed bytes."
95 151
                  }
96 152
                },
97 153
                "description": "One status code's share of the requests and of the bytes."
98 154
              },
99 155
              "description": "The status mix, with the crawler share alongside it."
100 156
            },
101 157
            "topPaths": {
102 158
              "type": "array",
103 159
              "items": {
104 160
                "type": "object",
105 161
                "required": [
106 162
                  "path",
107 163
                  "requests",
108 164
                  "bytesBilled"
109 165
                ],
110 166
                "properties": {
111 167
                  "path": {
112 168
                    "type": "string",
113 169
                    "description": "The request path."
114 170
                  },
115 171
                  "requests": {
116 172
                    "type": "integer",
117 173
                    "description": "Responses."
118 174
                  },
119 175
                  "bytesBilled": {
120 176
                    "type": "integer",
121 177
                    "description": "Billed bytes."
122 178
                  }
123 179
                },
124 180
                "description": "One path and what it cost."
125 181
              },
126 182
              "description": "The busiest paths over the range."
127 183
            },
128 184
            "bytesBilled": {
129 185
              "type": "integer",
130 186
              "description": "Total billed bytes over the range."
131 187
            },
132 188
            "headerEstimateBytes": {
133 189
              "type": "integer",
134 190
              "description": "The flat per-response constant added to every logged body size. Every byte figure here is an estimate by this much per response."
135 191
            },
136 192
            "bytesBilledToVisitors": {
137 193
              "type": "integer",
138 194
              "description": "How much of bytesBilled an authenticated visitor paid for rather than the owner. Zero unless the domain is on the sender-pays policy."
139 195
            }
140 196
          }
141 197
        },
142 198
        "encoding": "application/json"
143 199
      },
144 200
      "parameters": {
145 201
        "type": "params",
146 202
        "required": [
147 203
          "domain"
148 204
        ],
149 205
        "properties": {
150 206
          "to": {
151 207
            "type": "string",
152 208
            "format": "datetime",
153 209
            "description": "Exclusive upper bound. Defaults to now."
154 210
          },
155 211
          "from": {
156 212
            "type": "string",
157 213
            "format": "datetime",
158 214
            "description": "Inclusive lower bound. Defaults to 30 days ago."
159 215
          },
160 216
          "domain": {
161 217
            "type": "string",
162 218
            "maxLength": 253,
163 219
            "description": "The registered hostname. Must be registered to the calling identity."
164 220
          },
165 221
          "topPaths": {
166 222
            "type": "integer",
167 223
            "default": 20,
168 224
            "maximum": 100,
169 225
            "minimum": 0,
170 226
            "description": "How many of the busiest paths to return."
227 +
          },
228 +
          "topRecords": {
229 +
            "type": "integer",
230 +
            "default": 20,
231 +
            "maximum": 100,
232 +
            "minimum": 0,
233 +
            "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."
171 234
          }
172 235
        }
173 236
      },
174 237
      "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."
175 238
    }
176 239
  },
177 240
  "$type": "com.atproto.lexicon.schema",
178 241
  "lexicon": 1
179 242
}

Compare Other Versions

Lexicon Garden

@