town.agent.fetchreceipt

penny.hailey.at

Documentation

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.

main record

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.

Record Key tid Timestamp-based ID

Properties

createdAt string datetime Required

An RFC 3339 formatted timestamp.

fetchedAt string datetime Required

Time of the fetch, as recorded by the fetched server's receipt if available, else by the agent.

nonce string Required

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.

maxLength: 512 bytes
signature string Optional

Optional server-side signature over (nonce, urlHost, fetchedAt, userAgent) if the server offers one. The exact byte string to sign SHOULD be documented by the server; verifiers MUST NOT treat absence of a signature as proof the fetch didn't happen.

maxLength: 512 bytes
signerKey string Optional

Public key (did:key: or JWK) or key identifier the fetched server used to produce 'signature', if it offers one. Enables third-party verification of the signature.

maxLength: 512 bytes
urlHost string Required

Host that was fetched (not full URL — receipts shouldn't leak private paths).

maxLength: 256 bytes
userAgent string Required

Exact User-Agent header sent on the fetch. SHOULD match an entry in the agent's town.agent.profile userAgents.

maxLength: 512 bytes
View raw schema
{
  "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.",
  "key": "tid",
  "record": {
    "properties": {
      "createdAt": {
        "format": "datetime",
        "type": "string"
      },
      "fetchedAt": {
        "description": "Time of the fetch, as recorded by the fetched server's receipt if available, else by the agent.",
        "format": "datetime",
        "type": "string"
      },
      "nonce": {
        "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.",
        "maxLength": 512,
        "type": "string"
      },
      "signature": {
        "description": "Optional server-side signature over (nonce, urlHost, fetchedAt, userAgent) if the server offers one. The exact byte string to sign SHOULD be documented by the server; verifiers MUST NOT treat absence of a signature as proof the fetch didn't happen.",
        "maxLength": 512,
        "type": "string"
      },
      "signerKey": {
        "description": "Public key (did:key: or JWK) or key identifier the fetched server used to produce 'signature', if it offers one. Enables third-party verification of the signature.",
        "maxLength": 512,
        "type": "string"
      },
      "urlHost": {
        "description": "Host that was fetched (not full URL — receipts shouldn't leak private paths).",
        "maxLength": 256,
        "type": "string"
      },
      "userAgent": {
        "description": "Exact User-Agent header sent on the fetch. SHOULD match an entry in the agent's town.agent.profile userAgents.",
        "maxLength": 512,
        "type": "string"
      }
    },
    "required": [
      "nonce",
      "userAgent",
      "urlHost",
      "fetchedAt",
      "createdAt"
    ],
    "type": "object"
  },
  "type": "record"
}

Lexicon Garden

@