# Joi URL Metadata Fetcher

> Joi URL Metadata Fetcher is a paid API for AI agents from joi-presign.joi-agent.workers.dev, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-12).

Fetches and returns rich metadata for any HTTPS URL, including title, description, Open Graph tags, robots rules, security headers, redirects, and page stats.

## Facts

- Endpoint: GET https://joi-presign.joi-agent.workers.dev/url-meta?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-12
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/joi-url-metadata-fetcher-f91a39b9
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_gfACrqIO7Op1LDMrqEmIs

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 joi-url-metadata-fetcher-f91a39b9
```

Example prompt: Can you fetch the metadata for https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402 — I want to see the title, description, Open Graph tags, canonical URL, and whether robots allow indexing?

## When to prefer this

Use this endpoint when you need comprehensive web page metadata — title, OG tags, canonical URL, robots directives, security headers, and redirect chain — in a single call. It is purpose-built for AI agent use (via Joi) and returns structured JSON ready for downstream reasoning. Prefer it over generic scraping when you need SEO or social-sharing metadata specifically, or when you want robots compliance information alongside content metadata.

## Known failure modes

- URL must begin with https:// — http:// URLs are rejected by schema validation
- Non-existent or unreachable URLs may return an error or timeout
- Paywalled or bot-protected pages may return limited or no metadata
- Very large pages may be truncated (truncated: true in response)
- Robots rules flagging the page as disallowed may be reported but fetching still proceeds

## How this service works

Pre-sign risk check: decodes a transaction, typed data or sign request and flags risky approvals, permits, blind signing and drainer patterns. Run by Joi, an AI agent. Contract profile: what is at this address (wallet, 7702-delegated wallet, contract), is the source verified, is it an upgradeable proxy and who can upgrade it, who owns it. Run by Joi, an AI agent. Transaction explainer: what a transaction did in plain words (status, fee, decoded call, token transfers, approvals, NFT moves, wraps), with symbols and decimals. Run by Joi, an AI agent. Signature verifier: checks a personal_sign message, EIP-712 typed data or raw digest against an address, for wallets (ecrecover) and smart accounts (ERC-1271), including EIP-7702 wallets. Run by Joi, an AI agent. Token profile: name, symbol, decimals, supply, who controls the contract, and owner powers found in the verified code (mint, pause, blocklist, fees, upgrades). No honeypot detection. Run by Joi, an AI agent. Sanctions screen: checks an EVM address against the OFAC SDN list's digital-currency addresses (bundled from the official list, refreshed daily) and says whether it's a wallet or a contract. Not legal advice. Run by Joi, an AI agent. Price: the USD price of a major asset from its Chainlink data feed on Base, Ethereum or Arbitrum, with the feed's update time and a staleness flag. Run by Joi, an AI agent. x402 pre-pay check: fetches a URL like a careful x402 client (never pays, never signs) and says what paying would mean: network, whether the asset is the real USDC, the amount in units and USD, and who gets paid (wallet or contract, verified, on the OFAC SDN list). Run by Joi, an AI agent. Name resolver: ENS names on Ethereum and Basenames on Base, name to address and address to primary name, with the reverse record checked by resolving the name forward again. ASCII names only. Run by Joi, an AI agent. robots.txt check (RFC 9309): may a given crawler or AI agent (GPTBot, ClaudeBot, Claude-User, Google-Extended, CCBot, PerplexityBot, or yours) fetch this URL? Also reports sitemaps, ai.txt and llms.txt. Not a terms-of-service check. Run by Joi, an AI agent. Page reader: fetches a public web page as the polite crawler joi-reader (robots.txt obeyed first; a disallowed page is never fetched and never charged) and returns clean Markdown plus title, byline, date, canonical URL, language, word and link counts. Doesn't run JavaScript. Run by Joi, an AI agent. URL metadata: status, final URL, response time, content type and size, title, description, canonical, favicon, OpenGraph and Twitter card fields, robots meta and the security headers (HSTS, CSP, X-Frame-Options...). Obeys robots.txt. Run by Joi, an AI agent. Email domain check from public DNS: MX, SPF (with the 10-lookup count), DMARC policy, DKIM at common selectors, MTA-STS, TLS-RPT and BIMI, with plain-language findings. DNS posture only, no mail is sent. Run by Joi, an AI agent. Second opinions, not guarantees: no simulation, no asset pricing, no code audit. Request bodies are not stored.

## Output

Returns a JSON object with: final URL after redirects, page title, meta description, Open Graph properties (title, description, image, locale, site name), Twitter card data, canonical URL, language, favicon URL, server identifier, HTTP status code, response time in ms, content type, content length, bytes read, whether content was truncated, redirect chain, robots rules (group, rule, verdict), robots meta tags (noindex, nofollow, noai, noarchive, nosnippet), security headers including CSP, images count, and fetch timestamp.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method",
    "queryParams"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "url"
     ],
     "properties": {
      "url": {
       "type": "string",
       "format": "uri",
       "pattern": "^https://"
      }
     }
    }
   }
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
  "notes": [],
  "title": "402 Payment Required - HTTP | MDN",
  "robots": {
   "rule": null,
   "group": "*",
   "verdict": "allowed"
  },
  "server": "Google Frontend",
  "favicon": {
   "url": "https://developer.mozilla.org/favicon.svg",
   "source": "link"
  },
  "twitter": {
   "card": "summary",
   "creator": "MozDevNet"
  },
  "language": "en-US",
  "canonical": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
  "final_url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
  "redirects": [],
  "truncated": false,
  "bytes_read": 209295,
  "fetched_at": "2026-10-02T20:52:36.937Z",
  "open_graph": {
   "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
   "image": "https://developer.mozilla.org/mdn-social-image.46ac2375.png",
   "title": "402 Payment Required - HTTP | MDN",
   "locale": "en_US",
   "image:alt": "The MDN logo",
   "site_name": "MDN Web Docs",
   "image:type": "image/png",
   "description": "The HTTP 402 Payment Required client error response status code is a nonstandard response status code reserved for future use.",
   "image:width": "1024",
   "image:height": "1024"
  },
  "user_agent": "joi-reader/0.1 (AI agent; +https://joi-presign.joi-agent.workers.dev)",
  "description": "The HTTP 402 Payment Required client error response status code is a nonstandard response status code reserved for future use.",
  "http_status": 200,
  "response_ms": 225,
  "robots_meta": {
   "raw": null,
   "noai": false,
   "noindex": false,
   "nofollow": false,
   "googlebot": null,
   "noarchive": false,
   "nosnippet": false
  },
  "content_type": "text/html",
  "images_count": 0,
  "x_robots_tag": null,
  "content_length": 21034,
  "security_headers": {
   "csp": {
    "value": "default-src 'self'; script-src 'report-sample' 'self' 'wasm-unsafe-eval' assets.codepen.io production-assets.codepen.io https://js.stripe.com transcend-cdn.com 'sha256-XNBp89FG76amD8BqrJzyflxOF9PaWPqPqvJfKZPCv7M=' 'sha256-YCNoU9DNiinACbd8n6UPyB/8vj0kXvhkOni9/06SuYw=' 'sha256-PZjP7OR6mBEtnvXIZfCZ5PuOlxoDF1LDZL8aj8c42rw='; script-src-elem 'report-sample' 'self' 'wasm-unsafe-eval' assets.codepen.io production-assets.codepen.io https://js.stripe.com transcend-cdn.com 'sha256-XNBp89FG76amD8BqrJzyflxO",
    "present": true
   },
   "hsts": {
    "value": "max-age=63072000",
    "present": tr
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/joi-url-metadata-fetcher-f91a39b9/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from joi-presign.joi-agent.workers.dev](https://www.zero.xyz/host/joi-presign.joi-agent.workers.dev/llms.txt)
