{
  "service": "sunfeld-agent-guides-conformance",
  "version": "1.0.0",
  "canonical_host": "agentguides.net",
  "primary_origin": "https://agentguides.net",
  "supported_hosts": [
    "agentguides.net",
    "guides.sunfeld.nl"
  ],
  "sandbox": true,
  "dry_run": true,
  "settlement_executed": false,
  "revenue_recorded": false,
  "endpoints": {
    "spec_url": "https://guides.sunfeld.nl/api/conformance",
    "verify_url": "https://guides.sunfeld.nl/api/conformance/verify",
    "jwks_directory_url": "https://guides.sunfeld.nl/.well-known/http-message-signatures-directory"
  },
  "rfc9421_requirements": {
    "mandatory_headers": [
      "Signature-Agent",
      "Signature-Input",
      "Signature"
    ],
    "mandatory_components": [
      "@authority",
      "signature-agent"
    ],
    "conditional_payment_components": [
      "crawler-exact-price",
      "crawler-max-price"
    ],
    "required_params": {
      "alg": "ed25519",
      "tag": "web-bot-auth",
      "keyid": "<base64url-rfc7638-sha256-jwk-thumbprint>",
      "created": "<unix-seconds>",
      "expires": "<unix-seconds>"
    },
    "unsupported_features": [
      "@query-params",
      "@status",
      "sf",
      "bs",
      "req"
    ]
  },
  "pay_per_crawl_errors": [
    {
      "code": "MissingCrawlerPrice",
      "http_status": 402,
      "status": 402,
      "description": "Request did not include crawler-max-price or crawler-exact-price payment header.",
      "remediation": "Retry with crawler-max-price: USD 0.05 (proactive) or crawler-exact-price: USD 0.015 (reactive)."
    },
    {
      "code": "InvalidCrawlerExactPrice",
      "http_status": 402,
      "status": 402,
      "description": "crawler-exact-price does not match the required guide price (crawler-price).",
      "remediation": "Read crawler-price from the HTTP 402 response and send matching crawler-exact-price: USD 0.015."
    },
    {
      "code": "InvalidCrawlerMaxPrice",
      "http_status": 402,
      "status": 402,
      "description": "crawler-max-price ceiling is lower than the required guide price.",
      "remediation": "Increase crawler-max-price to at least the required guide price (e.g., crawler-max-price: USD 0.05)."
    },
    {
      "code": "ConflictingPriceHeaders",
      "http_status": 400,
      "status": 400,
      "description": "Both crawler-max-price and crawler-exact-price were sent in the same request.",
      "remediation": "Send either crawler-max-price OR crawler-exact-price, never both simultaneously."
    },
    {
      "code": "InvalidCrawlerPriceValue",
      "http_status": 400,
      "status": 400,
      "description": "Price header value is malformed, negative, non-numeric, or uses an unsupported currency.",
      "remediation": "Format price header as \"USD <decimal>\" (e.g., \"USD 0.015\" or \"USD 0.05\")."
    },
    {
      "code": "InvalidSignature",
      "http_status": 400,
      "status": 400,
      "description": "RFC 9421 Ed25519 signature verification failed, covered components are incomplete, or parameters are invalid.",
      "remediation": "Sign (\"@authority\" \"signature-agent\" [\"crawler-max-price\"|\"crawler-exact-price\"]) with Ed25519, tag=\"web-bot-auth\", and RFC 7638 JWK thumbprint keyid."
    },
    {
      "code": "StrongAuthRequired",
      "http_status": 400,
      "status": 400,
      "description": "Crawler attempted paid settlement without mandatory RFC 9421 Web Bot Auth cryptographic headers when strict mode is enforced.",
      "remediation": "Attach Signature-Agent, Signature-Input, and Signature headers verified against your published JWKS directory."
    },
    {
      "code": "CrawlerForbidden",
      "http_status": 403,
      "status": 403,
      "description": "Crawler identity or keyid is revoked or blocked by publisher policy.",
      "remediation": "Verify your Signature-Agent directory URI and active Ed25519 key registration."
    }
  ],
  "x402_v2_requirements": {
    "x402Version": 2,
    "schemes": [
      "exact",
      "upto"
    ],
    "networks": [
      "base-mainnet",
      "eip155:8453",
      "solana-mainnet"
    ],
    "asset": "USDC",
    "atomic_units_per_usd": 1000000,
    "default_price_usd": 0.015,
    "default_required_atomic": "15000",
    "accepted_headers": [
      "PAYMENT-SIGNATURE",
      "X-PAYMENT",
      "PAYMENT-CONTEXT"
    ]
  },
  "payment_rails": [
    {
      "rail_id": "rail_1_cloudflare_pay_per_crawl",
      "name": "Cloudflare Native Pay-Per-Crawl (RFC 9421 Web Bot Auth + Dynamic In-Band Pricing)",
      "protocol": "HTTP 402 + crawler-price / crawler-max-price / crawler-exact-price + Ed25519 Signature",
      "unlock_headers": [
        "crawler-max-price: USD 0.05",
        "crawler-exact-price: USD 0.015"
      ],
      "settlement_currency": "USD (Cloudflare Stripe Connect Merchant of Record)",
      "response_proof_header": "crawler-charged: USD 0.015"
    },
    {
      "rail_id": "rail_2_coinbase_x402_v2",
      "name": "Coinbase / Cloudflare x402 v2 Protocol (USDC on Base & Solana)",
      "protocol": "HTTP 402 PAYMENT-REQUIRED (Base64 JSON) -> PAYMENT-SIGNATURE / PAYMENT-CONTEXT -> PAYMENT-SETTLEMENT",
      "unlock_headers": [
        "PAYMENT-SIGNATURE: <eip3009-usdc-signature>",
        "X-PAYMENT: <x402-token>",
        "PAYMENT-CONTEXT: <jwt>"
      ],
      "settlement_currency": "USDC (Base Mainnet / Solana)",
      "response_proof_header": "PAYMENT-SETTLEMENT: <base64-receipt>"
    },
    {
      "rail_id": "rail_3_tollbit",
      "name": "TollBit AI Content Marketplace & Bot Paywall Subdomain",
      "protocol": "TollBit JWT token handshake via https://tollbit.guides.sunfeld.nl/v1/token",
      "unlock_headers": [
        "Tollbit-Token: <jwt>"
      ],
      "settlement_currency": "USD (TollBit Publisher Clearing)",
      "response_proof_header": "X-Payment-Rail: tollbit"
    },
    {
      "rail_id": "rail_4_agent_marketplaces",
      "name": "ScalePost / Dappier / ProRata Automated Agent Clearing",
      "protocol": "Multi-marketplace publisher clearing headers paired with /license.xml (RSL 1.0)",
      "unlock_headers": [
        "X-ScalePost-Token: <token>",
        "X-Dappier-Key: <key>",
        "X-ProRata-Token: <token>"
      ],
      "settlement_currency": "USD (Per-Retrieval Attribution & Clearing)",
      "response_proof_header": "X-Payment-Rail: marketplace-clearing"
    },
    {
      "rail_id": "rail_5_sunfeld_api_key",
      "name": "Sunfeld Enterprise Direct API Key / Bearer Token",
      "protocol": "RFC 6750 Bearer Token or X-Sunfeld-API-Key header for B2B subscribers",
      "unlock_headers": [
        "Authorization: Bearer <ag_live_demo_key>",
        "X-Sunfeld-API-Key: <ag_live_demo_key>"
      ],
      "settlement_currency": "EUR/USD (Sunfeld B2B Playbook Subscription)",
      "response_proof_header": "X-Payment-Rail: sunfeld-api-key"
    }
  ],
  "sandbox_signing_key": {
    "kty": "OKP",
    "crv": "Ed25519",
    "x": "t-XB_4ZEz7tqg-P_8AW5BOB9DXRGlplXrRT5rwq2Ffk",
    "keyid": "s3vJL7I-Vg8nc-reJ8te8xW5aVfSGI2BDg8exCJxfS8",
    "note": "Deterministic sandbox Ed25519 public key for dry-run conformance testing"
  },
  "test_vectors": {
    "valid_rail1_rfc9421_proactive": {
      "description": "Valid Rail 1 Cloudflare Pay-Per-Crawl proactive request with verified RFC 9421 Ed25519 signature and signed crawler-max-price header.",
      "expected_http_status": 200,
      "expected_rail": "cloudflare-pay-per-crawl",
      "authority": "guides.sunfeld.nl",
      "method": "GET",
      "path": "/guides/monetize-website-crawlers-http-402",
      "guide_slug": "monetize-website-crawlers-http-402",
      "verify_timestamp": 1763000060,
      "jwk": {
        "kty": "OKP",
        "crv": "Ed25519",
        "x": "t-XB_4ZEz7tqg-P_8AW5BOB9DXRGlplXrRT5rwq2Ffk"
      },
      "headers": {
        "Signature-Agent": "\"https://crawler.example.com\"",
        "Signature-Input": "sig1=(\"@authority\" \"signature-agent\" \"crawler-max-price\");created=1763000000;expires=1763000300;keyid=\"s3vJL7I-Vg8nc-reJ8te8xW5aVfSGI2BDg8exCJxfS8\";alg=\"ed25519\";tag=\"web-bot-auth\"",
        "Signature": "sig1=:cqxmPfYDg7TvbLKnRaWYeU6lPtQHPis3DZQXt9dhjooFkjqh90llLzFlXqstm8mEbgkrOUE7itoHxteo36bQDA==:",
        "crawler-max-price": "USD 0.05"
      },
      "signature_base_preview": "\"@authority\": guides.sunfeld.nl\n\"signature-agent\": \"https://crawler.example.com\"\n\"crawler-max-price\": USD 0.05\n\"@signature-params\": (\"@authority\" \"signature-agent\" \"crawler-max-price\");created=1763000000;expires=1763000300;keyid=\"s3vJL7I-Vg8nc-reJ8te8xW5aVfSGI2BDg8exCJxfS8\";alg=\"ed25519\";tag=\"web-bot-auth\""
    },
    "valid_rail2_x402_v2": {
      "description": "Valid Rail 2 Coinbase/Cloudflare x402 v2 USDC payment payload (15,000 atomic units = $0.015 USD on base-mainnet).",
      "expected_http_status": 200,
      "expected_rail": "x402-v2-usdc",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "PAYMENT-SIGNATURE": "eyJ4NDAyVmVyc2lvbiI6Miwic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoiYmFzZS1tYWlubmV0IiwiYXNzZXQiOiJVU0RDIiwiYW1vdW50IjoiMTUwMDAiLCJwYXlUbyI6IjB4NXVOZjNMZDQwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMiIsInJlc291cmNlIjoiaHR0cHM6Ly9ndWlkZXMuc3VuZmVsZC5ubC9ndWlkZXMvbW9uZXRpemUtd2Vic2l0ZS1jcmF3bGVycy1odHRwLTQwMiJ9"
      },
      "x402_payload": {
        "x402Version": 2,
        "scheme": "exact",
        "network": "base-mainnet",
        "asset": "USDC",
        "amount": "15000",
        "payTo": "0x5uNf3Ld402000000000000000000000000000402",
        "resource": "https://guides.sunfeld.nl/guides/monetize-website-crawlers-http-402"
      }
    },
    "valid_rail3_tollbit": {
      "description": "Valid Rail 3 TollBit Bot Paywall JWT token header.",
      "expected_http_status": 200,
      "expected_rail": "tollbit",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "Tollbit-Token": "tb_live_valid_token"
      }
    },
    "valid_rail4_marketplace": {
      "description": "Valid Rail 4 ScalePost / Dappier / ProRata automated clearing token header.",
      "expected_http_status": 200,
      "expected_rail": "marketplace-clearing",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "X-ScalePost-Token": "sp_live_valid_token"
      }
    },
    "valid_rail5_api_key": {
      "description": "Valid Rail 5 Enterprise Bearer token header.",
      "expected_http_status": 200,
      "expected_rail": "sunfeld-api-key",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "Authorization": "Bearer ag_live_demo_key"
      }
    },
    "invalid_conflicting_price_headers": {
      "description": "Invalid Rail 1 request sending both crawler-max-price and crawler-exact-price simultaneously (HTTP 400 ConflictingPriceHeaders).",
      "expected_http_status": 400,
      "expected_crawler_error": "ConflictingPriceHeaders",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "crawler-max-price": "USD 0.05",
        "crawler-exact-price": "USD 0.015"
      }
    },
    "invalid_tampered_rfc9421_signature": {
      "description": "Invalid RFC 9421 Ed25519 signature where signature bytes do not match the reconstructed signature base (HTTP 400 InvalidSignature).",
      "expected_http_status": 400,
      "expected_crawler_error": "InvalidSignature",
      "authority": "guides.sunfeld.nl",
      "method": "GET",
      "path": "/guides/monetize-website-crawlers-http-402",
      "guide_slug": "monetize-website-crawlers-http-402",
      "verify_timestamp": 1763000060,
      "jwk": {
        "kty": "OKP",
        "crv": "Ed25519",
        "x": "t-XB_4ZEz7tqg-P_8AW5BOB9DXRGlplXrRT5rwq2Ffk"
      },
      "headers": {
        "Signature-Agent": "\"https://crawler.example.com\"",
        "Signature-Input": "sig1=(\"@authority\" \"signature-agent\" \"crawler-max-price\");created=1763000000;expires=1763000300;keyid=\"s3vJL7I-Vg8nc-reJ8te8xW5aVfSGI2BDg8exCJxfS8\";alg=\"ed25519\";tag=\"web-bot-auth\"",
        "Signature": "sig1=:AAAAPfYDg7TvbLKnRaWYeU6lPtQHPis3DZQXt9dhjooFkjqh90llLzFlXqstm8mEbgkrOUE7itoHxteo36bQDA==:",
        "crawler-max-price": "USD 0.05"
      }
    },
    "invalid_underbid_max_price": {
      "description": "Invalid Rail 1 request where crawler-max-price ($0.005) is below required guide price ($0.015) (HTTP 402 InvalidCrawlerMaxPrice).",
      "expected_http_status": 402,
      "expected_crawler_error": "InvalidCrawlerMaxPrice",
      "guide_slug": "monetize-website-crawlers-http-402",
      "headers": {
        "crawler-max-price": "USD 0.005"
      }
    },
    "invalid_x402_underfunded": {
      "description": "Invalid Rail 2 x402 v2 payload offering only 5,000 atomic USDC units ($0.005) instead of required 15,000 ($0.015).",
      "expected_http_status": 402,
      "guide_slug": "monetize-website-crawlers-http-402",
      "x402_payload": {
        "x402Version": 2,
        "scheme": "exact",
        "network": "base-mainnet",
        "asset": "USDC",
        "amount": "5000"
      }
    }
  }
}