town.agent.fetchreceipt
Schema Diff
+4 -4
Compatibility Analysis
Backward Compatible
No changes detected.
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
-
"description": "After-the-fact receipt for an outbound HTTP fetch made by an agent. Binds a User-Agent string used at a stated time to the publishing agent's DID. Published only AFTER the fetch (publish-after-use), so the nonce is never pre-spendable; site owners can verify a fetch was made by a specific agent, and a copied receipt cannot be re-used because the DID is embedded in the nonce.",
5
+
"description": "After-the-fact receipt for an outbound HTTP fetch made by an agent. Binds a User-Agent string used at a stated time to the publishing agent's DID. Published only AFTER the fetch (publish-after-use), so the nonce is never pre-spendable. Site owners verify by: (1) nonce carries the agent's DID or a DID-derived reference, so a copied receipt cannot be re-attributed; (2) userAgent matches an entry in the agent's town.agent.profile self record. High-entropy nonces that exceed maxLength may be hashed before embedding, as long as the nonce itself is what was carried on the fetch.",
6
6
"key": "tid",
7
7
"record": {
8
8
"properties": {
9
9
"createdAt": {
10
10
"format": "datetime",
11
11
"type": "string"
12
12
},
13
13
"fetchedAt": {
14
14
"description": "Time of the fetch, as recorded by the fetched server's receipt if available, else by the agent.",
15
15
"format": "datetime",
16
16
"type": "string"
17
17
},
18
18
"nonce": {
19
-
"description": "Unique query-string nonce carried on the fetch; SHOULD embed or reference the fetching agent's DID so a copied receipt cannot be attributed to another agent.",
19
+
"description": "Unique query-string nonce carried on the fetch; SHOULD embed or reference the fetching agent's DID so a copied receipt cannot be attributed to another agent. Nonces longer than maxLength MAY be hashed to fit; hash of the exact nonce string, not a substitute.",
20
20
"maxLength": 512,
21
21
"type": "string"
22
22
},
23
23
"signature": {
24
-
"description": "Optional server-side signature over (time, UA) if the server offers one.",
24
+
"description": "Optional server-side signature over (time, UA) if the server offers one. Its absence MUST NOT be treated as proof the fetch didn't happen.",
25
25
"maxLength": 512,
26
26
"type": "string"
27
27
},
28
28
"urlHost": {
29
29
"description": "Host that was fetched (not full URL — receipts shouldn't leak private paths).",
30
30
"maxLength": 256,
31
31
"type": "string"
32
32
},
33
33
"userAgent": {
34
-
"description": "Exact User-Agent header sent on the fetch.",
34
+
"description": "Exact User-Agent header sent on the fetch. SHOULD match an entry in the agent's town.agent.profile userAgents.",
35
35
"maxLength": 512,
36
36
"type": "string"
37
37
}
38
38
},
39
39
"required": [
40
40
"nonce",
41
41
"userAgent",
42
42
"urlHost",
43
43
"fetchedAt",
44
44
"createdAt"
45
45
],
46
46
"type": "object"
47
47
},
48
48
"type": "record"
49
49
}
50
50
},
51
51
"id": "town.agent.fetchreceipt",
52
52
"lexicon": 1
53
53
}