# FabTally Web Attestation

> FabTally Web Attestation is a paid API for AI agents from fabtally.com, paid per call via x402, $0.01/call, status unknown (last checked 2026-09-15).

Fetches a public URL and returns a signed, timestamped attestation asserting whether the page exists, contains a specific substring, or matches a content hash

## Facts

- Endpoint: POST https://fabtally.com/agent/v1/attest
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/fabtally-web-attestation-e8ae4418
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_k3iSQPhHHMNgAFfDBQ5-8

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability fabtally-web-attestation-e8ae4418 -d '<json body>'
```

Example prompt: Check whether the page at https://example.com/pricing still contains the text '$49/mo' and give me a cryptographically signed attestation I can keep as proof of what it said today.

## When to prefer this

Use this endpoint when you need a cryptographically verifiable, tamper-evident, point-in-time record that a public URL existed, contained specific text, or had a particular content hash — particularly for compliance, audit trails, competitive intelligence snapshots, or dispute resolution. It is distinct from simple HTTP HEAD checks because it returns an Ed25519-signed attestation with a full redirect chain and body hash, not just a status code. Prefer it over screenshot services when you need machine-readable signed proof rather than visual evidence.

## Known failure modes

- DNS failure for the target URL — error object returned but attestation still signed
- Target URL times out — error returned with signed timestamp
- URL resolves to a private/loopback/link-local IP — refused with blocked address error
- Non-2xx HTTP response from target — error returned, observation still attested
- Response body exceeds size limit — oversized body error
- needle not provided when check=contains — likely validation error
- Payment not included or insufficient — 402 Payment Required before attestation runs
- Target URL redirects to a private IP at any hop — refused

## How this service works

FabTally gives instant, accurate quotes for digital fabrication jobs. Launching soon.

## Output

A signed JSON object containing: the normalized URL, the check type performed, the boolean or hash result, a SHA-256 of the response body, the HTTP status code, the final URL after redirects, the full redirect chain, the timestamp of observation, a subset of response headers, and an Ed25519 cryptographic signature from the attestor (attest.fabtally.com/v0) with key ID and public key — plus an error object if the fetch failed, which is itself attested and signed.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "url",
  "check"
 ],
 "properties": {
  "url": {
   "type": "string",
   "description": "Absolute http(s) URL to observe. Must resolve to a public IP; private/loopback/link-local ranges are refused at every redirect hop."
  },
  "check": {
   "enum": [
    "exists",
    "contains",
    "hash"
   ],
   "type": "string",
   "description": "What to assert: \"exists\", \"contains\" (needs needle), or \"hash\"."
  },
  "needle": {
   "type": "string",
   "description": "Substring to look for when check=\"contains\". 1024 chars max."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "example": {
  "url": "https://example.com/pricing",
  "check": "contains",
  "error": null,
  "needle": "$49/mo",
  "result": true,
  "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  "attestor": "attest.fabtally.com/v0",
  "finalUrl": "https://example.com/pricing",
  "bodyBytes": 18422,
  "fetchedAt": "2026-07-30T19:05:00.000Z",
  "redirects": [],
  "signature": {
   "alg": "ed25519",
   "keyId": "…",
   "value": "…",
   "canonicalization": "…",
   "publicKeySpkiB64": "…"
  },
  "disclaimer": "point-in-time observation, not a legal attestation",
  "httpStatus": 200,
  "headersSubset": {
   "etag": "W/\"47f0-x\"",
   "content-type": "text/html; charset=utf-8",
   "last-modified": null
  }
 },
 "properties": {
  "url": {
   "type": "string",
   "description": "The URL as requested (normalized)."
  },
  "check": {
   "enum": [
    "exists",
    "contains",
    "hash"
   ],
   "type": "string"
  },
  "error": {
   "type": [
    "object",
    "null"
   ],
   "properties": {
    "code": {
     "type": "string"
    },
    "message": {
     "type": "string"
    }
   },
   "description": "Set when the observation could not be completed as a 2xx fetch (DNS failure, timeout, blocked address, non-2xx status, oversized body). The attestation is still returned and still signed — 'the URL did not respond at time T' is itself an observation."
  },
  "needle": {
   "type": [
    "string",
    "null"
   ]
  },
  "result": {
   "type": [
    "boolean",
    "string",
    "null"
   ],
   "description": "Boolean for exists/contains; sha256 hex string for hash; null if unobtainable."
  },
  "sha256": {
   "type": [
    "string",
    "null"
   ],
   "description": "sha256 (hex) of the exact response bytes received."
  },
  "attestor": {
   "enum": [
    "attest.fabtally.com/v0"
   ],
   "type": "string"
  },
  "finalUrl": {
   "type": [
    "string",
    "null"
   ],
   "description": "URL after following redirects."
  },
  "bodyBytes": {
   "type": [
    "integer",
    "null"
   ]
  },
  "fetchedAt": {
   "type": "string",
   "format": "date-time",
   "description": "UTC ISO-8601 timestamp of the observation."
  },
  "redirects": {
   "type": "array",
   "items": {
    "type": "object",
    "properties": {
     "to": {
      "type": "string"
     },
     "from": {
      "type": "string"
     },
     "status": {
      "type": "integer"
     }
    }
   },
   "description": "Every redirect hop taken, in order."
  },
  "signature
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/fabtally-web-attestation-e8ae4418/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from fabtally.com](https://www.zero.xyz/host/fabtally.com/llms.txt)
