{
  "x402Version": 2,
  "name": "Animica x402",
  "provider": "Animica",
  "service_name": "Animica",
  "homepage": "https://animica.org",
  "gateway": "https://animica.dev/x402",
  "documentation": "https://animica.dev/x402",
  "repository": "https://github.com/animicaorg/all",
  "contact": "ai@3vdc.com",
  "operator": "Alienbeing LLC dba Animica",
  "legal": "https://animica.dev/legal",
  "terms_of_service": "https://animica.dev/legal",
  "license": "Apache-2.0",
  "discovery": {
    "catalog": "https://animica.dev/x402",
    "well_known": "https://animica.dev/.well-known/x402",
    "openapi": "https://animica.dev/x402/openapi.json",
    "paid_crawl": "https://animica.dev/.well-known/paid-crawl",
    "stats": "https://animica.dev/x402/stats"
  },
  "payment_protocol": "x402",
  "x402_version": 2,
  "scheme": "exact",
  "network": "base",
  "network_caip2": "eip155:8453",
  "chain_id": 8453,
  "asset": "USDC",
  "asset_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "asset_decimals": 6,
  "pay_to": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
  "explorer_tx": "https://basescan.org/tx/",
  "products": [
    {
      "id": "qrng",
      "name": "Signed random bytes",
      "path": "/x402/qrng/draw",
      "method": "GET",
      "url": "https://animica.dev/x402/qrng/draw",
      "documentation": "https://animica.dev/x402#product-qrng",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
      "available": true,
      "endpoints": [
        "GET /x402/qrng/draw",
        "POST /x402/qrng"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_trial": {
        "endpoint": "GET /x402/qrng/draw/trial",
        "methods": [
          "GET"
        ],
        "url": "https://animica.dev/x402/qrng/draw/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "GET /x402/qrng/draw/trial",
          "url": "https://animica.dev/x402/qrng/draw/trial",
          "price": "0",
          "description": "FREE TRIAL of qrng: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/qrng/draw."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "GET",
          "queryParams": {
            "bytes": {
              "type": "integer",
              "description": "number of random bytes, 1..1024 (default 32); alias: n"
            }
          },
          "alternateMethods": [
            {
              "method": "POST",
              "path": "/x402/qrng",
              "bodyType": "json",
              "bodyFields": {
                "bytes": {
                  "type": "integer",
                  "required": false,
                  "description": "number of random bytes, 1..1024 (default 32); alias: n"
                }
              },
              "note": "query parameters also work on POST; supplying both with different values is a 400 rather than a silent winner"
            }
          ]
        },
        "output": {
          "type": "json",
          "description": "randomness (hex), bytes, source, health {passed, min_entropy_per_byte}, attestation {alg, public_key_hex, digest_hex, signature_hex, attested}, verification rules, payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/qrng/draw",
          "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "bytes": {
                  "type": "integer",
                  "description": "number of random bytes, 1..1024 (default 32); alias: n"
                }
              },
              "alternateMethods": [
                {
                  "method": "POST",
                  "path": "/x402/qrng",
                  "bodyType": "json",
                  "bodyFields": {
                    "bytes": {
                      "type": "integer",
                      "required": false,
                      "description": "number of random bytes, 1..1024 (default 32); alias: n"
                    }
                  },
                  "note": "query parameters also work on POST; supplying both with different values is a 400 rather than a silent winner"
                }
              ]
            },
            "output": {
              "type": "json",
              "description": "randomness (hex), bytes, source, health {passed, min_entropy_per_byte}, attestation {alg, public_key_hex, digest_hex, signature_hex, attested}, verification rules, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/qrng/draw",
          "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "bytes": {
                  "type": "integer",
                  "description": "number of random bytes, 1..1024 (default 32); alias: n"
                }
              },
              "alternateMethods": [
                {
                  "method": "POST",
                  "path": "/x402/qrng",
                  "bodyType": "json",
                  "bodyFields": {
                    "bytes": {
                      "type": "integer",
                      "required": false,
                      "description": "number of random bytes, 1..1024 (default 32); alias: n"
                    }
                  },
                  "note": "query parameters also work on POST; supplying both with different values is a 400 rather than a silent winner"
                }
              ]
            },
            "output": {
              "type": "json",
              "description": "randomness (hex), bytes, source, health {passed, min_entropy_per_byte}, attestation {alg, public_key_hex, digest_hex, signature_hex, attested}, verification rules, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "bulk_chain",
      "name": "Bulk chain data export",
      "path": "/x402/chain/export",
      "method": "GET",
      "url": "https://animica.dev/x402/chain/export",
      "documentation": "https://animica.dev/x402#product-bulk_chain",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
      "available": true,
      "endpoints": [
        "GET /x402/chain/export",
        "GET /x402/chain/blocks",
        "GET /x402/chain/transactions"
      ],
      "mimeType": "application/x-ndjson",
      "free_trial": {
        "endpoint": "GET /x402/chain/export/trial",
        "methods": [
          "GET"
        ],
        "url": "https://animica.dev/x402/chain/export/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "GET /x402/chain/export/trial",
          "url": "https://animica.dev/x402/chain/export/trial",
          "price": "0",
          "description": "FREE TRIAL of bulk_chain: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/chain/export."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "GET",
          "queryParams": {
            "type": {
              "type": "string",
              "description": "blocks | transactions (export route only; /blocks and /transactions imply it)"
            },
            "from": {
              "type": "integer",
              "description": "first block height (required; also the pagination cursor)"
            },
            "to": {
              "type": "integer",
              "description": "last height inclusive (window <= 1000 blocks)"
            },
            "count": {
              "type": "integer",
              "description": "alternative to `to`: number of blocks from `from`"
            },
            "address": {
              "type": "string",
              "description": "transactions only: anim1… bech32m or 32-byte hex account digest; matches from/to"
            },
            "format": {
              "type": "string",
              "description": "ndjson (default) | json"
            }
          }
        },
        "output": {
          "type": "ndjson",
          "description": "meta line, one block/tx per line (amounts in nANM as decimal strings), summary line with next_cursor when truncated; ?format=json returns {meta, blocks|transactions, summary}"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/export",
          "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
          "mimeType": "application/x-ndjson",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "type": {
                  "type": "string",
                  "description": "blocks | transactions (export route only; /blocks and /transactions imply it)"
                },
                "from": {
                  "type": "integer",
                  "description": "first block height (required; also the pagination cursor)"
                },
                "to": {
                  "type": "integer",
                  "description": "last height inclusive (window <= 1000 blocks)"
                },
                "count": {
                  "type": "integer",
                  "description": "alternative to `to`: number of blocks from `from`"
                },
                "address": {
                  "type": "string",
                  "description": "transactions only: anim1… bech32m or 32-byte hex account digest; matches from/to"
                },
                "format": {
                  "type": "string",
                  "description": "ndjson (default) | json"
                }
              }
            },
            "output": {
              "type": "ndjson",
              "description": "meta line, one block/tx per line (amounts in nANM as decimal strings), summary line with next_cursor when truncated; ?format=json returns {meta, blocks|transactions, summary}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/export",
          "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
          "mimeType": "application/x-ndjson",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "type": {
                  "type": "string",
                  "description": "blocks | transactions (export route only; /blocks and /transactions imply it)"
                },
                "from": {
                  "type": "integer",
                  "description": "first block height (required; also the pagination cursor)"
                },
                "to": {
                  "type": "integer",
                  "description": "last height inclusive (window <= 1000 blocks)"
                },
                "count": {
                  "type": "integer",
                  "description": "alternative to `to`: number of blocks from `from`"
                },
                "address": {
                  "type": "string",
                  "description": "transactions only: anim1… bech32m or 32-byte hex account digest; matches from/to"
                },
                "format": {
                  "type": "string",
                  "description": "ndjson (default) | json"
                }
              }
            },
            "output": {
              "type": "ndjson",
              "description": "meta line, one block/tx per line (amounts in nANM as decimal strings), summary line with next_cursor when truncated; ?format=json returns {meta, blocks|transactions, summary}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_address_history",
      "name": "Account transaction history",
      "path": "/x402/chain/address-history",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/address-history",
      "documentation": "https://animica.dev/x402#product-chain_address_history",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
      "available": true,
      "endpoints": [
        "POST /x402/chain/address-history"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/chain/address-history/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/chain/address-history/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/chain/address-history/trial",
          "url": "https://animica.dev/x402/chain/address-history/trial",
          "price": "0",
          "description": "FREE TRIAL of chain_address_history: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/chain/address-history."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "address": {
              "type": "string",
              "description": "anim1… bech32m address (or a 32-byte hex account digest)"
            },
            "limit": {
              "type": "integer",
              "description": "rows per page, 1..500 (default 100)"
            },
            "cursor": {
              "type": "string",
              "description": "\"<as_of>:<height>:<tx_index>\" from a previous response's next_cursor; pages the same index snapshot"
            },
            "order": {
              "type": "string",
              "description": "desc (newest first, default) | asc"
            },
            "direction": {
              "type": "string",
              "description": "any (default) | in | out | self"
            },
            "from_height": {
              "type": "integer",
              "description": "inclusive lower height bound (default 0 = genesis)"
            },
            "to_height": {
              "type": "integer",
              "description": "inclusive upper height bound (default: the index tip)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "transactions[] {height, tx_index, tx_hash, direction, counterparty, value, tip, gas, kind, block_hash, timestamp} with amounts in nANM decimal strings, plus index {as_of_height, head_height, lag_blocks}, total, has_more, next_cursor, a derivation block documenting the digest/direction/ordering/cursor rules, and payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/address-history",
          "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "address": {
                  "type": "string",
                  "description": "anim1… bech32m address (or a 32-byte hex account digest)"
                },
                "limit": {
                  "type": "integer",
                  "description": "rows per page, 1..500 (default 100)"
                },
                "cursor": {
                  "type": "string",
                  "description": "\"<as_of>:<height>:<tx_index>\" from a previous response's next_cursor; pages the same index snapshot"
                },
                "order": {
                  "type": "string",
                  "description": "desc (newest first, default) | asc"
                },
                "direction": {
                  "type": "string",
                  "description": "any (default) | in | out | self"
                },
                "from_height": {
                  "type": "integer",
                  "description": "inclusive lower height bound (default 0 = genesis)"
                },
                "to_height": {
                  "type": "integer",
                  "description": "inclusive upper height bound (default: the index tip)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "transactions[] {height, tx_index, tx_hash, direction, counterparty, value, tip, gas, kind, block_hash, timestamp} with amounts in nANM decimal strings, plus index {as_of_height, head_height, lag_blocks}, total, has_more, next_cursor, a derivation block documenting the digest/direction/ordering/cursor rules, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/address-history",
          "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "address": {
                  "type": "string",
                  "description": "anim1… bech32m address (or a 32-byte hex account digest)"
                },
                "limit": {
                  "type": "integer",
                  "description": "rows per page, 1..500 (default 100)"
                },
                "cursor": {
                  "type": "string",
                  "description": "\"<as_of>:<height>:<tx_index>\" from a previous response's next_cursor; pages the same index snapshot"
                },
                "order": {
                  "type": "string",
                  "description": "desc (newest first, default) | asc"
                },
                "direction": {
                  "type": "string",
                  "description": "any (default) | in | out | self"
                },
                "from_height": {
                  "type": "integer",
                  "description": "inclusive lower height bound (default 0 = genesis)"
                },
                "to_height": {
                  "type": "integer",
                  "description": "inclusive upper height bound (default: the index tip)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "transactions[] {height, tx_index, tx_hash, direction, counterparty, value, tip, gas, kind, block_hash, timestamp} with amounts in nANM decimal strings, plus index {as_of_height, head_height, lag_blocks}, total, has_more, next_cursor, a derivation block documenting the digest/direction/ordering/cursor rules, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_batch_balances",
      "name": "Bulk account balances",
      "path": "/x402/chain/balances",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/balances",
      "documentation": "https://animica.dev/x402#product-chain_batch_balances",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/balances"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/chain/balances/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/chain/balances/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/chain/balances/trial",
          "url": "https://animica.dev/x402/chain/balances/trial",
          "price": "0",
          "description": "FREE TRIAL of chain_batch_balances: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/chain/balances."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "addresses": {
              "type": "array",
              "description": "1..500 anim1… bech32m addresses (32-byte hex account digests also accepted); duplicates are collapsed to one lookup but still answered in place"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "balances[] {address, account_digest, balance (nANM decimal string), spendable_balance?, exists?, error?} in request order, plus unique_addresses, total_balance, as_of {head_height, head_hash, entry_head_min/max, consistent} and payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/balances",
          "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "addresses": {
                  "type": "array",
                  "description": "1..500 anim1… bech32m addresses (32-byte hex account digests also accepted); duplicates are collapsed to one lookup but still answered in place"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "balances[] {address, account_digest, balance (nANM decimal string), spendable_balance?, exists?, error?} in request order, plus unique_addresses, total_balance, as_of {head_height, head_hash, entry_head_min/max, consistent} and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/balances",
          "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "addresses": {
                  "type": "array",
                  "description": "1..500 anim1… bech32m addresses (32-byte hex account digests also accepted); duplicates are collapsed to one lookup but still answered in place"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "balances[] {address, account_digest, balance (nANM decimal string), spendable_balance?, exists?, error?} in request order, plus unique_addresses, total_balance, as_of {head_height, head_hash, entry_head_min/max, consistent} and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "priority_inference",
      "name": "Priority inference",
      "path": "/x402/v1/chat/completions",
      "method": "POST",
      "url": "https://animica.dev/x402/v1/chat/completions",
      "documentation": "https://animica.dev/x402#product-priority_inference",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
      "available": true,
      "endpoints": [
        "POST /x402/v1/chat/completions"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/v1/chat/completions/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/v1/chat/completions/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/v1/chat/completions/trial",
          "url": "https://animica.dev/x402/v1/chat/completions/trial",
          "price": "0",
          "description": "FREE TRIAL of priority_inference: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/v1/chat/completions."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "model": {
              "type": "string",
              "description": "model id (see the free /v1/models)"
            },
            "messages": {
              "type": "array",
              "description": "OpenAI-style chat messages"
            },
            "max_tokens": {
              "type": "integer",
              "description": "completion budget"
            },
            "stream": {
              "type": "boolean",
              "description": "must be false/absent — streaming is not yet supported on the paid path"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/v1/chat/completions",
          "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/v1/chat/completions",
          "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "tier_standards",
      "name": "Tier Standards inference",
      "path": "/x402/v1/standard/chat/completions",
      "method": "POST",
      "url": "https://animica.dev/x402/v1/standard/chat/completions",
      "documentation": "https://animica.dev/x402#product-tier_standards",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
      "available": true,
      "endpoints": [
        "POST /x402/v1/standard/chat/completions"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/v1/standard/chat/completions/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/v1/standard/chat/completions/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/v1/standard/chat/completions/trial",
          "url": "https://animica.dev/x402/v1/standard/chat/completions/trial",
          "price": "0",
          "description": "FREE TRIAL of tier_standards: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/v1/standard/chat/completions."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "model": {
              "type": "string",
              "description": "model id (see the free /v1/models)"
            },
            "messages": {
              "type": "array",
              "description": "OpenAI-style chat messages"
            },
            "max_tokens": {
              "type": "integer",
              "description": "completion budget"
            },
            "stream": {
              "type": "boolean",
              "description": "must be false/absent — streaming is not yet supported on the paid path"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/v1/standard/chat/completions",
          "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/v1/standard/chat/completions",
          "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "credits_buy",
      "name": "Prepaid call credits",
      "path": "/x402/credits/buy",
      "method": "POST",
      "url": "https://animica.dev/x402/credits/buy",
      "documentation": "https://animica.dev/x402#product-credits_buy",
      "price": "0.50",
      "price_atomic": "500000",
      "currency": "USDC",
      "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
      "available": true,
      "endpoints": [
        "POST /x402/credits/buy"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/credits/balance",
          "url": "https://animica.dev/x402/credits/balance",
          "price": "0",
          "description": "FREE. Send X-Animica-Credits (or Authorization: Bearer) with your anmc_ token to read that voucher's balance, expiry and recent spend history. Free by design — an agent must be able to check what it can afford before it commits to a call."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "label": {
              "type": "string",
              "required": false,
              "description": "optional free-text label (<=64 chars) returned with your balance, so an agent can tell its own vouchers apart"
            }
          },
          "headers": {
            "X-Animica-Credits": {
              "required": false,
              "description": "an existing anmc_ token — when present the purchase TOPS UP that voucher and no new token is minted"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "voucher {token (shown ONCE, only on a new mint), voucher_id, balance_atomic, balance_usdc, bonus_atomic, expires_at}, how_to_use, and payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "500000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/credits/buy",
          "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "optional free-text label (<=64 chars) returned with your balance, so an agent can tell its own vouchers apart"
                }
              },
              "headers": {
                "X-Animica-Credits": {
                  "required": false,
                  "description": "an existing anmc_ token — when present the purchase TOPS UP that voucher and no new token is minted"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "voucher {token (shown ONCE, only on a new mint), voucher_id, balance_atomic, balance_usdc, bonus_atomic, expires_at}, how_to_use, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "5980861244019",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/credits/buy",
          "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "optional free-text label (<=64 chars) returned with your balance, so an agent can tell its own vouchers apart"
                }
              },
              "headers": {
                "X-Animica-Credits": {
                  "required": false,
                  "description": "an existing anmc_ token — when present the purchase TOPS UP that voucher and no new token is minted"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "voucher {token (shown ONCE, only on a new mint), voucher_id, balance_atomic, balance_usdc, bonus_atomic, expires_at}, how_to_use, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "5980.861244019 ANM",
            "usd_equivalent": "0.375000",
            "usd_list_price": "0.50",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "fetch_extract",
      "name": "Fetch & extract web page text",
      "path": "/x402/web/fetch",
      "method": "POST",
      "url": "https://animica.dev/x402/web/fetch",
      "documentation": "https://animica.dev/x402#product-fetch_extract",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
      "available": true,
      "endpoints": [
        "POST /x402/web/fetch",
        "GET /x402/web/fetch"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "POST /x402/crawl",
          "url": "https://animica.dev/x402/crawl",
          "price": "0",
          "description": "FREE (capped per client per day): fetch a public web page and either extract it as clean text or answer a question about it, returning the passages the answer came from. Reaches the public internet only — hostnames are resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "url": {
              "type": "string",
              "required": true,
              "description": "absolute http(s) URL of a public page"
            },
            "include_html": {
              "type": "boolean",
              "required": false,
              "description": "also return raw HTML (default false)"
            },
            "max_chars": {
              "type": "integer",
              "required": false,
              "description": "truncate extracted text to this many characters"
            }
          },
          "queryParams": {
            "url": {
              "type": "string",
              "description": "same as body.url, for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "url, final_url, status, title, description, text, chars, bytes, body_truncated, text_truncated, content_type, fetched_at, redirects[], and html when requested"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/web/fetch",
          "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "include_html": {
                  "type": "boolean",
                  "required": false,
                  "description": "also return raw HTML (default false)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate extracted text to this many characters"
                }
              },
              "queryParams": {
                "url": {
                  "type": "string",
                  "description": "same as body.url, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "url, final_url, status, title, description, text, chars, bytes, body_truncated, text_truncated, content_type, fetched_at, redirects[], and html when requested"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/web/fetch",
          "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "include_html": {
                  "type": "boolean",
                  "required": false,
                  "description": "also return raw HTML (default false)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate extracted text to this many characters"
                }
              },
              "queryParams": {
                "url": {
                  "type": "string",
                  "description": "same as body.url, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "url, final_url, status, title, description, text, chars, bytes, body_truncated, text_truncated, content_type, fetched_at, redirects[], and html when requested"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "notarize",
      "name": "Notarise a digest on-chain",
      "path": "/x402/notarize",
      "method": "POST",
      "url": "https://animica.dev/x402/notarize",
      "documentation": "https://animica.dev/x402#product-notarize",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
      "available": true,
      "endpoints": [
        "POST /x402/notarize"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/notarize/verify/{commitment}",
          "url": "https://animica.dev/x402/notarize/verify/{commitment}",
          "price": "0",
          "description": "FREE, permanent verification of a notarisation: re-reads the committed record and its Merkle inclusion proof from the node. No payment, ever — a proof nobody can check is worthless."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "digest": {
              "type": "string",
              "required": false,
              "description": "a 32-byte SHA-256 digest as hex (with or without 0x). Supply this OR data."
            },
            "data": {
              "type": "string",
              "required": false,
              "description": "base64 document to hash and anchor (we store the digest and the memo, never your bytes, unless store_data is true)"
            },
            "memo": {
              "type": "string",
              "required": false,
              "description": "optional label stored with the record, <=256 chars"
            },
            "store_data": {
              "type": "boolean",
              "required": false,
              "description": "also store the supplied data itself, retrievable later (default false — by default only the digest is committed)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "commitment, blob_id, namespace, digest, record (the exact bytes committed), proof {leaf_index, leaf_hash, siblings[], tree_height}, anchored_at {head_height, head_hash, observed_at}, verify_url, and what the proof does and does not establish"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/notarize",
          "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "a 32-byte SHA-256 digest as hex (with or without 0x). Supply this OR data."
                },
                "data": {
                  "type": "string",
                  "required": false,
                  "description": "base64 document to hash and anchor (we store the digest and the memo, never your bytes, unless store_data is true)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "optional label stored with the record, <=256 chars"
                },
                "store_data": {
                  "type": "boolean",
                  "required": false,
                  "description": "also store the supplied data itself, retrievable later (default false — by default only the digest is committed)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, namespace, digest, record (the exact bytes committed), proof {leaf_index, leaf_hash, siblings[], tree_height}, anchored_at {head_height, head_hash, observed_at}, verify_url, and what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/notarize",
          "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "a 32-byte SHA-256 digest as hex (with or without 0x). Supply this OR data."
                },
                "data": {
                  "type": "string",
                  "required": false,
                  "description": "base64 document to hash and anchor (we store the digest and the memo, never your bytes, unless store_data is true)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "optional label stored with the record, <=256 chars"
                },
                "store_data": {
                  "type": "boolean",
                  "required": false,
                  "description": "also store the supplied data itself, retrievable later (default false — by default only the digest is committed)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, namespace, digest, record (the exact bytes committed), proof {leaf_index, leaf_hash, siblings[], tree_height}, anchored_at {head_height, head_hash, observed_at}, verify_url, and what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "blob_put",
      "name": "Store a blob with a retrieval proof",
      "path": "/x402/blob",
      "method": "POST",
      "url": "https://animica.dev/x402/blob",
      "documentation": "https://animica.dev/x402#product-blob_put",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
      "available": true,
      "endpoints": [
        "POST /x402/blob"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/blob/{commitment}",
          "url": "https://animica.dev/x402/blob/{commitment}",
          "price": "0",
          "description": "FREE retrieval of a stored blob by commitment. Storage was paid for once; reading it back is not charged again, and anyone holding the commitment may read it."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "data": {
              "type": "string",
              "required": true,
              "description": "base64 payload"
            },
            "content_type": {
              "type": "string",
              "required": false,
              "description": "informational label stored alongside, e.g. application/json"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "commitment, blob_id, size_bytes, sha256, retrieve_url, shard layout"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/blob",
          "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "data": {
                  "type": "string",
                  "required": true,
                  "description": "base64 payload"
                },
                "content_type": {
                  "type": "string",
                  "required": false,
                  "description": "informational label stored alongside, e.g. application/json"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, size_bytes, sha256, retrieve_url, shard layout"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/blob",
          "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "data": {
                  "type": "string",
                  "required": true,
                  "description": "base64 payload"
                },
                "content_type": {
                  "type": "string",
                  "required": false,
                  "description": "informational label stored alongside, e.g. application/json"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, size_bytes, sha256, retrieve_url, shard layout"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "embed_batch",
      "name": "Batch text embeddings",
      "path": "/x402/embed",
      "method": "POST",
      "url": "https://animica.dev/x402/embed",
      "documentation": "https://animica.dev/x402#product-embed_batch",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
      "available": true,
      "endpoints": [
        "POST /x402/embed"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "texts": {
              "type": "array",
              "required": true,
              "description": "1..256 strings"
            },
            "normalize": {
              "type": "boolean",
              "required": false,
              "description": "vectors are already unit-normalised; set false only if you want them raw (default true)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "model, dimensions, count, vectors[][] in request order, total_chars, and per-text char counts"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/embed",
          "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "texts": {
                  "type": "array",
                  "required": true,
                  "description": "1..256 strings"
                },
                "normalize": {
                  "type": "boolean",
                  "required": false,
                  "description": "vectors are already unit-normalised; set false only if you want them raw (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "model, dimensions, count, vectors[][] in request order, total_chars, and per-text char counts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/embed",
          "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "texts": {
                  "type": "array",
                  "required": true,
                  "description": "1..256 strings"
                },
                "normalize": {
                  "type": "boolean",
                  "required": false,
                  "description": "vectors are already unit-normalised; set false only if you want them raw (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "model, dimensions, count, vectors[][] in request order, total_chars, and per-text char counts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "ask_url",
      "name": "Ask a question about a web page",
      "path": "/x402/web/ask",
      "method": "POST",
      "url": "https://animica.dev/x402/web/ask",
      "documentation": "https://animica.dev/x402#product-ask_url",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
      "available": true,
      "endpoints": [
        "POST /x402/web/ask"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "url": {
              "type": "string",
              "required": true,
              "description": "absolute http(s) URL of a public page"
            },
            "question": {
              "type": "string",
              "required": true,
              "description": "what you want to know about that page"
            },
            "top_k": {
              "type": "integer",
              "required": false,
              "description": "passages to retrieve (default 4)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "answer, grounded (bool), passages[] {text, score, index}, page {url, final_url, title, chars}, model, chunks_total, usage"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/web/ask",
          "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "what you want to know about that page"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "passages to retrieve (default 4)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "answer, grounded (bool), passages[] {text, score, index}, page {url, final_url, title, chars}, model, chunks_total, usage"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/web/ask",
          "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "what you want to know about that page"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "passages to retrieve (default 4)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "answer, grounded (bool), passages[] {text, score, index}, page {url, final_url, title, chars}, model, chunks_total, usage"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "price_oracle",
      "name": "Signed ANM price attestation",
      "path": "/x402/oracle/price",
      "method": "GET",
      "url": "https://animica.dev/x402/oracle/price",
      "documentation": "https://animica.dev/x402#product-price_oracle",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
      "available": true,
      "endpoints": [
        "GET /x402/oracle/price",
        "POST /x402/oracle/price"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "GET",
          "queryParams": {}
        },
        "output": {
          "type": "json",
          "description": "attestation {symbol, usd_per_anm, side, source, observed_at, age_seconds, head_height, head_hash, issued_at, nonce}, signed, signature, signer_address, message_hash, canonical_message, verification instructions"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/oracle/price",
          "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "attestation {symbol, usd_per_anm, side, source, observed_at, age_seconds, head_height, head_hash, issued_at, nonce}, signed, signature, signer_address, message_hash, canonical_message, verification instructions"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/oracle/price",
          "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "attestation {symbol, usd_per_anm, side, source, observed_at, age_seconds, head_height, head_hash, issued_at, nonce}, signed, signature, signer_address, message_hash, canonical_message, verification instructions"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "holder_snapshot",
      "name": "Holder snapshot / rich list",
      "path": "/x402/chain/holders",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/holders",
      "documentation": "https://animica.dev/x402#product-holder_snapshot",
      "price": "0.007000",
      "price_atomic": "7000",
      "currency": "USDC",
      "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/holders",
        "GET /x402/chain/holders"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "limit": {
              "type": "integer",
              "required": false,
              "description": "how many holders to return, 1..1000 (default 100)"
            }
          },
          "queryParams": {
            "limit": {
              "type": "integer",
              "description": "same as body.limit"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {height}, total_addresses, count, holders[] {rank, address, balance_nanm, balance_anm, share_percent}, total_supply_observed"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/holders",
          "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many holders to return, 1..1000 (default 100)"
                }
              },
              "queryParams": {
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {height}, total_addresses, count, holders[] {rank, address, balance_nanm, balance_anm, share_percent}, total_supply_observed"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "83732057416",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/holders",
          "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many holders to return, 1..1000 (default 100)"
                }
              },
              "queryParams": {
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {height}, total_addresses, count, holders[] {rank, address, balance_nanm, balance_anm, share_percent}, total_supply_observed"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "83.732057416 ANM",
            "usd_equivalent": "0.005250",
            "usd_list_price": "0.007000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mempool_feed",
      "name": "Mempool and network telemetry",
      "path": "/x402/chain/mempool",
      "method": "GET",
      "url": "https://animica.dev/x402/chain/mempool",
      "documentation": "https://animica.dev/x402#product-mempool_feed",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
      "available": true,
      "endpoints": [
        "GET /x402/chain/mempool",
        "POST /x402/chain/mempool"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "GET",
          "queryParams": {}
        },
        "output": {
          "type": "json",
          "description": "mempool {count, total_bytes, oldest_age_seconds, pending_txids[], pending_returned, stats_count_disagrees?}, head {height, hash}, network {peers, hashrate}, observed_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/mempool",
          "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "mempool {count, total_bytes, oldest_age_seconds, pending_txids[], pending_returned, stats_count_disagrees?}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/mempool",
          "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "mempool {count, total_bytes, oldest_age_seconds, pending_txids[], pending_returned, stats_count_disagrees?}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "pq_verify",
      "name": "Post-quantum signature verification",
      "path": "/x402/pq/verify",
      "method": "POST",
      "url": "https://animica.dev/x402/pq/verify",
      "documentation": "https://animica.dev/x402#product-pq_verify",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
      "available": true,
      "endpoints": [
        "POST /x402/pq/verify"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "alg_id": {
              "type": "integer",
              "required": true,
              "description": "scheme id - 4099 (0x1003) is ML-DSA-65, the only scheme that can spend on Animica"
            },
            "message": {
              "type": "string",
              "required": true,
              "description": "hex-encoded message bytes"
            },
            "signature": {
              "type": "string",
              "required": true,
              "description": "hex-encoded signature"
            },
            "public_key": {
              "type": "string",
              "required": true,
              "description": "hex-encoded public key"
            },
            "sign_hash": {
              "type": "string",
              "required": false,
              "description": "hex domain/sign-hash bytes, when the scheme binds one"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "ok (the verdict), reason, scheme_id, scheme_name, pub_fingerprint, sizes, verified_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/verify",
          "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "alg_id": {
                  "type": "integer",
                  "required": true,
                  "description": "scheme id - 4099 (0x1003) is ML-DSA-65, the only scheme that can spend on Animica"
                },
                "message": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded message bytes"
                },
                "signature": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded signature"
                },
                "public_key": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded public key"
                },
                "sign_hash": {
                  "type": "string",
                  "required": false,
                  "description": "hex domain/sign-hash bytes, when the scheme binds one"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ok (the verdict), reason, scheme_id, scheme_name, pub_fingerprint, sizes, verified_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/verify",
          "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "alg_id": {
                  "type": "integer",
                  "required": true,
                  "description": "scheme id - 4099 (0x1003) is ML-DSA-65, the only scheme that can spend on Animica"
                },
                "message": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded message bytes"
                },
                "signature": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded signature"
                },
                "public_key": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded public key"
                },
                "sign_hash": {
                  "type": "string",
                  "required": false,
                  "description": "hex domain/sign-hash bytes, when the scheme binds one"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ok (the verdict), reason, scheme_id, scheme_name, pub_fingerprint, sizes, verified_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "geo_audit",
      "name": "GEO / agent-legibility audit",
      "path": "/x402/geo/audit",
      "method": "POST",
      "url": "https://animica.dev/x402/geo/audit",
      "documentation": "https://animica.dev/x402#product-geo_audit",
      "price": "0.007984",
      "price_atomic": "7984",
      "currency": "USDC",
      "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
      "available": true,
      "endpoints": [
        "POST /x402/geo/audit"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/geo/audit/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/geo/audit/trial",
        "price": "0",
        "limit_per_day": 2,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/geo/audit/trial",
          "url": "https://animica.dev/x402/geo/audit/trial",
          "price": "0",
          "description": "FREE TRIAL of geo_audit: up to 2 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/geo/audit."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "url": {
              "type": "string",
              "required": true,
              "description": "absolute http(s) URL of the site to audit; the origin is derived from it"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "score (0-100), grade, categories[] {id, label, weight, score, findings[]}, findings[] {id, category, status, detail, evidence, fix}, crawler_access[] {agent, operator, purpose, http_status, robots, verdict}, fixes[] (prioritised, highest impact first), pages_fetched, not_measured[], audited_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7984",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/geo/audit",
          "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to audit; the origin is derived from it"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "score (0-100), grade, categories[] {id, label, weight, score, findings[]}, findings[] {id, category, status, detail, evidence, fix}, crawler_access[] {agent, operator, purpose, http_status, robots, verdict}, fixes[] (prioritised, highest impact first), pages_fetched, not_measured[], audited_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95502392344",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/geo/audit",
          "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to audit; the origin is derived from it"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "score (0-100), grade, categories[] {id, label, weight, score, findings[]}, findings[] {id, category, status, detail, evidence, fix}, crawler_access[] {agent, operator, purpose, http_status, robots, verdict}, fixes[] (prioritised, highest impact first), pages_fetched, not_measured[], audited_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.502392344 ANM",
            "usd_equivalent": "0.005988",
            "usd_list_price": "0.007984",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "web_search",
      "name": "Web search",
      "path": "/x402/search",
      "method": "POST",
      "url": "https://animica.dev/x402/search",
      "documentation": "https://animica.dev/x402#product-web_search",
      "price": "0.010000",
      "price_atomic": "10000",
      "currency": "USDC",
      "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
      "available": true,
      "endpoints": [
        "POST /x402/search",
        "GET /x402/search"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST|GET /x402/search/trial",
        "methods": [
          "POST",
          "GET"
        ],
        "url": "https://animica.dev/x402/search/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/search/trial",
          "url": "https://animica.dev/x402/search/trial",
          "price": "0",
          "description": "FREE TRIAL of web_search: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/search."
        },
        {
          "endpoint": "GET /x402/search/trial",
          "url": "https://animica.dev/x402/search/trial",
          "price": "0",
          "description": "FREE TRIAL of web_search: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/search."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "query": {
              "type": "string",
              "required": true,
              "description": "what to search for (1..400 characters)"
            },
            "limit": {
              "type": "integer",
              "required": false,
              "description": "results to return, 1..20 (default 10)"
            },
            "lang": {
              "type": "string",
              "required": false,
              "description": "two-letter language hint, e.g. en"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "query, results[] {rank, title, url, snippet, published, engines[]}, count, provider, engines[] (which answered), unavailable_engines[] (which did not), degraded (bool), searched_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/search",
          "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to search for (1..400 characters)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..20 (default 10)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, title, url, snippet, published, engines[]}, count, provider, engines[] (which answered), unavailable_engines[] (which did not), degraded (bool), searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/search",
          "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to search for (1..400 characters)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..20 (default 10)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, title, url, snippet, published, engines[]}, count, provider, engines[] (which answered), unavailable_engines[] (which did not), degraded (bool), searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "web_research",
      "name": "Research: search the web and read the pages",
      "path": "/x402/research",
      "method": "POST",
      "url": "https://animica.dev/x402/research",
      "documentation": "https://animica.dev/x402#product-web_research",
      "price": "0.020000",
      "price_atomic": "20000",
      "currency": "USDC",
      "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/research",
        "GET /x402/research"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST|GET /x402/research/trial",
        "methods": [
          "POST",
          "GET"
        ],
        "url": "https://animica.dev/x402/research/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/research/trial",
          "url": "https://animica.dev/x402/research/trial",
          "price": "0",
          "description": "FREE TRIAL of web_research: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/research."
        },
        {
          "endpoint": "GET /x402/research/trial",
          "url": "https://animica.dev/x402/research/trial",
          "price": "0",
          "description": "FREE TRIAL of web_research: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/research."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "query": {
              "type": "string",
              "required": true,
              "description": "what to research (1..400 characters)"
            },
            "pages": {
              "type": "integer",
              "required": false,
              "description": "how many top results to fetch and read, 1..8 (default 4)"
            },
            "max_chars": {
              "type": "integer",
              "required": false,
              "description": "truncate each page to this many characters (default 6000)"
            },
            "lang": {
              "type": "string",
              "required": false,
              "description": "two-letter language hint, e.g. en"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "query, pages[] {rank, url, requested_url, title, chars, truncated, text}, pages_failed[] {url, error, detail}, pages_read, pages_requested, search {provider, engines[], unavailable_engines[], degraded}, took_ms, researched_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/research",
          "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to research (1..400 characters)"
                },
                "pages": {
                  "type": "integer",
                  "required": false,
                  "description": "how many top results to fetch and read, 1..8 (default 4)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, pages[] {rank, url, requested_url, title, chars, truncated, text}, pages_failed[] {url, error, detail}, pages_read, pages_requested, search {provider, engines[], unavailable_engines[], degraded}, took_ms, researched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/research",
          "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to research (1..400 characters)"
                },
                "pages": {
                  "type": "integer",
                  "required": false,
                  "description": "how many top results to fetch and read, 1..8 (default 4)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, pages[] {rank, url, requested_url, title, chars, truncated, text}, pages_failed[] {url, error, detail}, pages_read, pages_requested, search {provider, engines[], unavailable_engines[], degraded}, took_ms, researched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "web_contents",
      "name": "Page contents in bulk",
      "path": "/x402/contents",
      "method": "POST",
      "url": "https://animica.dev/x402/contents",
      "documentation": "https://animica.dev/x402#product-web_contents",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/contents"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/contents/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/contents/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/contents/trial",
          "url": "https://animica.dev/x402/contents/trial",
          "price": "0",
          "description": "FREE TRIAL of web_contents: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/contents."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "urls": {
              "type": "array",
              "required": true,
              "description": "1..10 absolute http(s) URLs"
            },
            "max_chars": {
              "type": "integer",
              "required": false,
              "description": "truncate each page to this many characters (default 6000)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "pages[] {url, requested_url, title, content_type, chars, truncated, text}, failed[] {url, error, detail}, pages_read, urls_requested, took_ms, fetched_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/contents",
          "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "urls": {
                  "type": "array",
                  "required": true,
                  "description": "1..10 absolute http(s) URLs"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "pages[] {url, requested_url, title, content_type, chars, truncated, text}, failed[] {url, error, detail}, pages_read, urls_requested, took_ms, fetched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/contents",
          "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "urls": {
                  "type": "array",
                  "required": true,
                  "description": "1..10 absolute http(s) URLs"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "pages[] {url, requested_url, title, content_type, chars, truncated, text}, failed[] {url, error, detail}, pages_read, urls_requested, took_ms, fetched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "agent_index",
      "name": "Search the agent-payable web",
      "path": "/x402/index",
      "method": "POST",
      "url": "https://animica.dev/x402/index",
      "documentation": "https://animica.dev/x402#product-agent_index",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/index",
        "GET /x402/index"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST|GET /x402/index/trial",
        "methods": [
          "POST",
          "GET"
        ],
        "url": "https://animica.dev/x402/index/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/index/trial",
          "url": "https://animica.dev/x402/index/trial",
          "price": "0",
          "description": "FREE TRIAL of agent_index: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/index."
        },
        {
          "endpoint": "GET /x402/index/trial",
          "url": "https://animica.dev/x402/index/trial",
          "price": "0",
          "description": "FREE TRIAL of agent_index: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/index."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "query": {
              "type": "string",
              "required": true,
              "description": "words to match: a capability, a parameter name, a schema field, a network"
            },
            "limit": {
              "type": "integer",
              "required": false,
              "description": "results to return, 1..25 (default 10)"
            },
            "max_price": {
              "type": "number",
              "required": false,
              "description": "only services at or under this price in USD"
            },
            "callable_only": {
              "type": "boolean",
              "required": false,
              "description": "only services that publish a call spec"
            }
          },
          "queryParams": {
            "q": {
              "type": "string",
              "description": "same as body.query, for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "query, results[] {rank, url, host, title, snippet, price_usd, payment_protocol, http_method, callable, score, indexed_at}, count, corpus {documents, sources, oldest_document_age_seconds, last_build}, searched_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/index",
          "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "words to match: a capability, a parameter name, a schema field, a network"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only services at or under this price in USD"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only services that publish a call spec"
                }
              },
              "queryParams": {
                "q": {
                  "type": "string",
                  "description": "same as body.query, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, url, host, title, snippet, price_usd, payment_protocol, http_method, callable, score, indexed_at}, count, corpus {documents, sources, oldest_document_age_seconds, last_build}, searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/index",
          "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "words to match: a capability, a parameter name, a schema field, a network"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only services at or under this price in USD"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only services that publish a call spec"
                }
              },
              "queryParams": {
                "q": {
                  "type": "string",
                  "description": "same as body.query, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, url, host, title, snippet, price_usd, payment_protocol, http_method, callable, score, indexed_at}, count, corpus {documents, sources, oldest_document_age_seconds, last_build}, searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "geo_fix",
      "name": "GEO fix — deployable llms.txt, robots.txt and JSON-LD",
      "path": "/x402/geo/fix",
      "method": "POST",
      "url": "https://animica.dev/x402/geo/fix",
      "documentation": "https://animica.dev/x402#product-geo_fix",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
      "available": true,
      "endpoints": [
        "POST /x402/geo/fix"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/geo/fix/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/geo/fix/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/geo/fix/trial",
          "url": "https://animica.dev/x402/geo/fix/trial",
          "price": "0",
          "description": "FREE TRIAL of geo_fix: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/geo/fix."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "url": {
              "type": "string",
              "required": true,
              "description": "absolute http(s) URL of the site to fix; the origin is derived from it"
            },
            "max_links": {
              "type": "integer",
              "required": false,
              "description": "how many pages to verify and list in llms.txt (1..40, default 20)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "artifacts {llms_txt {path, content, links_verified, links_dropped, summary_source}, robots_txt {path, content, diff, changes, still_blocked_by_wildcard}, json_ld {content, types, grounded_in, omitted}}, discovered {sitemap, candidate_links, verified}, next_step"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/geo/fix",
          "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to fix; the origin is derived from it"
                },
                "max_links": {
                  "type": "integer",
                  "required": false,
                  "description": "how many pages to verify and list in llms.txt (1..40, default 20)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifacts {llms_txt {path, content, links_verified, links_dropped, summary_source}, robots_txt {path, content, diff, changes, still_blocked_by_wildcard}, json_ld {content, types, grounded_in, omitted}}, discovered {sitemap, candidate_links, verified}, next_step"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/geo/fix",
          "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to fix; the origin is derived from it"
                },
                "max_links": {
                  "type": "integer",
                  "required": false,
                  "description": "how many pages to verify and list in llms.txt (1..40, default 20)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifacts {llms_txt {path, content, links_verified, links_dropped, summary_source}, robots_txt {path, content, diff, changes, still_blocked_by_wildcard}, json_ld {content, types, grounded_in, omitted}}, discovered {sitemap, candidate_links, verified}, next_step"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mesh_find",
      "name": "x402 Mesh — find who to buy from",
      "path": "/x402/mesh/find",
      "method": "POST",
      "url": "https://animica.dev/x402/mesh/find",
      "documentation": "https://animica.dev/x402#product-mesh_find",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
      "available": true,
      "endpoints": [
        "POST /x402/mesh/find"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/mesh/find/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/mesh/find/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/mesh/find/trial",
          "url": "https://animica.dev/x402/mesh/find/trial",
          "price": "0",
          "description": "FREE TRIAL of mesh_find: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/mesh/find."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "goal": {
              "type": "string",
              "required": true,
              "description": "what you are trying to do, in plain words — matched against service descriptions"
            },
            "max_price_usd": {
              "type": "number",
              "required": false,
              "description": "exclude anything priced above this per call"
            },
            "require_callable": {
              "type": "boolean",
              "required": false,
              "description": "only return services that publish a call spec you can invoke without guessing (default false)"
            },
            "limit": {
              "type": "integer",
              "required": false,
              "description": "how many results, 1..50 (default 10)"
            },
            "weights": {
              "type": "object",
              "required": false,
              "description": "override the ranking weights {relevance, demand, price, callable}; they are normalised as given"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "results[] {resource, description, price_usd, network, callable, call_spec, demand {calls_30d, unique_payers_30d, concentration, note}, score, why}, weights, index {total, callable, priced, price_rejected, with_demand, in_both_directories, sources, age_seconds}, caveats[]"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mesh/find",
          "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you are trying to do, in plain words — matched against service descriptions"
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "exclude anything priced above this per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "only return services that publish a call spec you can invoke without guessing (default false)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many results, 1..50 (default 10)"
                },
                "weights": {
                  "type": "object",
                  "required": false,
                  "description": "override the ranking weights {relevance, demand, price, callable}; they are normalised as given"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "results[] {resource, description, price_usd, network, callable, call_spec, demand {calls_30d, unique_payers_30d, concentration, note}, score, why}, weights, index {total, callable, priced, price_rejected, with_demand, in_both_directories, sources, age_seconds}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mesh/find",
          "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you are trying to do, in plain words — matched against service descriptions"
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "exclude anything priced above this per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "only return services that publish a call spec you can invoke without guessing (default false)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many results, 1..50 (default 10)"
                },
                "weights": {
                  "type": "object",
                  "required": false,
                  "description": "override the ranking weights {relevance, demand, price, callable}; they are normalised as given"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "results[] {resource, description, price_usd, network, callable, call_spec, demand {calls_30d, unique_payers_30d, concentration, note}, score, why}, weights, index {total, callable, priced, price_rejected, with_demand, in_both_directories, sources, age_seconds}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mesh_probe",
      "name": "x402 Mesh — verify one endpoint before you pay it",
      "path": "/x402/mesh/probe",
      "method": "POST",
      "url": "https://animica.dev/x402/mesh/probe",
      "documentation": "https://animica.dev/x402#product-mesh_probe",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
      "available": true,
      "endpoints": [
        "POST /x402/mesh/probe"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "resource": {
              "type": "string",
              "required": true,
              "description": "absolute http(s) URL of the x402 endpoint to verify"
            },
            "method": {
              "type": "string",
              "required": false,
              "description": "HTTP verb to probe with. Omit and GET is tried first, then POST with an empty body — a write verb is never guessed at an unknown endpoint"
            },
            "fresh": {
              "type": "boolean",
              "required": false,
              "description": "ignore any cached probe and call it again now (default false)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "outcome (paywalled|open|dead|error|blocked), http_status, method, price {atomic, usd, asset, network, pay_to, scheme, max_timeout_seconds}, call_spec, accepts[], latency_ms, probed_at, cached"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mesh/probe",
          "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the x402 endpoint to verify"
                },
                "method": {
                  "type": "string",
                  "required": false,
                  "description": "HTTP verb to probe with. Omit and GET is tried first, then POST with an empty body — a write verb is never guessed at an unknown endpoint"
                },
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "ignore any cached probe and call it again now (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "outcome (paywalled|open|dead|error|blocked), http_status, method, price {atomic, usd, asset, network, pay_to, scheme, max_timeout_seconds}, call_spec, accepts[], latency_ms, probed_at, cached"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mesh/probe",
          "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the x402 endpoint to verify"
                },
                "method": {
                  "type": "string",
                  "required": false,
                  "description": "HTTP verb to probe with. Omit and GET is tried first, then POST with an empty body — a write verb is never guessed at an unknown endpoint"
                },
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "ignore any cached probe and call it again now (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "outcome (paywalled|open|dead|error|blocked), http_status, method, price {atomic, usd, asset, network, pay_to, scheme, max_timeout_seconds}, call_spec, accepts[], latency_ms, probed_at, cached"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "solve_plan",
      "name": "x402 Solve — compile a goal into a priced plan of real API calls",
      "path": "/x402/solve",
      "method": "POST",
      "url": "https://animica.dev/x402/solve",
      "documentation": "https://animica.dev/x402#product-solve_plan",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
      "available": true,
      "endpoints": [
        "POST /x402/solve"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/solve/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/solve/trial",
        "price": "0",
        "limit_per_day": 2,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/solve/trial",
          "url": "https://animica.dev/x402/solve/trial",
          "price": "0",
          "description": "FREE TRIAL of solve_plan: up to 2 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/solve."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "goal": {
              "type": "string",
              "required": true,
              "description": "what you want accomplished, in plain words"
            },
            "max_budget_usd": {
              "type": "number",
              "required": false,
              "description": "total you are willing to spend executing the plan (default 1.00)"
            },
            "max_steps": {
              "type": "integer",
              "required": false,
              "description": "cap the plan length, 1..6"
            },
            "require_verified": {
              "type": "boolean",
              "required": false,
              "description": "only plan services we have called ourselves and confirmed answer 402 (default false — it is a much smaller pool)"
            },
            "exclude_hosts": {
              "type": "array",
              "required": false,
              "description": "hostnames never to plan against"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "plan {steps[] {index, capability, why, depends_on, chosen, alternatives[], dataflow}, total_cost_usd, within_budget, steps_planned, steps_unplanned}, gaps[], execution {performed: false, how_to_run}, caveats[]"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/solve",
          "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you want accomplished, in plain words"
                },
                "max_budget_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total you are willing to spend executing the plan (default 1.00)"
                },
                "max_steps": {
                  "type": "integer",
                  "required": false,
                  "description": "cap the plan length, 1..6"
                },
                "require_verified": {
                  "type": "boolean",
                  "required": false,
                  "description": "only plan services we have called ourselves and confirmed answer 402 (default false — it is a much smaller pool)"
                },
                "exclude_hosts": {
                  "type": "array",
                  "required": false,
                  "description": "hostnames never to plan against"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "plan {steps[] {index, capability, why, depends_on, chosen, alternatives[], dataflow}, total_cost_usd, within_budget, steps_planned, steps_unplanned}, gaps[], execution {performed: false, how_to_run}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/solve",
          "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you want accomplished, in plain words"
                },
                "max_budget_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total you are willing to spend executing the plan (default 1.00)"
                },
                "max_steps": {
                  "type": "integer",
                  "required": false,
                  "description": "cap the plan length, 1..6"
                },
                "require_verified": {
                  "type": "boolean",
                  "required": false,
                  "description": "only plan services we have called ourselves and confirmed answer 402 (default false — it is a much smaller pool)"
                },
                "exclude_hosts": {
                  "type": "array",
                  "required": false,
                  "description": "hostnames never to plan against"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "plan {steps[] {index, capability, why, depends_on, chosen, alternatives[], dataflow}, total_cost_usd, within_budget, steps_planned, steps_unplanned}, gaps[], execution {performed: false, how_to_run}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "analytics_market",
      "name": "x402 Analytics — the shape of a market segment",
      "path": "/x402/analytics/market",
      "method": "POST",
      "url": "https://animica.dev/x402/analytics/market",
      "documentation": "https://animica.dev/x402#product-analytics_market",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
      "available": true,
      "endpoints": [
        "POST /x402/analytics/market"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/analytics/market/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/analytics/market/trial",
        "price": "0",
        "limit_per_day": 2,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/analytics/market/trial",
          "url": "https://animica.dev/x402/analytics/market/trial",
          "price": "0",
          "description": "FREE TRIAL of analytics_market: up to 2 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/analytics/market."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "segment": {
              "type": "string",
              "required": false,
              "description": "words describing the segment to analyse, e.g. \"weather forecast data\". Omit to analyse the whole indexed economy"
            },
            "network": {
              "type": "string",
              "required": false,
              "description": "restrict to one settlement network, e.g. \"base\""
            },
            "max_price_usd": {
              "type": "number",
              "required": false,
              "description": "restrict to services at or below this price per call"
            },
            "require_callable": {
              "type": "boolean",
              "required": false,
              "description": "restrict to services that publish a call spec (default false)"
            },
            "top": {
              "type": "integer",
              "required": false,
              "description": "how many example services to return, 0-25 (default 10)"
            },
            "narrative": {
              "type": "boolean",
              "required": false,
              "description": "include the AICF-written interpretation (default true)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "segment {matched, coverage_floor, filters}, price {min,p10,p25,median,p75,p90,max,mean}, demand, callability, verification, networks[], assets[], hosts, freshness, trend, examples[], narrative, inference {provenance, grounding}"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/market",
          "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "segment": {
                  "type": "string",
                  "required": false,
                  "description": "words describing the segment to analyse, e.g. \"weather forecast data\". Omit to analyse the whole indexed economy"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict to one settlement network, e.g. \"base\""
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "restrict to services at or below this price per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "restrict to services that publish a call spec (default false)"
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many example services to return, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "segment {matched, coverage_floor, filters}, price {min,p10,p25,median,p75,p90,max,mean}, demand, callability, verification, networks[], assets[], hosts, freshness, trend, examples[], narrative, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/market",
          "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "segment": {
                  "type": "string",
                  "required": false,
                  "description": "words describing the segment to analyse, e.g. \"weather forecast data\". Omit to analyse the whole indexed economy"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict to one settlement network, e.g. \"base\""
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "restrict to services at or below this price per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "restrict to services that publish a call spec (default false)"
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many example services to return, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "segment {matched, coverage_floor, filters}, price {min,p10,p25,median,p75,p90,max,mean}, demand, callability, verification, networks[], assets[], hosts, freshness, trend, examples[], narrative, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "analytics_price",
      "name": "x402 Analytics — where does this price sit?",
      "path": "/x402/analytics/price",
      "method": "POST",
      "url": "https://animica.dev/x402/analytics/price",
      "documentation": "https://animica.dev/x402#product-analytics_price",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
      "available": true,
      "endpoints": [
        "POST /x402/analytics/price"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/analytics/price/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/analytics/price/trial",
        "price": "0",
        "limit_per_day": 2,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/analytics/price/trial",
          "url": "https://animica.dev/x402/analytics/price/trial",
          "price": "0",
          "description": "FREE TRIAL of analytics_price: up to 2 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/analytics/price."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "description": {
              "type": "string",
              "required": true,
              "description": "what the service does, in the words a merchant would use to describe it"
            },
            "price_usd": {
              "type": "number",
              "required": false,
              "description": "the price per call you charge or are considering. Omit to get the market band without a position"
            },
            "network": {
              "type": "string",
              "required": false,
              "description": "restrict comparables to one settlement network"
            },
            "top_comparables": {
              "type": "integer",
              "required": false,
              "description": "how many comparables to list back, 0-25 (default 10)"
            },
            "narrative": {
              "type": "boolean",
              "required": false,
              "description": "include the AICF-written interpretation (default true)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "comparables {count, floor, listed[]}, distribution {deciles}, your_position {percentile, vs_median}, demand_by_band[], suggested_band, inference {provenance, grounding}"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/price",
          "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "description": {
                  "type": "string",
                  "required": true,
                  "description": "what the service does, in the words a merchant would use to describe it"
                },
                "price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "the price per call you charge or are considering. Omit to get the market band without a position"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict comparables to one settlement network"
                },
                "top_comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparables to list back, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "comparables {count, floor, listed[]}, distribution {deciles}, your_position {percentile, vs_median}, demand_by_band[], suggested_band, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/price",
          "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "description": {
                  "type": "string",
                  "required": true,
                  "description": "what the service does, in the words a merchant would use to describe it"
                },
                "price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "the price per call you charge or are considering. Omit to get the market band without a position"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict comparables to one settlement network"
                },
                "top_comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparables to list back, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "comparables {count, floor, listed[]}, distribution {deciles}, your_position {percentile, vs_median}, demand_by_band[], suggested_band, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "analytics_peers",
      "name": "x402 Analytics — one endpoint against its peers",
      "path": "/x402/analytics/peers",
      "method": "POST",
      "url": "https://animica.dev/x402/analytics/peers",
      "documentation": "https://animica.dev/x402#product-analytics_peers",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
      "available": true,
      "endpoints": [
        "POST /x402/analytics/peers"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/analytics/peers/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/analytics/peers/trial",
        "price": "0",
        "limit_per_day": 2,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/analytics/peers/trial",
          "url": "https://animica.dev/x402/analytics/peers/trial",
          "price": "0",
          "description": "FREE TRIAL of analytics_peers: up to 2 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/analytics/peers."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "resource": {
              "type": "string",
              "required": true,
              "description": "the absolute http(s) URL of a service listed in the x402 index"
            },
            "top_peers": {
              "type": "integer",
              "required": false,
              "description": "how many peers to list, 0-25 (default 10)"
            },
            "narrative": {
              "type": "boolean",
              "required": false,
              "description": "include the AICF-written interpretation (default true)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "subject {listing, verified}, peers {count, listed[]}, ranks {price, calls, payer_diversity}, mirrors[], inference {provenance, grounding}"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/peers",
          "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of a service listed in the x402 index"
                },
                "top_peers": {
                  "type": "integer",
                  "required": false,
                  "description": "how many peers to list, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "subject {listing, verified}, peers {count, listed[]}, ranks {price, calls, payer_diversity}, mirrors[], inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/peers",
          "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of a service listed in the x402 index"
                },
                "top_peers": {
                  "type": "integer",
                  "required": false,
                  "description": "how many peers to list, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "subject {listing, verified}, peers {count, listed[]}, ranks {price, calls, payer_diversity}, mirrors[], inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "crawl_pass",
      "name": "Crawl pass (small)",
      "path": "/x402/crawl/pass",
      "method": "POST",
      "url": "https://animica.dev/x402/crawl/pass",
      "documentation": "https://animica.dev/x402#product-crawl_pass",
      "price": "0.010",
      "price_atomic": "10000",
      "currency": "USDC",
      "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
      "available": true,
      "endpoints": [
        "POST /x402/crawl/pass"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "POST /x402/crawl/sites",
          "url": "https://animica.dev/x402/crawl/sites",
          "price": "0",
          "description": "FREE, no account. Register a domain for Paid Crawl and get back the robots.txt snippet and a verification token. Site operators never pay for this product — the crawler pays."
        },
        {
          "endpoint": "POST /x402/crawl/verify",
          "url": "https://animica.dev/x402/crawl/verify",
          "price": "0",
          "description": "FREE. Prove you control a registered domain by serving its token at /.well-known/paid-crawl-verify.txt. Verification gates payouts, not registration."
        },
        {
          "endpoint": "POST /x402/crawl/decide",
          "url": "https://animica.dev/x402/crawl/decide",
          "price": "0",
          "description": "FREE and unmetered. The decision endpoint a site edge calls (nginx auth_request, a Cloudflare Worker, or Express middleware): given the inbound request it answers allow / charge / block. Site operators are never billed for this."
        },
        {
          "endpoint": "GET /x402/crawl/install",
          "url": "https://animica.dev/x402/crawl/install",
          "price": "0",
          "description": "FREE. Copy-paste install for the Paid Crawl gate: the nginx auth_request snippet, the Cloudflare Worker, and the plain-HTTP contract for anything else."
        },
        {
          "endpoint": "GET /.well-known/paid-crawl",
          "url": "https://animica.dev/.well-known/paid-crawl",
          "price": "0",
          "description": "FREE, no auth. The whole Paid Crawl protocol in one document: how a website starts charging AI crawlers (free, no account), and how a crawler discovers terms and pays."
        },
        {
          "endpoint": "GET /x402/crawl/earnings/{domain}",
          "url": "https://animica.dev/x402/crawl/earnings/{domain}",
          "price": "0",
          "description": "FREE. What a domain has earned from paid crawls, and which crawlers paid it."
        },
        {
          "endpoint": "GET /x402/crawl/{domain}",
          "url": "https://animica.dev/x402/crawl/{domain}",
          "price": "0",
          "description": "FREE. The machine-readable crawl terms for one domain — the document a robots.txt X402-Crawl line points at. Readable by anyone, including unpaid crawlers, because a crawler that cannot read the rules can never follow them."
        },
        {
          "endpoint": "POST /x402/crawl/licence",
          "url": "https://animica.dev/x402/crawl/licence",
          "price": "0",
          "description": "FREE. Exchange a crawl pass for a post-quantum-signed licence: a portable, independently verifiable record of what you paid for, which domain, at what price and over what window. Signed with ML-DSA-65 (FIPS 204, scheme 4099) — the evidence stays valid after classical signatures stop being evidence."
        },
        {
          "endpoint": "POST /x402/crawl/licence/verify",
          "url": "https://animica.dev/x402/crawl/licence/verify",
          "price": "0",
          "description": "FREE, and free on purpose: a receipt nobody can check for free is not evidence. Verify any Animica crawl licence — send signed_bytes, signature and public_key exactly as issued."
        },
        {
          "endpoint": "GET /x402/crawl/pubkey",
          "url": "https://animica.dev/x402/crawl/pubkey",
          "price": "0",
          "description": "FREE. The ML-DSA-65 public key every Animica crawl licence is signed with, so licences can be verified offline without calling us at all."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "json",
          "bodyFields": {
            "domain": {
              "type": "string",
              "required": true,
              "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
            },
            "ttl_seconds": {
              "type": "integer",
              "description": "how long the pass stays valid, 60-86400 (default 3600)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "crawl_pass_10",
      "name": "Crawl pass (medium)",
      "path": "/x402/crawl/pass/10",
      "method": "POST",
      "url": "https://animica.dev/x402/crawl/pass/10",
      "documentation": "https://animica.dev/x402#product-crawl_pass_10",
      "price": "0.100",
      "price_atomic": "100000",
      "currency": "USDC",
      "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
      "available": true,
      "endpoints": [
        "POST /x402/crawl/pass/10"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "json",
          "bodyFields": {
            "domain": {
              "type": "string",
              "required": true,
              "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
            },
            "ttl_seconds": {
              "type": "integer",
              "description": "how long the pass stays valid, 60-86400 (default 3600)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "100000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass/10",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "1196172248803",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass/10",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "1196.172248803 ANM",
            "usd_equivalent": "0.075000",
            "usd_list_price": "0.100",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "crawl_pass_100",
      "name": "Crawl pass (bulk)",
      "path": "/x402/crawl/pass/100",
      "method": "POST",
      "url": "https://animica.dev/x402/crawl/pass/100",
      "documentation": "https://animica.dev/x402#product-crawl_pass_100",
      "price": "1.000",
      "price_atomic": "1000000",
      "currency": "USDC",
      "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
      "available": true,
      "endpoints": [
        "POST /x402/crawl/pass/100"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "json",
          "bodyFields": {
            "domain": {
              "type": "string",
              "required": true,
              "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
            },
            "ttl_seconds": {
              "type": "integer",
              "description": "how long the pass stays valid, 60-86400 (default 3600)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "1000000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass/100",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "11961722488038",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass/100",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "11961.722488038 ANM",
            "usd_equivalent": "0.750000",
            "usd_list_price": "1.000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "forecast_notarized",
      "name": "Notarised forecast with market comparison",
      "path": "/x402/forecast",
      "method": "POST",
      "url": "https://animica.dev/x402/forecast",
      "documentation": "https://animica.dev/x402#product-forecast_notarized",
      "price": "0.009124",
      "price_atomic": "9124",
      "currency": "USDC",
      "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
      "available": true,
      "endpoints": [
        "POST /x402/forecast"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/forecast/calibration",
          "url": "https://animica.dev/x402/forecast/calibration",
          "price": "0",
          "description": "FREE: the scored track record of every notarised forecast whose market has settled — mean Brier score for the model AND for the market, so you can see plainly whether the model adds anything. Published win or lose."
        },
        {
          "endpoint": "GET /x402/forecast/{commitment}",
          "url": "https://animica.dev/x402/forecast/{commitment}",
          "price": "0",
          "description": "FREE and permanent: the anchored forecast record for a commitment, its DA inclusion proof, and — once the market settles — the outcome and Brier scores for both the model and the market."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "question": {
              "type": "string",
              "required": true,
              "description": "a yes/no question about the future, e.g. \"Will X happen before 2027?\""
            },
            "market_slug": {
              "type": "string",
              "required": false,
              "description": "pin the comparison to a specific prediction market by slug"
            },
            "market_id": {
              "type": "string",
              "required": false,
              "description": "pin the comparison by market id"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "commitment, verify_url, record (the exact anchored bytes), model {probability, reasoning, name}, market {price, id, slug, end_date, source} or null, divergence, anchored_at {head_height, head_hash}, proof, and an explicit statement of what the proof does and does not establish"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/forecast",
          "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "a yes/no question about the future, e.g. \"Will X happen before 2027?\""
                },
                "market_slug": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison to a specific prediction market by slug"
                },
                "market_id": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison by market id"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, verify_url, record (the exact anchored bytes), model {probability, reasoning, name}, market {price, id, slug, end_date, source} or null, divergence, anchored_at {head_height, head_hash}, proof, and an explicit statement of what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/forecast",
          "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "a yes/no question about the future, e.g. \"Will X happen before 2027?\""
                },
                "market_slug": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison to a specific prediction market by slug"
                },
                "market_id": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison by market id"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, verify_url, record (the exact anchored bytes), model {probability, reasoning, name}, market {price, id, slug, end_date, source} or null, divergence, anchored_at {head_height, head_hash}, proof, and an explicit statement of what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "execute",
      "name": "Animica Execute — pay once, get a verified result",
      "path": "/x402/execute",
      "method": "POST",
      "url": "https://animica.dev/x402/execute",
      "documentation": "https://animica.dev/x402#product-execute",
      "price": "0.020000",
      "price_atomic": "20000",
      "currency": "USDC",
      "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
      "available": true,
      "endpoints": [
        "POST /x402/execute"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "task": {
              "type": "string",
              "required": true,
              "description": "what to do, in plain language. A URL in the task routes it to extraction."
            },
            "quality": {
              "type": "string",
              "required": false,
              "description": "\"fast\" (1 pass, no verification) or \"verified\" (multiple samples + agreement). Default fast."
            },
            "anchor": {
              "type": "boolean",
              "required": false,
              "description": "anchor the result on-chain and return a free permanent proof (default false)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "status, capability, result, verification {provider_count, providers_distinct, samples, agreement, confidence, method, caveat}, receipt {alg, signature, public_key, preimage, verify}, anchor {commitment, verify_url} when requested, and elapsed_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/execute",
          "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "task": {
                  "type": "string",
                  "required": true,
                  "description": "what to do, in plain language. A URL in the task routes it to extraction."
                },
                "quality": {
                  "type": "string",
                  "required": false,
                  "description": "\"fast\" (1 pass, no verification) or \"verified\" (multiple samples + agreement). Default fast."
                },
                "anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "anchor the result on-chain and return a free permanent proof (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "status, capability, result, verification {provider_count, providers_distinct, samples, agreement, confidence, method, caveat}, receipt {alg, signature, public_key, preimage, verify}, anchor {commitment, verify_url} when requested, and elapsed_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/execute",
          "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "task": {
                  "type": "string",
                  "required": true,
                  "description": "what to do, in plain language. A URL in the task routes it to extraction."
                },
                "quality": {
                  "type": "string",
                  "required": false,
                  "description": "\"fast\" (1 pass, no verification) or \"verified\" (multiple samples + agreement). Default fast."
                },
                "anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "anchor the result on-chain and return a free permanent proof (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "status, capability, result, verification {provider_count, providers_distinct, samples, agreement, confidence, method, caveat}, receipt {alg, signature, public_key, preimage, verify}, anchor {commitment, verify_url} when requested, and elapsed_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "extract_structured",
      "name": "Structured data extraction (your JSON Schema)",
      "path": "/x402/extract",
      "method": "POST",
      "url": "https://animica.dev/x402/extract",
      "documentation": "https://animica.dev/x402#product-extract_structured",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/extract"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/extract/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/extract/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/extract/trial",
          "url": "https://animica.dev/x402/extract/trial",
          "price": "0",
          "description": "FREE TRIAL of extract_structured: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/extract."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "input": {
              "type": "string",
              "required": true,
              "description": "the unstructured text to extract from"
            },
            "schema": {
              "type": "object",
              "required": true,
              "description": "JSON Schema the result must satisfy (subset: type, properties, required, items, enum, const, min/max, minLength/maxLength, minItems/maxItems, additionalProperties)"
            },
            "instruction": {
              "type": "string",
              "required": false,
              "description": "optional extra guidance, e.g. \"amounts in minor units\""
            }
          }
        },
        "output": {
          "type": "json",
          "description": "data (validated against your schema), model, attempts, repaired, unsupported_schema_keywords"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/extract",
          "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the unstructured text to extract from"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the result must satisfy (subset: type, properties, required, items, enum, const, min/max, minLength/maxLength, minItems/maxItems, additionalProperties)"
                },
                "instruction": {
                  "type": "string",
                  "required": false,
                  "description": "optional extra guidance, e.g. \"amounts in minor units\""
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data (validated against your schema), model, attempts, repaired, unsupported_schema_keywords"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/extract",
          "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the unstructured text to extract from"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the result must satisfy (subset: type, properties, required, items, enum, const, min/max, minLength/maxLength, minItems/maxItems, additionalProperties)"
                },
                "instruction": {
                  "type": "string",
                  "required": false,
                  "description": "optional extra guidance, e.g. \"amounts in minor units\""
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data (validated against your schema), model, attempts, repaired, unsupported_schema_keywords"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "classify",
      "name": "Text classification",
      "path": "/x402/classify",
      "method": "POST",
      "url": "https://animica.dev/x402/classify",
      "documentation": "https://animica.dev/x402#product-classify",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/classify"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/classify/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/classify/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/classify/trial",
          "url": "https://animica.dev/x402/classify/trial",
          "price": "0",
          "description": "FREE TRIAL of classify: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/classify."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "input": {
              "type": "string",
              "required": true,
              "description": "the text to classify"
            },
            "labels": {
              "type": "array",
              "required": true,
              "description": "2..50 candidate labels"
            },
            "multi": {
              "type": "boolean",
              "required": false,
              "description": "allow multiple labels (default false)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "label (or labels), confidence 0..1, rationale, model"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/classify",
          "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the text to classify"
                },
                "labels": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 candidate labels"
                },
                "multi": {
                  "type": "boolean",
                  "required": false,
                  "description": "allow multiple labels (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "label (or labels), confidence 0..1, rationale, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/classify",
          "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the text to classify"
                },
                "labels": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 candidate labels"
                },
                "multi": {
                  "type": "boolean",
                  "required": false,
                  "description": "allow multiple labels (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "label (or labels), confidence 0..1, rationale, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "entities",
      "name": "Entity extraction",
      "path": "/x402/entities",
      "method": "POST",
      "url": "https://animica.dev/x402/entities",
      "documentation": "https://animica.dev/x402#product-entities",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/entities"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/entities/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/entities/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/entities/trial",
          "url": "https://animica.dev/x402/entities/trial",
          "price": "0",
          "description": "FREE TRIAL of entities: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/entities."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "input": {
              "type": "string",
              "required": true,
              "description": "text to scan"
            },
            "types": {
              "type": "array",
              "required": false,
              "description": "restrict to a subset of person, organization, location, date, amount, product, url, email, phone, wallet_address, other"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "entities[] {type, text, normalized?}, count, model"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/entities",
          "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "text to scan"
                },
                "types": {
                  "type": "array",
                  "required": false,
                  "description": "restrict to a subset of person, organization, location, date, amount, product, url, email, phone, wallet_address, other"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "entities[] {type, text, normalized?}, count, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/entities",
          "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "text to scan"
                },
                "types": {
                  "type": "array",
                  "required": false,
                  "description": "restrict to a subset of person, organization, location, date, amount, product, url, email, phone, wallet_address, other"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "entities[] {type, text, normalized?}, count, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "json_repair",
      "name": "JSON repair and schema enforcement",
      "path": "/x402/json/repair",
      "method": "POST",
      "url": "https://animica.dev/x402/json/repair",
      "documentation": "https://animica.dev/x402#product-json_repair",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/json/repair"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/json/repair/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/json/repair/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/json/repair/trial",
          "url": "https://animica.dev/x402/json/repair/trial",
          "price": "0",
          "description": "FREE TRIAL of json_repair: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/json/repair."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "input": {
              "type": "string",
              "required": true,
              "description": "the malformed / fenced / prose-wrapped JSON"
            },
            "schema": {
              "type": "object",
              "required": true,
              "description": "JSON Schema the repaired value must satisfy"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "data, method (\"parsed\" | \"model_repaired\"), model, attempts"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/json/repair",
          "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the malformed / fenced / prose-wrapped JSON"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the repaired value must satisfy"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data, method (\"parsed\" | \"model_repaired\"), model, attempts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/json/repair",
          "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the malformed / fenced / prose-wrapped JSON"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the repaired value must satisfy"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data, method (\"parsed\" | \"model_repaired\"), model, attempts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "injection_scan",
      "name": "Prompt-injection detector",
      "path": "/x402/security/injection",
      "method": "POST",
      "url": "https://animica.dev/x402/security/injection",
      "documentation": "https://animica.dev/x402#product-injection_scan",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/security/injection"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/security/injection/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/security/injection/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/security/injection/trial",
          "url": "https://animica.dev/x402/security/injection/trial",
          "price": "0",
          "description": "FREE TRIAL of injection_scan: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/security/injection."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "input": {
              "type": "string",
              "required": true,
              "description": "the untrusted content to scan"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "risk 0..1, verdict, findings[] {technique, span, severity}, pattern_hits[], model"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/security/injection",
          "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the untrusted content to scan"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "risk 0..1, verdict, findings[] {technique, span, severity}, pattern_hits[], model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/security/injection",
          "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the untrusted content to scan"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "risk 0..1, verdict, findings[] {technique, span, severity}, pattern_hits[], model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "rerank",
      "name": "Rerank search results",
      "path": "/x402/rerank",
      "method": "POST",
      "url": "https://animica.dev/x402/rerank",
      "documentation": "https://animica.dev/x402#product-rerank",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/rerank"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/rerank/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/rerank/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/rerank/trial",
          "url": "https://animica.dev/x402/rerank/trial",
          "price": "0",
          "description": "FREE TRIAL of rerank: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/rerank."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "query": {
              "type": "string",
              "required": true
            },
            "documents": {
              "type": "array",
              "required": true,
              "description": "2..50 strings"
            },
            "top_k": {
              "type": "integer",
              "required": false,
              "description": "how many to return (default 5)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "ranked[] {index, score, reason}, model"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/rerank",
          "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true
                },
                "documents": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 strings"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to return (default 5)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ranked[] {index, score, reason}, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/rerank",
          "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true
                },
                "documents": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 strings"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to return (default 5)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ranked[] {index, score, reason}, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "route_action",
      "name": "Agent action router",
      "path": "/x402/route",
      "method": "POST",
      "url": "https://animica.dev/x402/route",
      "documentation": "https://animica.dev/x402#product-route_action",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
      "available": true,
      "endpoints": [
        "POST /x402/route"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/route/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/route/trial",
        "price": "0",
        "limit_per_day": 5,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/route/trial",
          "url": "https://animica.dev/x402/route/trial",
          "price": "0",
          "description": "FREE TRIAL of route_action: up to 5 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/route."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "goal": {
              "type": "string",
              "required": true,
              "description": "what the agent is trying to achieve"
            },
            "actions": {
              "type": "array",
              "required": true,
              "description": "2..20 actions: {name, description, parameters?}"
            },
            "context": {
              "type": "string",
              "required": false,
              "description": "extra state the decision depends on"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "action, arguments, confidence, reason, escalate, model"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/route",
          "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what the agent is trying to achieve"
                },
                "actions": {
                  "type": "array",
                  "required": true,
                  "description": "2..20 actions: {name, description, parameters?}"
                },
                "context": {
                  "type": "string",
                  "required": false,
                  "description": "extra state the decision depends on"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "action, arguments, confidence, reason, escalate, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/route",
          "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what the agent is trying to achieve"
                },
                "actions": {
                  "type": "array",
                  "required": true,
                  "description": "2..20 actions: {name, description, parameters?}"
                },
                "context": {
                  "type": "string",
                  "required": false,
                  "description": "extra state the decision depends on"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "action, arguments, confidence, reason, escalate, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "random_int",
      "name": "Uniform random integers",
      "path": "/x402/random/int",
      "method": "POST",
      "url": "https://animica.dev/x402/random/int",
      "documentation": "https://animica.dev/x402#product-random_int",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
      "available": true,
      "endpoints": [
        "POST /x402/random/int"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_trial": {
        "endpoint": "POST /x402/random/int/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/random/int/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/random/int/trial",
          "url": "https://animica.dev/x402/random/int/trial",
          "price": "0",
          "description": "FREE TRIAL of random_int: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/random/int."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "min": {
              "type": "integer",
              "required": true,
              "description": "lower bound, inclusive"
            },
            "max": {
              "type": "integer",
              "required": true,
              "description": "upper bound, inclusive (>= min)"
            },
            "count": {
              "type": "integer",
              "required": false,
              "description": "how many integers, 1..1000 (default 1; alias n)"
            },
            "request_id": {
              "type": "string",
              "required": false,
              "description": "your own tag; mixed into the DRNG seed so you can recompute this exact draw"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "result {ints}, randomness (hex raw draw), source, health, attestation, verification, derivation {rules, steps, recompute} for offline recomputation, payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/int",
          "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "min": {
                  "type": "integer",
                  "required": true,
                  "description": "lower bound, inclusive"
                },
                "max": {
                  "type": "integer",
                  "required": true,
                  "description": "upper bound, inclusive (>= min)"
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many integers, 1..1000 (default 1; alias n)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed so you can recompute this exact draw"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {ints}, randomness (hex raw draw), source, health, attestation, verification, derivation {rules, steps, recompute} for offline recomputation, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/int",
          "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "min": {
                  "type": "integer",
                  "required": true,
                  "description": "lower bound, inclusive"
                },
                "max": {
                  "type": "integer",
                  "required": true,
                  "description": "upper bound, inclusive (>= min)"
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many integers, 1..1000 (default 1; alias n)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed so you can recompute this exact draw"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {ints}, randomness (hex raw draw), source, health, attestation, verification, derivation {rules, steps, recompute} for offline recomputation, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "random_shuffle",
      "name": "Verifiable shuffle",
      "path": "/x402/random/shuffle",
      "method": "POST",
      "url": "https://animica.dev/x402/random/shuffle",
      "documentation": "https://animica.dev/x402#product-random_shuffle",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
      "available": true,
      "endpoints": [
        "POST /x402/random/shuffle"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_trial": {
        "endpoint": "POST /x402/random/shuffle/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/random/shuffle/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/random/shuffle/trial",
          "url": "https://animica.dev/x402/random/shuffle/trial",
          "price": "0",
          "description": "FREE TRIAL of random_shuffle: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/random/shuffle."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "items": {
              "type": "array",
              "required": false,
              "description": "the list to shuffle, 1..10000 entries (any JSON values)"
            },
            "n": {
              "type": "integer",
              "required": false,
              "description": "shuffle 1..n instead of a supplied list (1..10000); supply exactly one of items or n"
            },
            "request_id": {
              "type": "string",
              "required": false,
              "description": "your own tag; mixed into the DRNG seed"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "result {permutation (0-based indices), items (shuffled), count}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute}, payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/shuffle",
          "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": false,
                  "description": "the list to shuffle, 1..10000 entries (any JSON values)"
                },
                "n": {
                  "type": "integer",
                  "required": false,
                  "description": "shuffle 1..n instead of a supplied list (1..10000); supply exactly one of items or n"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {permutation (0-based indices), items (shuffled), count}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/shuffle",
          "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": false,
                  "description": "the list to shuffle, 1..10000 entries (any JSON values)"
                },
                "n": {
                  "type": "integer",
                  "required": false,
                  "description": "shuffle 1..n instead of a supplied list (1..10000); supply exactly one of items or n"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {permutation (0-based indices), items (shuffled), count}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "random_pick",
      "name": "Weighted random pick",
      "path": "/x402/random/pick",
      "method": "POST",
      "url": "https://animica.dev/x402/random/pick",
      "documentation": "https://animica.dev/x402#product-random_pick",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
      "available": true,
      "endpoints": [
        "POST /x402/random/pick"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_trial": {
        "endpoint": "POST /x402/random/pick/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/random/pick/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/random/pick/trial",
          "url": "https://animica.dev/x402/random/pick/trial",
          "price": "0",
          "description": "FREE TRIAL of random_pick: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/random/pick."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "items": {
              "type": "array",
              "required": true,
              "description": "candidates, 1..10000 entries (any JSON values)"
            },
            "k": {
              "type": "integer",
              "required": false,
              "description": "how many to pick, 1..1000 (default 1; alias count). Without replacement k <= items.length"
            },
            "replace": {
              "type": "boolean",
              "required": false,
              "description": "true = with replacement (an item can win twice); default false"
            },
            "weights": {
              "type": "array",
              "required": false,
              "description": "one non-negative INTEGER weight per item (floats rejected: the cumulative search must be recomputable exactly)"
            },
            "indices_only": {
              "type": "boolean",
              "required": false,
              "description": "omit the picked items and return only their 0-based indices — use it when the items are large: the response cap is 4000000 bytes and with replace:true the same item can be emitted k times"
            },
            "request_id": {
              "type": "string",
              "required": false,
              "description": "your own tag; mixed into the DRNG seed"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "result {picked (omitted when indices_only), indices, k, replace, weighted}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute?}, payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/pick",
          "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": true,
                  "description": "candidates, 1..10000 entries (any JSON values)"
                },
                "k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to pick, 1..1000 (default 1; alias count). Without replacement k <= items.length"
                },
                "replace": {
                  "type": "boolean",
                  "required": false,
                  "description": "true = with replacement (an item can win twice); default false"
                },
                "weights": {
                  "type": "array",
                  "required": false,
                  "description": "one non-negative INTEGER weight per item (floats rejected: the cumulative search must be recomputable exactly)"
                },
                "indices_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "omit the picked items and return only their 0-based indices — use it when the items are large: the response cap is 4000000 bytes and with replace:true the same item can be emitted k times"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {picked (omitted when indices_only), indices, k, replace, weighted}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute?}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/pick",
          "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": true,
                  "description": "candidates, 1..10000 entries (any JSON values)"
                },
                "k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to pick, 1..1000 (default 1; alias count). Without replacement k <= items.length"
                },
                "replace": {
                  "type": "boolean",
                  "required": false,
                  "description": "true = with replacement (an item can win twice); default false"
                },
                "weights": {
                  "type": "array",
                  "required": false,
                  "description": "one non-negative INTEGER weight per item (floats rejected: the cumulative search must be recomputable exactly)"
                },
                "indices_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "omit the picked items and return only their 0-based indices — use it when the items are large: the response cap is 4000000 bytes and with replace:true the same item can be emitted k times"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {picked (omitted when indices_only), indices, k, replace, weighted}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute?}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "random_bulk",
      "name": "Batched independent draws (one settlement)",
      "path": "/x402/qrng/bulk",
      "method": "POST",
      "url": "https://animica.dev/x402/qrng/bulk",
      "documentation": "https://animica.dev/x402#product-random_bulk",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
      "available": true,
      "endpoints": [
        "POST /x402/qrng/bulk"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_trial": {
        "endpoint": "POST /x402/qrng/bulk/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/qrng/bulk/trial",
        "price": "0",
        "limit_per_day": 3,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/qrng/bulk/trial",
          "url": "https://animica.dev/x402/qrng/bulk/trial",
          "price": "0",
          "description": "FREE TRIAL of random_bulk: up to 3 calls per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/qrng/bulk."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "draws": {
              "type": "integer",
              "required": false,
              "description": "how many INDEPENDENT draws, 5..10 (default 10; alias count). Below 5 this endpoint is more expensive than 5 single draws and refuses with a 400."
            },
            "bytes": {
              "type": "integer",
              "required": false,
              "description": "bytes per draw, 1..1024 (default 32; draws*bytes <= 65536)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "result {draws: [{index, bytes, randomness, sha3_256, source, health, attestation, verification}], count, bytes_per_draw, pricing}, source, health (aggregate), attestation {scope: per_draw}, verification, derivation (independence + digest rules), payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/qrng/bulk",
          "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "draws": {
                  "type": "integer",
                  "required": false,
                  "description": "how many INDEPENDENT draws, 5..10 (default 10; alias count). Below 5 this endpoint is more expensive than 5 single draws and refuses with a 400."
                },
                "bytes": {
                  "type": "integer",
                  "required": false,
                  "description": "bytes per draw, 1..1024 (default 32; draws*bytes <= 65536)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {draws: [{index, bytes, randomness, sha3_256, source, health, attestation, verification}], count, bytes_per_draw, pricing}, source, health (aggregate), attestation {scope: per_draw}, verification, derivation (independence + digest rules), payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/qrng/bulk",
          "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "draws": {
                  "type": "integer",
                  "required": false,
                  "description": "how many INDEPENDENT draws, 5..10 (default 10; alias count). Below 5 this endpoint is more expensive than 5 single draws and refuses with a 400."
                },
                "bytes": {
                  "type": "integer",
                  "required": false,
                  "description": "bytes per draw, 1..1024 (default 32; draws*bytes <= 65536)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {draws: [{index, bytes, randomness, sha3_256, source, health, attestation, verification}], count, bytes_per_draw, pricing}, source, health (aggregate), attestation {scope: per_draw}, verification, derivation (independence + digest rules), payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "random_commit",
      "name": "Commit-reveal randomness (public audit trail)",
      "path": "/x402/random/commit",
      "method": "POST",
      "url": "https://animica.dev/x402/random/commit",
      "documentation": "https://animica.dev/x402#product-random_commit",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
      "available": true,
      "endpoints": [
        "POST /x402/random/commit"
      ],
      "mimeType": "application/json",
      "entropy": {
        "source": "software-fallback",
        "vendor": "os",
        "model": "os.urandom CSPRNG",
        "is_hardware": false,
        "is_quantum": false,
        "attested": false,
        "signer_backend": "software",
        "health_passed": true,
        "min_entropy_per_byte": 7.7704,
        "observed_at": "2026-08-23T05:53:36.441Z",
        "note": "observed on the gateway's own readiness draw, published unpaid so the trust model is knowable before purchase; the same fields ride verbatim on every paid response"
      },
      "free_endpoints": [
        {
          "endpoint": "GET /x402/random/reveal/{commit_id}",
          "url": "https://animica.dev/x402/random/reveal/{commit_id}",
          "price": "0",
          "description": "FREE public reveal: secret, salt, raw draw and attestation for a commitment. No payment, ever. Idempotent."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "reveal_after_seconds": {
              "type": "integer",
              "required": false,
              "description": "seconds until the free reveal opens, 0..604800 (default 0 = revealable immediately)"
            },
            "memo": {
              "type": "string",
              "required": false,
              "description": "up to 256 printable ASCII chars, published verbatim at reveal (bind the commitment to your round/bet id)"
            },
            "request_id": {
              "type": "string",
              "required": false,
              "description": "your own tag; mixed into the DRNG seed that produced the secret"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "commit_id, commitment, algorithm, reveal_after (unix seconds), reveal_url, source, health, attestation (the draw is NOT disclosed yet), verification, payment metadata"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/commit",
          "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "reveal_after_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "seconds until the free reveal opens, 0..604800 (default 0 = revealable immediately)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "up to 256 printable ASCII chars, published verbatim at reveal (bind the commitment to your round/bet id)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed that produced the secret"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commit_id, commitment, algorithm, reveal_after (unix seconds), reveal_url, source, health, attestation (the draw is NOT disclosed yet), verification, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/commit",
          "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "reveal_after_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "seconds until the free reveal opens, 0..604800 (default 0 = revealable immediately)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "up to 256 printable ASCII chars, published verbatim at reveal (bind the commitment to your round/bet id)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed that produced the secret"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commit_id, commitment, algorithm, reveal_after (unix seconds), reveal_url, source, health, attestation (the draw is NOT disclosed yet), verification, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "media_image",
      "name": "AI image render",
      "path": "/x402/media/image",
      "method": "POST",
      "url": "https://animica.dev/x402/media/image",
      "documentation": "https://animica.dev/x402#product-media_image",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
      "available": true,
      "endpoints": [
        "POST /x402/media/image"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/media/image/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/media/image/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/media/image/trial",
          "url": "https://animica.dev/x402/media/image/trial",
          "price": "0",
          "description": "FREE TRIAL of media_image: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/media/image."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "kind": {
              "type": "string",
              "description": "one of: image (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
            },
            "prompt": {
              "type": "string",
              "description": "what to render; required except for upload-driven kinds"
            },
            "params": {
              "type": "object",
              "description": "optional per-kind parameters, clamped by the renderer"
            },
            "upload_ids": {
              "type": "array",
              "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/image",
          "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: image (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/image",
          "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: image (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "media_video",
      "name": "AI video render",
      "path": "/x402/media/video",
      "method": "POST",
      "url": "https://animica.dev/x402/media/video",
      "documentation": "https://animica.dev/x402#product-media_video",
      "price": "0.010000",
      "price_atomic": "10000",
      "currency": "USDC",
      "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
      "available": true,
      "endpoints": [
        "POST /x402/media/video"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/media/video/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/media/video/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/media/video/trial",
          "url": "https://animica.dev/x402/media/video/trial",
          "price": "0",
          "description": "FREE TRIAL of media_video: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/media/video."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "kind": {
              "type": "string",
              "description": "one of: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
            },
            "prompt": {
              "type": "string",
              "description": "what to render; required except for upload-driven kinds"
            },
            "params": {
              "type": "object",
              "description": "optional per-kind parameters, clamped by the renderer"
            },
            "upload_ids": {
              "type": "array",
              "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/video",
          "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/video",
          "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "media_audio",
      "name": "AI audio render",
      "path": "/x402/media/audio",
      "method": "POST",
      "url": "https://animica.dev/x402/media/audio",
      "documentation": "https://animica.dev/x402#product-media_audio",
      "price": "0.007984",
      "price_atomic": "7984",
      "currency": "USDC",
      "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
      "available": true,
      "endpoints": [
        "POST /x402/media/audio"
      ],
      "mimeType": "application/json",
      "free_trial": {
        "endpoint": "POST /x402/media/audio/trial",
        "methods": [
          "POST"
        ],
        "url": "https://animica.dev/x402/media/audio/trial",
        "price": "0",
        "limit_per_day": 1,
        "suitable_for_continuous_probing": false
      },
      "free_endpoints": [
        {
          "endpoint": "POST /x402/media/audio/trial",
          "url": "https://animica.dev/x402/media/audio/trial",
          "price": "0",
          "description": "FREE TRIAL of media_audio: up to 1 call per client per UTC day, no payment. Runs the same code as the paid endpoint and returns the same response shape, so you can check the service is live and judge the output before paying. When the quota is spent this answers 402-equivalent guidance pointing at /x402/media/audio."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "kind": {
              "type": "string",
              "description": "one of: audio, audio_stems, audio_isolate, audio_enhance, audio_master (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
            },
            "prompt": {
              "type": "string",
              "description": "what to render; required except for upload-driven kinds"
            },
            "params": {
              "type": "object",
              "description": "optional per-kind parameters, clamped by the renderer"
            },
            "upload_ids": {
              "type": "array",
              "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7984",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/audio",
          "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: audio, audio_stems, audio_isolate, audio_enhance, audio_master (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95502392344",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/audio",
          "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: audio, audio_stems, audio_isolate, audio_enhance, audio_master (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.502392344 ANM",
            "usd_equivalent": "0.005988",
            "usd_list_price": "0.007984",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "compute_inventory",
      "name": "Animica compute inventory",
      "path": "/x402/compute/inventory",
      "method": "POST",
      "url": "https://animica.dev/x402/compute/inventory",
      "documentation": "https://animica.dev/x402#product-compute_inventory",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
      "available": true,
      "endpoints": [
        "POST /x402/compute/inventory",
        "GET /x402/compute/inventory"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "fresh": {
              "type": "boolean",
              "required": false,
              "description": "force a live re-probe instead of the short-lived memo (default false). Use it immediately before you commit money to a job."
            },
            "workloads": {
              "type": "array",
              "required": false,
              "description": "up to 8 workloads to get an admission verdict for — inference, image, video, audio, or a media kind such as video_i2v or audio_master"
            }
          },
          "queryParams": {
            "fresh": {
              "type": "string",
              "description": "same as body.fresh, for GET callers: 1/true"
            },
            "workloads": {
              "type": "string",
              "description": "same as body.workloads, comma-separated, for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "measured_at, fresh, media {available, reason, probe_age_ms, min_renderers, kinds[] {kind, family, renderers_online, required, available, reason}, families[] {id, endpoint, list_price_usd, best_online, servable_kinds, available}, list_price_note}, inference {available, reason, bridge_reachable, models_serving[], requested_model, animica_workers_serving, answer_would_come_from, claim, proof}, inference_workers {available, serving_workers, required, tier, probe_age_ms}, queue_depth {available, reason, positions_we_observed[] {kind, position, miners_online, observed_at}}, chain {available, head_height, head_hash}, workloads[] (only if requested) {workload, ok, reason, detail}, summary {subsystems_measured[], subsystems_dark[], servable_kinds[], media_kinds_servable, inference_servable, anything_servable}, took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/compute/inventory",
          "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "force a live re-probe instead of the short-lived memo (default false). Use it immediately before you commit money to a job."
                },
                "workloads": {
                  "type": "array",
                  "required": false,
                  "description": "up to 8 workloads to get an admission verdict for — inference, image, video, audio, or a media kind such as video_i2v or audio_master"
                }
              },
              "queryParams": {
                "fresh": {
                  "type": "string",
                  "description": "same as body.fresh, for GET callers: 1/true"
                },
                "workloads": {
                  "type": "string",
                  "description": "same as body.workloads, comma-separated, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "measured_at, fresh, media {available, reason, probe_age_ms, min_renderers, kinds[] {kind, family, renderers_online, required, available, reason}, families[] {id, endpoint, list_price_usd, best_online, servable_kinds, available}, list_price_note}, inference {available, reason, bridge_reachable, models_serving[], requested_model, animica_workers_serving, answer_would_come_from, claim, proof}, inference_workers {available, serving_workers, required, tier, probe_age_ms}, queue_depth {available, reason, positions_we_observed[] {kind, position, miners_online, observed_at}}, chain {available, head_height, head_hash}, workloads[] (only if requested) {workload, ok, reason, detail}, summary {subsystems_measured[], subsystems_dark[], servable_kinds[], media_kinds_servable, inference_servable, anything_servable}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/compute/inventory",
          "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "force a live re-probe instead of the short-lived memo (default false). Use it immediately before you commit money to a job."
                },
                "workloads": {
                  "type": "array",
                  "required": false,
                  "description": "up to 8 workloads to get an admission verdict for — inference, image, video, audio, or a media kind such as video_i2v or audio_master"
                }
              },
              "queryParams": {
                "fresh": {
                  "type": "string",
                  "description": "same as body.fresh, for GET callers: 1/true"
                },
                "workloads": {
                  "type": "string",
                  "description": "same as body.workloads, comma-separated, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "measured_at, fresh, media {available, reason, probe_age_ms, min_renderers, kinds[] {kind, family, renderers_online, required, available, reason}, families[] {id, endpoint, list_price_usd, best_online, servable_kinds, available}, list_price_note}, inference {available, reason, bridge_reachable, models_serving[], requested_model, animica_workers_serving, answer_would_come_from, claim, proof}, inference_workers {available, serving_workers, required, tier, probe_age_ms}, queue_depth {available, reason, positions_we_observed[] {kind, position, miners_online, observed_at}}, chain {available, head_height, head_hash}, workloads[] (only if requested) {workload, ok, reason, detail}, summary {subsystems_measured[], subsystems_dark[], servable_kinds[], media_kinds_servable, inference_servable, anything_servable}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "compute_quote",
      "name": "Compute quote",
      "path": "/x402/compute/quote",
      "method": "POST",
      "url": "https://animica.dev/x402/compute/quote",
      "documentation": "https://animica.dev/x402#product-compute_quote",
      "price": "0.006843",
      "price_atomic": "6843",
      "currency": "USDC",
      "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
      "available": true,
      "endpoints": [
        "POST /x402/compute/quote",
        "GET /x402/compute/quote"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "kind": {
              "type": "string",
              "required": true,
              "description": "workload to quote: inference, image, video, audio, or a canonical media kind such as video_i2v or audio_master"
            },
            "prompt": {
              "type": "string",
              "required": false,
              "description": "the prompt you intend to submit; checked for acceptance and copied into the example body, never sent anywhere"
            },
            "params": {
              "type": "object",
              "required": false,
              "description": "render params you intend to submit; shape-checked only"
            },
            "upload_ids": {
              "type": "array",
              "required": false,
              "description": "upload ids for the upload-driven media kinds"
            },
            "quantity": {
              "type": "integer",
              "required": false,
              "description": "how many of this job you intend to buy, 1..1000 (default 1)"
            }
          },
          "queryParams": {
            "kind": {
              "type": "string",
              "description": "same as body.kind, for GET callers"
            },
            "quantity": {
              "type": "integer",
              "description": "same as body.quantity"
            },
            "prompt": {
              "type": "string",
              "description": "same as body.prompt"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "workload {requested, type, kind, family, servable}, price {unit_usd, unit_atomic, quantity, total_atomic, asset, decimals, network, source, basis}, capacity — for media {renderers_online, required, probe_age_ms, counted}, for inference {requested_model, animica_workers_serving, serving_workers, required, tier, probe_age_ms, worker_count_unavailable_reason, network, proof}, queue {expected_position, available, reason, renderers_online, observed_on_our_own_submissions[] (position only — job handles are withheld)}, latency {samples, basis, basis_is_requested_kind, queue_ms, exec_ms} (false there means the samples are the family bucket, not this kind), execute {product_id, method, path, url, body, notes[]}, payload_check {ok, problems[]}, guarantees {reserves_capacity:false, locks_price:false}, observed_at {iso, head_height, head_hash}, provenance {deterministic:false, model_free:true, sources[]}. Every figure is read from the single observation stamped in observed_at."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/compute/quote",
          "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": true,
                  "description": "workload to quote: inference, image, video, audio, or a canonical media kind such as video_i2v or audio_master"
                },
                "prompt": {
                  "type": "string",
                  "required": false,
                  "description": "the prompt you intend to submit; checked for acceptance and copied into the example body, never sent anywhere"
                },
                "params": {
                  "type": "object",
                  "required": false,
                  "description": "render params you intend to submit; shape-checked only"
                },
                "upload_ids": {
                  "type": "array",
                  "required": false,
                  "description": "upload ids for the upload-driven media kinds"
                },
                "quantity": {
                  "type": "integer",
                  "required": false,
                  "description": "how many of this job you intend to buy, 1..1000 (default 1)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "quantity": {
                  "type": "integer",
                  "description": "same as body.quantity"
                },
                "prompt": {
                  "type": "string",
                  "description": "same as body.prompt"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "workload {requested, type, kind, family, servable}, price {unit_usd, unit_atomic, quantity, total_atomic, asset, decimals, network, source, basis}, capacity — for media {renderers_online, required, probe_age_ms, counted}, for inference {requested_model, animica_workers_serving, serving_workers, required, tier, probe_age_ms, worker_count_unavailable_reason, network, proof}, queue {expected_position, available, reason, renderers_online, observed_on_our_own_submissions[] (position only — job handles are withheld)}, latency {samples, basis, basis_is_requested_kind, queue_ms, exec_ms} (false there means the samples are the family bucket, not this kind), execute {product_id, method, path, url, body, notes[]}, payload_check {ok, problems[]}, guarantees {reserves_capacity:false, locks_price:false}, observed_at {iso, head_height, head_hash}, provenance {deterministic:false, model_free:true, sources[]}. Every figure is read from the single observation stamped in observed_at."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/compute/quote",
          "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": true,
                  "description": "workload to quote: inference, image, video, audio, or a canonical media kind such as video_i2v or audio_master"
                },
                "prompt": {
                  "type": "string",
                  "required": false,
                  "description": "the prompt you intend to submit; checked for acceptance and copied into the example body, never sent anywhere"
                },
                "params": {
                  "type": "object",
                  "required": false,
                  "description": "render params you intend to submit; shape-checked only"
                },
                "upload_ids": {
                  "type": "array",
                  "required": false,
                  "description": "upload ids for the upload-driven media kinds"
                },
                "quantity": {
                  "type": "integer",
                  "required": false,
                  "description": "how many of this job you intend to buy, 1..1000 (default 1)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "quantity": {
                  "type": "integer",
                  "description": "same as body.quantity"
                },
                "prompt": {
                  "type": "string",
                  "description": "same as body.prompt"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "workload {requested, type, kind, family, servable}, price {unit_usd, unit_atomic, quantity, total_atomic, asset, decimals, network, source, basis}, capacity — for media {renderers_online, required, probe_age_ms, counted}, for inference {requested_model, animica_workers_serving, serving_workers, required, tier, probe_age_ms, worker_count_unavailable_reason, network, proof}, queue {expected_position, available, reason, renderers_online, observed_on_our_own_submissions[] (position only — job handles are withheld)}, latency {samples, basis, basis_is_requested_kind, queue_ms, exec_ms} (false there means the samples are the family bucket, not this kind), execute {product_id, method, path, url, body, notes[]}, payload_check {ok, problems[]}, guarantees {reserves_capacity:false, locks_price:false}, observed_at {iso, head_height, head_hash}, provenance {deterministic:false, model_free:true, sources[]}. Every figure is read from the single observation stamped in observed_at."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mining_jobs",
      "name": "Miner job feed",
      "path": "/x402/mining/jobs",
      "method": "POST",
      "url": "https://animica.dev/x402/mining/jobs",
      "documentation": "https://animica.dev/x402#product-mining_jobs",
      "price": "0.005703",
      "price_atomic": "5703",
      "currency": "USDC",
      "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
      "available": true,
      "endpoints": [
        "POST /x402/mining/jobs",
        "GET /x402/mining/jobs"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/mining/jobs/open",
          "url": "https://animica.dev/x402/mining/jobs/open",
          "price": "0",
          "description": "FREE: media kinds with no renderer online right now, and how to enrol. No payment, ever."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "kind": {
              "type": "string",
              "required": false,
              "description": "restrict the render matrix to one media kind, e.g. video_t2v or audio_master. Filters the render lane only, so it cannot be combined with lane=proof_of_work or lane=inference_serving"
            },
            "lane": {
              "type": "string",
              "required": false,
              "description": "one of render, proof_of_work, inference_serving (default: all three)"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "sign the snapshot with ML-DSA-65 (FIPS 204, scheme 4099)"
            }
          },
          "queryParams": {
            "kind": {
              "type": "string",
              "description": "same as body.kind, for GET callers"
            },
            "lane": {
              "type": "string",
              "description": "same as body.lane, for GET callers"
            },
            "attest": {
              "type": "string",
              "description": "same as body.attest (\"1\"/\"true\"), for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "feed, generated_at, snapshot_age_ms, summary {kinds_reported, kinds_servable_now, kinds_with_no_renderer, max_renderers_for_any_kind, work_queued_now}, lanes {render {kinds[] {kind, family, renderers_online, servable_now, supply_gap, requirements {cuda, min_vram_gb, min_vram_source, needs, env_override}, sold_by_this_gateway_at}}, proof_of_work {difficulty, theta_micro, network_hashrate, mempool, work_queued_now}, inference_serving {observable, models_serving, serving_workers}}, demand {render_queue_depth, paid_render_jobs_from_this_gateway, proof_of_work_backlog}, enroll {render, proof_of_work, inference_serving}, hardware_source, attestation (when requested)"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/jobs",
          "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": false,
                  "description": "restrict the render matrix to one media kind, e.g. video_t2v or audio_master. Filters the render lane only, so it cannot be combined with lane=proof_of_work or lane=inference_serving"
                },
                "lane": {
                  "type": "string",
                  "required": false,
                  "description": "one of render, proof_of_work, inference_serving (default: all three)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the snapshot with ML-DSA-65 (FIPS 204, scheme 4099)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "lane": {
                  "type": "string",
                  "description": "same as body.lane, for GET callers"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest (\"1\"/\"true\"), for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "feed, generated_at, snapshot_age_ms, summary {kinds_reported, kinds_servable_now, kinds_with_no_renderer, max_renderers_for_any_kind, work_queued_now}, lanes {render {kinds[] {kind, family, renderers_online, servable_now, supply_gap, requirements {cuda, min_vram_gb, min_vram_source, needs, env_override}, sold_by_this_gateway_at}}, proof_of_work {difficulty, theta_micro, network_hashrate, mempool, work_queued_now}, inference_serving {observable, models_serving, serving_workers}}, demand {render_queue_depth, paid_render_jobs_from_this_gateway, proof_of_work_backlog}, enroll {render, proof_of_work, inference_serving}, hardware_source, attestation (when requested)"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/jobs",
          "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": false,
                  "description": "restrict the render matrix to one media kind, e.g. video_t2v or audio_master. Filters the render lane only, so it cannot be combined with lane=proof_of_work or lane=inference_serving"
                },
                "lane": {
                  "type": "string",
                  "required": false,
                  "description": "one of render, proof_of_work, inference_serving (default: all three)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the snapshot with ML-DSA-65 (FIPS 204, scheme 4099)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "lane": {
                  "type": "string",
                  "description": "same as body.lane, for GET callers"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest (\"1\"/\"true\"), for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "feed, generated_at, snapshot_age_ms, summary {kinds_reported, kinds_servable_now, kinds_with_no_renderer, max_renderers_for_any_kind, work_queued_now}, lanes {render {kinds[] {kind, family, renderers_online, servable_now, supply_gap, requirements {cuda, min_vram_gb, min_vram_source, needs, env_override}, sold_by_this_gateway_at}}, proof_of_work {difficulty, theta_micro, network_hashrate, mempool, work_queued_now}, inference_serving {observable, models_serving, serving_workers}}, demand {render_queue_depth, paid_render_jobs_from_this_gateway, proof_of_work_backlog}, enroll {render, proof_of_work, inference_serving}, hardware_source, attestation (when requested)"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mining_opportunity",
      "name": "GPU opportunity router (Animica)",
      "path": "/x402/mining/opportunity",
      "method": "POST",
      "url": "https://animica.dev/x402/mining/opportunity",
      "documentation": "https://animica.dev/x402#product-mining_opportunity",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
      "available": true,
      "endpoints": [
        "POST /x402/mining/opportunity",
        "GET /x402/mining/opportunity"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "gpu_model": {
              "type": "string",
              "required": false,
              "description": "free text, e.g. \"RTX 4090\", \"RX 7900 XTX\", \"M3 Max\", \"16-core CPU\". Required unless hashrate_mhs is given."
            },
            "hashrate_mhs": {
              "type": "number",
              "required": false,
              "description": "YOUR measured SHA3-256 rate in MH/s per unit. Overrides the table and is never derated — pass this if you have benchmarked."
            },
            "vram_gb": {
              "type": "number",
              "required": false,
              "description": "VRAM per unit. Gates which render families are offered; omit to skip the gate entirely."
            },
            "count": {
              "type": "integer",
              "required": false,
              "description": "how many identical units, 1..4096 (default 1)"
            },
            "power_w": {
              "type": "number",
              "required": false,
              "description": "whole-device draw per unit in watts while working. Defaults to the table value for a matched model; without it no NET figure is produced."
            },
            "electricity_usd_kwh": {
              "type": "number",
              "required": false,
              "description": "your electricity price in USD per kWh (default 0.15, reported as an assumption)"
            },
            "serving_claimants": {
              "type": "integer",
              "required": false,
              "description": "how many machines you assume claim the service carve; only scales the stated carve CEILING (default 1)"
            },
            "already_mining": {
              "type": "boolean",
              "required": false,
              "description": "true if this hardware is ALREADY mining Animica, so it is inside the measured network rate and must not be added to the denominator twice (default false)"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "return an ML-DSA-65 attestation binding this answer to the chain height (default false)"
            }
          },
          "queryParams": {
            "gpu_model": {
              "type": "string",
              "description": "same as body.gpu_model, for GET callers"
            },
            "vram_gb": {
              "type": "number",
              "description": "same as body.vram_gb"
            },
            "count": {
              "type": "integer",
              "description": "same as body.count"
            },
            "power_w": {
              "type": "number",
              "description": "same as body.power_w"
            },
            "electricity_usd_kwh": {
              "type": "number",
              "description": "same as body.electricity_usd_kwh"
            },
            "hashrate_mhs": {
              "type": "number",
              "description": "same as body.hashrate_mhs"
            },
            "serving_claimants": {
              "type": "integer",
              "description": "same as body.serving_claimants"
            },
            "already_mining": {
              "type": "boolean",
              "description": "same as body.already_mining — pass already_mining=1"
            },
            "attest": {
              "type": "boolean",
              "description": "same as body.attest — pass attest=1"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "recommendation {workload, title, tier, why, comparison_limit}; workloads[] {workload, title, eligible, ineligible_reason, tier} each carrying either mining {share_of_network, share_pct, share_basis, share_clamped?, blocks_per_day, blocks_per_day_capped, anm_per_day, nanm_per_day, usd_per_day_gross, power_usd_per_day, usd_per_day_net, usd_unavailable_reason, break_even_electricity_usd_kwh, marginal_one_more_unit {extra_anm_per_day, extra_usd_per_day_net, worth_it}, fees_excluded} or capacity {kinds, renderers_online_by_kind, best_online, min_renderers_required, unserved_kinds, unserved_count, below_floor_kinds, servable_kinds_today, probe_age_ms, vram_floor_gb, vram_verdict} + revenue {available:false, reason}; machine {gpu_model_as_given, resolved_device, device_class, count, sha3_mhs_per_unit, sha3_mhs_total, provenance (measured|extrapolated|hashcat|modeled|caller_supplied), source, kernel_efficiency_applied, power_w_per_unit, power_w_total, power_w_assumed, power_w_source, vram_gb}; network {hashshare_per_second, difficulty, theta_micro, trials_per_second, trials_per_second_from_difficulty, derivation_spread_ratio, derivations_are_not_independent, denominator_used, network_mhs, observed_seconds_per_block, observed_blocks_per_day, cadence_window, conversion, pooled_transactions}; emission {height, subsidy_anm_per_block, halvings_elapsed, service_carve_active, split_pct, miner_anm_per_block, carve_anm_per_block, network_daily_cap_anm, split_provenance}; price {available, usd_per_anm, side, source, observed_at, age_seconds} or {available:false, reason, detail, consequence}; service_carve {active, ceiling_anm_per_day, ceiling_blocks_per_day_used, assumed_claimants}; capacity_census; inference_workers; excluded_workloads[]; ranking_rule[]; assumptions{}; inference {used:false}; attestation? (ML-DSA-65 envelope); as_of {head_height, head_hash, observed_at}; took_ms; computed_at. ALL ANM and USD figures are decimal STRINGS carried from integer nANM / micro-dollars; the floats are ratios and measurements only."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/opportunity",
          "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "free text, e.g. \"RTX 4090\", \"RX 7900 XTX\", \"M3 Max\", \"16-core CPU\". Required unless hashrate_mhs is given."
                },
                "hashrate_mhs": {
                  "type": "number",
                  "required": false,
                  "description": "YOUR measured SHA3-256 rate in MH/s per unit. Overrides the table and is never derated — pass this if you have benchmarked."
                },
                "vram_gb": {
                  "type": "number",
                  "required": false,
                  "description": "VRAM per unit. Gates which render families are offered; omit to skip the gate entirely."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..4096 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "whole-device draw per unit in watts while working. Defaults to the table value for a matched model; without it no NET figure is produced."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your electricity price in USD per kWh (default 0.15, reported as an assumption)"
                },
                "serving_claimants": {
                  "type": "integer",
                  "required": false,
                  "description": "how many machines you assume claim the service carve; only scales the stated carve CEILING (default 1)"
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY mining Animica, so it is inside the measured network rate and must not be added to the denominator twice (default false)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this answer to the chain height (default false)"
                }
              },
              "queryParams": {
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model, for GET callers"
                },
                "vram_gb": {
                  "type": "number",
                  "description": "same as body.vram_gb"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "hashrate_mhs": {
                  "type": "number",
                  "description": "same as body.hashrate_mhs"
                },
                "serving_claimants": {
                  "type": "integer",
                  "description": "same as body.serving_claimants"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining — pass already_mining=1"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {workload, title, tier, why, comparison_limit}; workloads[] {workload, title, eligible, ineligible_reason, tier} each carrying either mining {share_of_network, share_pct, share_basis, share_clamped?, blocks_per_day, blocks_per_day_capped, anm_per_day, nanm_per_day, usd_per_day_gross, power_usd_per_day, usd_per_day_net, usd_unavailable_reason, break_even_electricity_usd_kwh, marginal_one_more_unit {extra_anm_per_day, extra_usd_per_day_net, worth_it}, fees_excluded} or capacity {kinds, renderers_online_by_kind, best_online, min_renderers_required, unserved_kinds, unserved_count, below_floor_kinds, servable_kinds_today, probe_age_ms, vram_floor_gb, vram_verdict} + revenue {available:false, reason}; machine {gpu_model_as_given, resolved_device, device_class, count, sha3_mhs_per_unit, sha3_mhs_total, provenance (measured|extrapolated|hashcat|modeled|caller_supplied), source, kernel_efficiency_applied, power_w_per_unit, power_w_total, power_w_assumed, power_w_source, vram_gb}; network {hashshare_per_second, difficulty, theta_micro, trials_per_second, trials_per_second_from_difficulty, derivation_spread_ratio, derivations_are_not_independent, denominator_used, network_mhs, observed_seconds_per_block, observed_blocks_per_day, cadence_window, conversion, pooled_transactions}; emission {height, subsidy_anm_per_block, halvings_elapsed, service_carve_active, split_pct, miner_anm_per_block, carve_anm_per_block, network_daily_cap_anm, split_provenance}; price {available, usd_per_anm, side, source, observed_at, age_seconds} or {available:false, reason, detail, consequence}; service_carve {active, ceiling_anm_per_day, ceiling_blocks_per_day_used, assumed_claimants}; capacity_census; inference_workers; excluded_workloads[]; ranking_rule[]; assumptions{}; inference {used:false}; attestation? (ML-DSA-65 envelope); as_of {head_height, head_hash, observed_at}; took_ms; computed_at. ALL ANM and USD figures are decimal STRINGS carried from integer nANM / micro-dollars; the floats are ratios and measurements only."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/opportunity",
          "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "free text, e.g. \"RTX 4090\", \"RX 7900 XTX\", \"M3 Max\", \"16-core CPU\". Required unless hashrate_mhs is given."
                },
                "hashrate_mhs": {
                  "type": "number",
                  "required": false,
                  "description": "YOUR measured SHA3-256 rate in MH/s per unit. Overrides the table and is never derated — pass this if you have benchmarked."
                },
                "vram_gb": {
                  "type": "number",
                  "required": false,
                  "description": "VRAM per unit. Gates which render families are offered; omit to skip the gate entirely."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..4096 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "whole-device draw per unit in watts while working. Defaults to the table value for a matched model; without it no NET figure is produced."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your electricity price in USD per kWh (default 0.15, reported as an assumption)"
                },
                "serving_claimants": {
                  "type": "integer",
                  "required": false,
                  "description": "how many machines you assume claim the service carve; only scales the stated carve CEILING (default 1)"
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY mining Animica, so it is inside the measured network rate and must not be added to the denominator twice (default false)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this answer to the chain height (default false)"
                }
              },
              "queryParams": {
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model, for GET callers"
                },
                "vram_gb": {
                  "type": "number",
                  "description": "same as body.vram_gb"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "hashrate_mhs": {
                  "type": "number",
                  "description": "same as body.hashrate_mhs"
                },
                "serving_claimants": {
                  "type": "integer",
                  "description": "same as body.serving_claimants"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining — pass already_mining=1"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {workload, title, tier, why, comparison_limit}; workloads[] {workload, title, eligible, ineligible_reason, tier} each carrying either mining {share_of_network, share_pct, share_basis, share_clamped?, blocks_per_day, blocks_per_day_capped, anm_per_day, nanm_per_day, usd_per_day_gross, power_usd_per_day, usd_per_day_net, usd_unavailable_reason, break_even_electricity_usd_kwh, marginal_one_more_unit {extra_anm_per_day, extra_usd_per_day_net, worth_it}, fees_excluded} or capacity {kinds, renderers_online_by_kind, best_online, min_renderers_required, unserved_kinds, unserved_count, below_floor_kinds, servable_kinds_today, probe_age_ms, vram_floor_gb, vram_verdict} + revenue {available:false, reason}; machine {gpu_model_as_given, resolved_device, device_class, count, sha3_mhs_per_unit, sha3_mhs_total, provenance (measured|extrapolated|hashcat|modeled|caller_supplied), source, kernel_efficiency_applied, power_w_per_unit, power_w_total, power_w_assumed, power_w_source, vram_gb}; network {hashshare_per_second, difficulty, theta_micro, trials_per_second, trials_per_second_from_difficulty, derivation_spread_ratio, derivations_are_not_independent, denominator_used, network_mhs, observed_seconds_per_block, observed_blocks_per_day, cadence_window, conversion, pooled_transactions}; emission {height, subsidy_anm_per_block, halvings_elapsed, service_carve_active, split_pct, miner_anm_per_block, carve_anm_per_block, network_daily_cap_anm, split_provenance}; price {available, usd_per_anm, side, source, observed_at, age_seconds} or {available:false, reason, detail, consequence}; service_carve {active, ceiling_anm_per_day, ceiling_blocks_per_day_used, assumed_claimants}; capacity_census; inference_workers; excluded_workloads[]; ranking_rule[]; assumptions{}; inference {used:false}; attestation? (ML-DSA-65 envelope); as_of {head_height, head_hash, observed_at}; took_ms; computed_at. ALL ANM and USD figures are decimal STRINGS carried from integer nANM / micro-dollars; the floats are ratios and measurements only."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mining_profit",
      "name": "Animica mining profit, computed at a chain height",
      "path": "/x402/mining/profit",
      "method": "POST",
      "url": "https://animica.dev/x402/mining/profit",
      "documentation": "https://animica.dev/x402#product-mining_profit",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
      "available": true,
      "endpoints": [
        "POST /x402/mining/profit",
        "GET /x402/mining/profit"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "hashrate_hps": {
              "type": "number",
              "required": true,
              "description": "raw trials per second PER UNIT, as your Animica miner reports it for this chain. Not a SHA-256 or ethash figure from another coin, and not HShare/s."
            },
            "gpu_model": {
              "type": "string",
              "required": false,
              "description": "a LABEL returned unchanged for your records. No hashrate is looked up from it — we hold no hardware table and will not invent one."
            },
            "count": {
              "type": "integer",
              "required": false,
              "description": "how many identical units, 1..100000 (default 1)"
            },
            "power_w": {
              "type": "number",
              "required": false,
              "description": "wall watts PER UNIT. Omit and the electricity and net lines come back null rather than as a fabricated zero."
            },
            "electricity_usd_kwh": {
              "type": "number",
              "required": false,
              "description": "your tariff in USD per kWh. Omit and the electricity and net lines come back null."
            },
            "pool_fee_pct": {
              "type": "number",
              "required": false,
              "description": "pool fee you pay, 0..50 (default 0 = solo). Your assumption, not a measured value."
            },
            "already_mining": {
              "type": "boolean",
              "required": false,
              "description": "true if this hardware is ALREADY inside the measured network hashrate, so it is not added to the denominator twice (default false)"
            }
          },
          "queryParams": {
            "hashrate_hps": {
              "type": "number",
              "description": "same as body.hashrate_hps, for GET callers"
            },
            "gpu_model": {
              "type": "string",
              "description": "same as body.gpu_model"
            },
            "count": {
              "type": "integer",
              "description": "same as body.count"
            },
            "power_w": {
              "type": "number",
              "description": "same as body.power_w"
            },
            "electricity_usd_kwh": {
              "type": "number",
              "description": "same as body.electricity_usd_kwh"
            },
            "pool_fee_pct": {
              "type": "number",
              "description": "same as body.pool_fee_pct"
            },
            "already_mining": {
              "type": "boolean",
              "description": "same as body.already_mining"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {chain_height, chain_head_hash, template_height, computed_at}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, total_emission_usd_day, node_hashrate}; price {usd_per_anm, side, source, observed_at, age_seconds}; your_share {trials_per_second, denominator_trials_per_second, basis, pct}; estimate {anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d}; at_target_interval; dilution {existing_miners_revenue_change_pct, doubling_multiplier}; break_even {electricity_usd_kwh, anm_price_usd}; verdict; method; caveats; inference {used:false}. Every *_usd* and *_anm* value is a decimal STRING — USD at twelve decimals, ANM at nine — because a miner's daily revenue on this chain is smaller than the micro-dollar grid the rest of the gateway settles in and would otherwise render as a zero."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/profit",
          "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hashrate_hps": {
                  "type": "number",
                  "required": true,
                  "description": "raw trials per second PER UNIT, as your Animica miner reports it for this chain. Not a SHA-256 or ethash figure from another coin, and not HShare/s."
                },
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "a LABEL returned unchanged for your records. No hashrate is looked up from it — we hold no hardware table and will not invent one."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..100000 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "wall watts PER UNIT. Omit and the electricity and net lines come back null rather than as a fabricated zero."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh. Omit and the electricity and net lines come back null."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you pay, 0..50 (default 0 = solo). Your assumption, not a measured value."
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY inside the measured network hashrate, so it is not added to the denominator twice (default false)"
                }
              },
              "queryParams": {
                "hashrate_hps": {
                  "type": "number",
                  "description": "same as body.hashrate_hps, for GET callers"
                },
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, template_height, computed_at}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, total_emission_usd_day, node_hashrate}; price {usd_per_anm, side, source, observed_at, age_seconds}; your_share {trials_per_second, denominator_trials_per_second, basis, pct}; estimate {anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d}; at_target_interval; dilution {existing_miners_revenue_change_pct, doubling_multiplier}; break_even {electricity_usd_kwh, anm_price_usd}; verdict; method; caveats; inference {used:false}. Every *_usd* and *_anm* value is a decimal STRING — USD at twelve decimals, ANM at nine — because a miner's daily revenue on this chain is smaller than the micro-dollar grid the rest of the gateway settles in and would otherwise render as a zero."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/profit",
          "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hashrate_hps": {
                  "type": "number",
                  "required": true,
                  "description": "raw trials per second PER UNIT, as your Animica miner reports it for this chain. Not a SHA-256 or ethash figure from another coin, and not HShare/s."
                },
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "a LABEL returned unchanged for your records. No hashrate is looked up from it — we hold no hardware table and will not invent one."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..100000 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "wall watts PER UNIT. Omit and the electricity and net lines come back null rather than as a fabricated zero."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh. Omit and the electricity and net lines come back null."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you pay, 0..50 (default 0 = solo). Your assumption, not a measured value."
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY inside the measured network hashrate, so it is not added to the denominator twice (default false)"
                }
              },
              "queryParams": {
                "hashrate_hps": {
                  "type": "number",
                  "description": "same as body.hashrate_hps, for GET callers"
                },
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, template_height, computed_at}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, total_emission_usd_day, node_hashrate}; price {usd_per_anm, side, source, observed_at, age_seconds}; your_share {trials_per_second, denominator_trials_per_second, basis, pct}; estimate {anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d}; at_target_interval; dilution {existing_miners_revenue_change_pct, doubling_multiplier}; break_even {electricity_usd_kwh, anm_price_usd}; verdict; method; caveats; inference {used:false}. Every *_usd* and *_anm* value is a decimal STRING — USD at twelve decimals, ANM at nine — because a miner's daily revenue on this chain is smaller than the micro-dollar grid the rest of the gateway settles in and would otherwise render as a zero."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mining_breakeven",
      "name": "Animica mining break-even",
      "path": "/x402/mining/breakeven",
      "method": "POST",
      "url": "https://animica.dev/x402/mining/breakeven",
      "documentation": "https://animica.dev/x402#product-mining_breakeven",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
      "available": true,
      "endpoints": [
        "POST /x402/mining/breakeven",
        "GET /x402/mining/breakeven"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "hardware_cost_usd": {
              "type": "number",
              "required": true,
              "description": "up-front cost of the rig in USD; 0 for hardware you already own"
            },
            "power_watts": {
              "type": "number",
              "required": true,
              "description": "draw at the wall for the whole rig, in watts"
            },
            "electricity_usd_per_kwh": {
              "type": "number",
              "required": true,
              "description": "what you pay per kWh, in USD"
            },
            "payout_address": {
              "type": "string",
              "required": false,
              "description": "anim1… address or 32-byte hex digest — your share is MEASURED from the blocks it produced. Supply exactly one of payout_address, hashrate_hs or network_share_percent"
            },
            "hashrate_hs": {
              "type": "number",
              "required": false,
              "description": "the rig's sha3-256 rate in HASHES per second (5e9 for a 5 GH/s card). Modelled as hardware being ADDED to the network"
            },
            "network_share_percent": {
              "type": "number",
              "required": false,
              "description": "your share of block production as a percentage, if you already know it"
            },
            "window_blocks": {
              "type": "integer",
              "required": false,
              "description": "blocks to measure a payout_address over, 20..500 (default 200)"
            },
            "pool_fee_percent": {
              "type": "number",
              "required": false,
              "description": "fee your pool takes off mined ANM (default 0)"
            },
            "uptime_percent": {
              "type": "number",
              "required": false,
              "description": "share of the day the rig runs; applied to both revenue and power (default 100)"
            },
            "other_costs_usd_per_month": {
              "type": "number",
              "required": false,
              "description": "hosting, cooling, bandwidth — anything recurring that is not power (default 0)"
            },
            "horizons_days": {
              "type": "array",
              "required": false,
              "description": "up to 6 day counts to solve the required ANM price at (default 30,90,180,365)"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "attach an ML-DSA-65 signature over the measured facts and the verdict"
            }
          },
          "queryParams": {
            "hardware_cost_usd": {
              "type": "number",
              "description": "same as the body field, for GET callers"
            },
            "power_watts": {
              "type": "number",
              "description": "same as the body field"
            },
            "electricity_usd_per_kwh": {
              "type": "number",
              "description": "same as the body field"
            },
            "hashrate_hs": {
              "type": "number",
              "description": "same as the body field"
            },
            "payout_address": {
              "type": "string",
              "description": "same as the body field"
            },
            "horizons_days": {
              "type": "string",
              "description": "comma-separated day counts"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "breaks_even, breakeven_days, breakeven_date, verdict, economics {revenue_usd_per_day, electricity_usd_per_day, other_costs_usd_per_day, net_usd_per_day, net_usd_per_month, anm_per_day, expected_blocks_per_day, expected_days_between_blocks}, price_required {current_usd_per_anm, to_cover_running_costs_usd_per_anm, at_horizon[] {days, usd_per_anm, multiple_of_current}}, sensitivity {max_electricity_usd_per_kwh[]}, production {model, share_of_network_percent, source}, chain {head_height, miner_reward_anm_per_block, schedule_says_anm_per_block, observed_seconds_per_block, observed_blocks_per_day, network_ceiling_*, next_subsidy_halving}, assumptions[] {name, value, source}, caveats[], sources{}, attestation?, as_of"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/breakeven",
          "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hardware_cost_usd": {
                  "type": "number",
                  "required": true,
                  "description": "up-front cost of the rig in USD; 0 for hardware you already own"
                },
                "power_watts": {
                  "type": "number",
                  "required": true,
                  "description": "draw at the wall for the whole rig, in watts"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "required": true,
                  "description": "what you pay per kWh, in USD"
                },
                "payout_address": {
                  "type": "string",
                  "required": false,
                  "description": "anim1… address or 32-byte hex digest — your share is MEASURED from the blocks it produced. Supply exactly one of payout_address, hashrate_hs or network_share_percent"
                },
                "hashrate_hs": {
                  "type": "number",
                  "required": false,
                  "description": "the rig's sha3-256 rate in HASHES per second (5e9 for a 5 GH/s card). Modelled as hardware being ADDED to the network"
                },
                "network_share_percent": {
                  "type": "number",
                  "required": false,
                  "description": "your share of block production as a percentage, if you already know it"
                },
                "window_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "blocks to measure a payout_address over, 20..500 (default 200)"
                },
                "pool_fee_percent": {
                  "type": "number",
                  "required": false,
                  "description": "fee your pool takes off mined ANM (default 0)"
                },
                "uptime_percent": {
                  "type": "number",
                  "required": false,
                  "description": "share of the day the rig runs; applied to both revenue and power (default 100)"
                },
                "other_costs_usd_per_month": {
                  "type": "number",
                  "required": false,
                  "description": "hosting, cooling, bandwidth — anything recurring that is not power (default 0)"
                },
                "horizons_days": {
                  "type": "array",
                  "required": false,
                  "description": "up to 6 day counts to solve the required ANM price at (default 30,90,180,365)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "attach an ML-DSA-65 signature over the measured facts and the verdict"
                }
              },
              "queryParams": {
                "hardware_cost_usd": {
                  "type": "number",
                  "description": "same as the body field, for GET callers"
                },
                "power_watts": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "hashrate_hs": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "payout_address": {
                  "type": "string",
                  "description": "same as the body field"
                },
                "horizons_days": {
                  "type": "string",
                  "description": "comma-separated day counts"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "breaks_even, breakeven_days, breakeven_date, verdict, economics {revenue_usd_per_day, electricity_usd_per_day, other_costs_usd_per_day, net_usd_per_day, net_usd_per_month, anm_per_day, expected_blocks_per_day, expected_days_between_blocks}, price_required {current_usd_per_anm, to_cover_running_costs_usd_per_anm, at_horizon[] {days, usd_per_anm, multiple_of_current}}, sensitivity {max_electricity_usd_per_kwh[]}, production {model, share_of_network_percent, source}, chain {head_height, miner_reward_anm_per_block, schedule_says_anm_per_block, observed_seconds_per_block, observed_blocks_per_day, network_ceiling_*, next_subsidy_halving}, assumptions[] {name, value, source}, caveats[], sources{}, attestation?, as_of"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/breakeven",
          "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hardware_cost_usd": {
                  "type": "number",
                  "required": true,
                  "description": "up-front cost of the rig in USD; 0 for hardware you already own"
                },
                "power_watts": {
                  "type": "number",
                  "required": true,
                  "description": "draw at the wall for the whole rig, in watts"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "required": true,
                  "description": "what you pay per kWh, in USD"
                },
                "payout_address": {
                  "type": "string",
                  "required": false,
                  "description": "anim1… address or 32-byte hex digest — your share is MEASURED from the blocks it produced. Supply exactly one of payout_address, hashrate_hs or network_share_percent"
                },
                "hashrate_hs": {
                  "type": "number",
                  "required": false,
                  "description": "the rig's sha3-256 rate in HASHES per second (5e9 for a 5 GH/s card). Modelled as hardware being ADDED to the network"
                },
                "network_share_percent": {
                  "type": "number",
                  "required": false,
                  "description": "your share of block production as a percentage, if you already know it"
                },
                "window_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "blocks to measure a payout_address over, 20..500 (default 200)"
                },
                "pool_fee_percent": {
                  "type": "number",
                  "required": false,
                  "description": "fee your pool takes off mined ANM (default 0)"
                },
                "uptime_percent": {
                  "type": "number",
                  "required": false,
                  "description": "share of the day the rig runs; applied to both revenue and power (default 100)"
                },
                "other_costs_usd_per_month": {
                  "type": "number",
                  "required": false,
                  "description": "hosting, cooling, bandwidth — anything recurring that is not power (default 0)"
                },
                "horizons_days": {
                  "type": "array",
                  "required": false,
                  "description": "up to 6 day counts to solve the required ANM price at (default 30,90,180,365)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "attach an ML-DSA-65 signature over the measured facts and the verdict"
                }
              },
              "queryParams": {
                "hardware_cost_usd": {
                  "type": "number",
                  "description": "same as the body field, for GET callers"
                },
                "power_watts": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "hashrate_hs": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "payout_address": {
                  "type": "string",
                  "description": "same as the body field"
                },
                "horizons_days": {
                  "type": "string",
                  "description": "comma-separated day counts"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "breaks_even, breakeven_days, breakeven_date, verdict, economics {revenue_usd_per_day, electricity_usd_per_day, other_costs_usd_per_day, net_usd_per_day, net_usd_per_month, anm_per_day, expected_blocks_per_day, expected_days_between_blocks}, price_required {current_usd_per_anm, to_cover_running_costs_usd_per_anm, at_horizon[] {days, usd_per_anm, multiple_of_current}}, sensitivity {max_electricity_usd_per_kwh[]}, production {model, share_of_network_percent, source}, chain {head_height, miner_reward_anm_per_block, schedule_says_anm_per_block, observed_seconds_per_block, observed_blocks_per_day, network_ceiling_*, next_subsidy_halving}, assumptions[] {name, value, source}, caveats[], sources{}, attestation?, as_of"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "mining_compare",
      "name": "Animica rig comparison (mine or render)",
      "path": "/x402/mining/compare",
      "method": "POST",
      "url": "https://animica.dev/x402/mining/compare",
      "documentation": "https://animica.dev/x402#product-mining_compare",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/mining/compare",
        "GET /x402/mining/compare"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "rigs": {
              "type": "array",
              "required": true,
              "description": "1..12 candidate rigs. Each entry is an object: gpu_model (string LABEL, returned unchanged — no hashrate, wattage or VRAM is looked up from it, this product holds no hardware table), hashrate_hps (number, REQUIRED — raw trials per second per unit as YOUR Animica miner reports them for this chain, not a SHA-256/ethash benchmark and not HShare/s), power_w (number, wall watts per unit — omit and the net/payback lines come back null rather than as a fabricated zero), cost_usd (number, purchase price per unit — omit and payback comes back null), vram_gb (number — omit and the render column reports which kinds it could not confirm), count (integer, identical units, default 1). A bare JSON array body is accepted as the rigs list."
            },
            "electricity_usd_kwh": {
              "type": "number",
              "required": false,
              "description": "your tariff in USD per kWh, shared by every rig. Omit and electricity, net and payback come back null with the reason."
            },
            "pool_fee_pct": {
              "type": "number",
              "required": false,
              "description": "pool fee you would pay, 0..50 (default 0 = solo). YOUR assumption, carried through unchanged."
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "return an ML-DSA-65 attestation binding this ranking to the chain height it was computed at (default false)"
            }
          },
          "queryParams": {
            "rig": {
              "type": "string",
              "description": "repeatable, one per candidate: `gpu_model,hashrate_hps,power_w,cost_usd,vram_gb,count`. Trailing fields and empty slots may be omitted: `RTX4090,120000,450,1600,24`."
            },
            "rigs": {
              "type": "string",
              "description": "the body `rigs` array as a JSON string, for GET callers that would rather send JSON"
            },
            "electricity_usd_kwh": {
              "type": "number",
              "description": "same as body.electricity_usd_kwh"
            },
            "pool_fee_pct": {
              "type": "number",
              "description": "same as body.pool_fee_pct"
            },
            "attest": {
              "type": "boolean",
              "description": "same as body.attest — pass attest=1"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; ranking {basis, basis_reason, order[], winner, margin_over_runner_up_usd_day, profitable_candidates, winner_is_least_loss, verdict, power_dominates_the_ranking, note}; rigs[] each {rank, label, inputs, mining {share_pct, anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d, break_even_electricity_usd_kwh, hashrate_per_watt, capex_usd, payback_days, net_usd_day_per_1000_usd_capex}, render {best_use, servable_kinds, kinds[] with min_vram_gb + renderers_online + clears_vram, no_dollar_figure}}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, node_hashrate}; render_census {probe_age_ms, min_renderers, kinds, families}; vram_floors {source, floors, caveat}; price {usd_per_anm, side, source, observed_at, age_seconds}; method; caveats; inference {used:false}; attestation? (ML-DSA-65 envelope); animica? (provenance receipt); took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/compare",
          "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "rigs": {
                  "type": "array",
                  "required": true,
                  "description": "1..12 candidate rigs. Each entry is an object: gpu_model (string LABEL, returned unchanged — no hashrate, wattage or VRAM is looked up from it, this product holds no hardware table), hashrate_hps (number, REQUIRED — raw trials per second per unit as YOUR Animica miner reports them for this chain, not a SHA-256/ethash benchmark and not HShare/s), power_w (number, wall watts per unit — omit and the net/payback lines come back null rather than as a fabricated zero), cost_usd (number, purchase price per unit — omit and payback comes back null), vram_gb (number — omit and the render column reports which kinds it could not confirm), count (integer, identical units, default 1). A bare JSON array body is accepted as the rigs list."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh, shared by every rig. Omit and electricity, net and payback come back null with the reason."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you would pay, 0..50 (default 0 = solo). YOUR assumption, carried through unchanged."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this ranking to the chain height it was computed at (default false)"
                }
              },
              "queryParams": {
                "rig": {
                  "type": "string",
                  "description": "repeatable, one per candidate: `gpu_model,hashrate_hps,power_w,cost_usd,vram_gb,count`. Trailing fields and empty slots may be omitted: `RTX4090,120000,450,1600,24`."
                },
                "rigs": {
                  "type": "string",
                  "description": "the body `rigs` array as a JSON string, for GET callers that would rather send JSON"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; ranking {basis, basis_reason, order[], winner, margin_over_runner_up_usd_day, profitable_candidates, winner_is_least_loss, verdict, power_dominates_the_ranking, note}; rigs[] each {rank, label, inputs, mining {share_pct, anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d, break_even_electricity_usd_kwh, hashrate_per_watt, capex_usd, payback_days, net_usd_day_per_1000_usd_capex}, render {best_use, servable_kinds, kinds[] with min_vram_gb + renderers_online + clears_vram, no_dollar_figure}}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, node_hashrate}; render_census {probe_age_ms, min_renderers, kinds, families}; vram_floors {source, floors, caveat}; price {usd_per_anm, side, source, observed_at, age_seconds}; method; caveats; inference {used:false}; attestation? (ML-DSA-65 envelope); animica? (provenance receipt); took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/compare",
          "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "rigs": {
                  "type": "array",
                  "required": true,
                  "description": "1..12 candidate rigs. Each entry is an object: gpu_model (string LABEL, returned unchanged — no hashrate, wattage or VRAM is looked up from it, this product holds no hardware table), hashrate_hps (number, REQUIRED — raw trials per second per unit as YOUR Animica miner reports them for this chain, not a SHA-256/ethash benchmark and not HShare/s), power_w (number, wall watts per unit — omit and the net/payback lines come back null rather than as a fabricated zero), cost_usd (number, purchase price per unit — omit and payback comes back null), vram_gb (number — omit and the render column reports which kinds it could not confirm), count (integer, identical units, default 1). A bare JSON array body is accepted as the rigs list."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh, shared by every rig. Omit and electricity, net and payback come back null with the reason."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you would pay, 0..50 (default 0 = solo). YOUR assumption, carried through unchanged."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this ranking to the chain height it was computed at (default false)"
                }
              },
              "queryParams": {
                "rig": {
                  "type": "string",
                  "description": "repeatable, one per candidate: `gpu_model,hashrate_hps,power_w,cost_usd,vram_gb,count`. Trailing fields and empty slots may be omitted: `RTX4090,120000,450,1600,24`."
                },
                "rigs": {
                  "type": "string",
                  "description": "the body `rigs` array as a JSON string, for GET callers that would rather send JSON"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; ranking {basis, basis_reason, order[], winner, margin_over_runner_up_usd_day, profitable_candidates, winner_is_least_loss, verdict, power_dominates_the_ranking, note}; rigs[] each {rank, label, inputs, mining {share_pct, anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d, break_even_electricity_usd_kwh, hashrate_per_watt, capex_usd, payback_days, net_usd_day_per_1000_usd_capex}, render {best_use, servable_kinds, kinds[] with min_vram_gb + renderers_online + clears_vram, no_dollar_figure}}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, node_hashrate}; render_census {probe_age_ms, min_renderers, kinds, families}; vram_floors {source, floors, caveat}; price {usd_per_anm, side, source, observed_at, age_seconds}; method; caveats; inference {used:false}; attestation? (ML-DSA-65 envelope); animica? (provenance receipt); took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "pq_sign",
      "name": "Post-quantum document signature (ML-DSA-65)",
      "path": "/x402/pq/sign",
      "method": "POST",
      "url": "https://animica.dev/x402/pq/sign",
      "documentation": "https://animica.dev/x402#product-pq_sign",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
      "available": true,
      "endpoints": [
        "POST /x402/pq/sign",
        "GET /x402/pq/sign"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "POST /x402/pq/sign/verify",
          "url": "https://animica.dev/x402/pq/sign/verify",
          "price": "0",
          "description": "FREE. Check an ML-DSA-65 envelope issued by /x402/pq/sign and get four SEPARATE facts, because they are four separate facts: valid (the signature checks out under the key carried IN the envelope — anyone can self-sign one, so this alone says nothing about us), issued_by_this_gateway (that key is ours — about the KEY, never an endorsement), is_pq_sign_envelope (the signed kind and commitment type are this product's, not another endpoint's seal over a lookalike object; null when the signature did not check out, because nothing in an unverified blob has been established), and payload_bound (the payload really is what was signed; null when that comparison was never reached). A document digest is reported as a FACT only when all of those hold; otherwise it comes back under unverified_claims and nothing is asserted about it. valid:false is an answer; a verifier we cannot run is a 503, never an accusation of forgery."
        },
        {
          "endpoint": "GET /x402/pq/sign/pubkey",
          "url": "https://animica.dev/x402/pq/sign/pubkey",
          "price": "0",
          "description": "FREE. The ML-DSA-65 (FIPS 204, scheme 4099) public key every /x402/pq/sign envelope is signed with, plus the domain, chain id and prehash needed to verify one offline without calling us at all."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "digest": {
              "type": "string",
              "required": false,
              "description": "64 hex characters — the 32-byte digest of your document. Send this OR payload, never both. Your document never leaves your side."
            },
            "payload": {
              "type": "object",
              "required": false,
              "description": "a JSON value to canonicalise and SHA-256 here instead of sending a digest. Hashed and dropped: never stored, logged or returned."
            },
            "digest_alg": {
              "type": "string",
              "required": false,
              "description": "how YOU computed digest, recorded in the signature as your declaration: sha256, sha3-256, keccak-256, blake2b-256. Omit it and the signature says sha256 with document_digest_alg_source:'assumed_default' — a default, marked as one, never presented as something you stated. With payload it must be omitted or sha256, which is what we run."
            },
            "label": {
              "type": "string",
              "required": false,
              "description": "your own annotation for what this covers, up to 128 printable ASCII characters; signed, and marked in the envelope as the client's claim"
            }
          },
          "queryParams": {
            "digest": {
              "type": "string",
              "description": "same as body.digest, for GET callers"
            },
            "digest_alg": {
              "type": "string",
              "description": "same as body.digest_alg"
            },
            "label": {
              "type": "string",
              "description": "same as body.label"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "alg, scheme_id, scheme, digest, digest_alg, digest_alg_source (client_declared|assumed_default|gateway_computed), digest_source (client|gateway), canonical_bytes, label, signature, public_key, key_id, signed_at, commitment {type, document_digest, document_digest_alg, document_digest_alg_source, digest_source, canonical_bytes, canonicalisation, client_label}, envelope {kind, canonical_form, digest, payload, verification} (the self-contained object to publish or POST back), commitment_digest, commitment_digest_alg, binding, verify {endpoint, url, price}, public_key_endpoint, took_ms, payload_disclosed:false"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/sign",
          "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "64 hex characters — the 32-byte digest of your document. Send this OR payload, never both. Your document never leaves your side."
                },
                "payload": {
                  "type": "object",
                  "required": false,
                  "description": "a JSON value to canonicalise and SHA-256 here instead of sending a digest. Hashed and dropped: never stored, logged or returned."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how YOU computed digest, recorded in the signature as your declaration: sha256, sha3-256, keccak-256, blake2b-256. Omit it and the signature says sha256 with document_digest_alg_source:'assumed_default' — a default, marked as one, never presented as something you stated. With payload it must be omitted or sha256, which is what we run."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your own annotation for what this covers, up to 128 printable ASCII characters; signed, and marked in the envelope as the client's claim"
                }
              },
              "queryParams": {
                "digest": {
                  "type": "string",
                  "description": "same as body.digest, for GET callers"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "alg, scheme_id, scheme, digest, digest_alg, digest_alg_source (client_declared|assumed_default|gateway_computed), digest_source (client|gateway), canonical_bytes, label, signature, public_key, key_id, signed_at, commitment {type, document_digest, document_digest_alg, document_digest_alg_source, digest_source, canonical_bytes, canonicalisation, client_label}, envelope {kind, canonical_form, digest, payload, verification} (the self-contained object to publish or POST back), commitment_digest, commitment_digest_alg, binding, verify {endpoint, url, price}, public_key_endpoint, took_ms, payload_disclosed:false"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/sign",
          "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "64 hex characters — the 32-byte digest of your document. Send this OR payload, never both. Your document never leaves your side."
                },
                "payload": {
                  "type": "object",
                  "required": false,
                  "description": "a JSON value to canonicalise and SHA-256 here instead of sending a digest. Hashed and dropped: never stored, logged or returned."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how YOU computed digest, recorded in the signature as your declaration: sha256, sha3-256, keccak-256, blake2b-256. Omit it and the signature says sha256 with document_digest_alg_source:'assumed_default' — a default, marked as one, never presented as something you stated. With payload it must be omitted or sha256, which is what we run."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your own annotation for what this covers, up to 128 printable ASCII characters; signed, and marked in the envelope as the client's claim"
                }
              },
              "queryParams": {
                "digest": {
                  "type": "string",
                  "description": "same as body.digest, for GET callers"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "alg, scheme_id, scheme, digest, digest_alg, digest_alg_source (client_declared|assumed_default|gateway_computed), digest_source (client|gateway), canonical_bytes, label, signature, public_key, key_id, signed_at, commitment {type, document_digest, document_digest_alg, document_digest_alg_source, digest_source, canonical_bytes, canonicalisation, client_label}, envelope {kind, canonical_form, digest, payload, verification} (the self-contained object to publish or POST back), commitment_digest, commitment_digest_alg, binding, verify {endpoint, url, price}, public_key_endpoint, took_ms, payload_disclosed:false"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "pq_envelope",
      "name": "Post-quantum API response envelope",
      "path": "/x402/pq/envelope",
      "method": "POST",
      "url": "https://animica.dev/x402/pq/envelope",
      "documentation": "https://animica.dev/x402#product-pq_envelope",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
      "available": true,
      "endpoints": [
        "POST /x402/pq/envelope",
        "GET /x402/pq/envelope"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/pq/envelope/key",
          "url": "https://animica.dev/x402/pq/envelope/key",
          "price": "0",
          "description": "FREE. The ML-DSA-65 (FIPS 204, scheme 4099) public key every /x402/pq/envelope response is signed with, plus its key_id. Compare key_id against an envelope to establish it was sealed by THIS gateway and not self-signed by whoever handed it to you. Lets envelopes be verified fully offline."
        },
        {
          "endpoint": "POST /x402/pq/envelope/verify",
          "url": "https://animica.dev/x402/pq/envelope/verify",
          "price": "0",
          "description": "FREE, and free on purpose. Send { envelope } as issued, optionally with { payload } to additionally prove the envelope commits to the payload you hold. Answers valid (the signature checks out under the key carried IN the envelope), payload_bound, and issued_by_this_gateway (that key is ours) as three separate facts, because they are three separate facts. Any of them is null when it could not be established — null is never a negative verdict."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "payload": {
              "type": "any",
              "required": true,
              "description": "the JSON value to seal — object, array, string, number, boolean or null. Sealed verbatim; nothing is normalised, rewritten or interpreted."
            },
            "label": {
              "type": "string",
              "required": false,
              "description": "your filing tag, bound INSIDE the signature as kind \"api-response/<label>\". Up to 64 chars of [A-Za-z0-9._:- ]. Namespaced so it can never impersonate one of this gateway's own attestations."
            },
            "anchor_chain": {
              "type": "boolean",
              "required": false,
              "description": "default false. When true the signed object also carries an observed Animica chain head {height, hash}: a lower bound on when the seal happened that this gateway cannot inflate, because a block hash cannot exist before its block. Nothing is written to the chain — the head is read from a node. If the node is unreachable the call 503s and you are NOT charged."
            },
            "include_canonical_form": {
              "type": "boolean",
              "required": false,
              "description": "default false. Return the exact hashed bytes (only when under 8192 chars) as a debugging aid for canonicalisation interop."
            }
          },
          "queryParams": {
            "payload": {
              "type": "string",
              "description": "GET callers: the payload as JSON text"
            },
            "label": {
              "type": "string",
              "description": "same as body.label"
            },
            "anchor_chain": {
              "type": "string",
              "description": "true|1 to anchor to the observed chain head"
            },
            "include_canonical_form": {
              "type": "string",
              "description": "true|1 to return the exact hashed bytes"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "sealed:true, payload (verbatim), subject {mode, object, object_note, digest_alg, digest, canonical_bytes, canonical_chars, canonical_form, canonical_form_omitted, canonicalisation}, envelope {type, kind, alg, scheme_id, domain, chain_id, prehash, digest, signed_at, canonical_form, public_key, key_id, signature}, chain_anchor {height, hash, chain_id, block_timestamp, inside_signature, published_on_chain:false, means} or null, label, kind, verification {proves, does_not_prove, steps, offline, free_endpoints, issuer_key_id}, inference:null, computation {deterministic:true, model_used:false}, sealed_at, took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/envelope",
          "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "payload": {
                  "type": "any",
                  "required": true,
                  "description": "the JSON value to seal — object, array, string, number, boolean or null. Sealed verbatim; nothing is normalised, rewritten or interpreted."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your filing tag, bound INSIDE the signature as kind \"api-response/<label>\". Up to 64 chars of [A-Za-z0-9._:- ]. Namespaced so it can never impersonate one of this gateway's own attestations."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed object also carries an observed Animica chain head {height, hash}: a lower bound on when the seal happened that this gateway cannot inflate, because a block hash cannot exist before its block. Nothing is written to the chain — the head is read from a node. If the node is unreachable the call 503s and you are NOT charged."
                },
                "include_canonical_form": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. Return the exact hashed bytes (only when under 8192 chars) as a debugging aid for canonicalisation interop."
                }
              },
              "queryParams": {
                "payload": {
                  "type": "string",
                  "description": "GET callers: the payload as JSON text"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                },
                "include_canonical_form": {
                  "type": "string",
                  "description": "true|1 to return the exact hashed bytes"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "sealed:true, payload (verbatim), subject {mode, object, object_note, digest_alg, digest, canonical_bytes, canonical_chars, canonical_form, canonical_form_omitted, canonicalisation}, envelope {type, kind, alg, scheme_id, domain, chain_id, prehash, digest, signed_at, canonical_form, public_key, key_id, signature}, chain_anchor {height, hash, chain_id, block_timestamp, inside_signature, published_on_chain:false, means} or null, label, kind, verification {proves, does_not_prove, steps, offline, free_endpoints, issuer_key_id}, inference:null, computation {deterministic:true, model_used:false}, sealed_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/envelope",
          "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "payload": {
                  "type": "any",
                  "required": true,
                  "description": "the JSON value to seal — object, array, string, number, boolean or null. Sealed verbatim; nothing is normalised, rewritten or interpreted."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your filing tag, bound INSIDE the signature as kind \"api-response/<label>\". Up to 64 chars of [A-Za-z0-9._:- ]. Namespaced so it can never impersonate one of this gateway's own attestations."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed object also carries an observed Animica chain head {height, hash}: a lower bound on when the seal happened that this gateway cannot inflate, because a block hash cannot exist before its block. Nothing is written to the chain — the head is read from a node. If the node is unreachable the call 503s and you are NOT charged."
                },
                "include_canonical_form": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. Return the exact hashed bytes (only when under 8192 chars) as a debugging aid for canonicalisation interop."
                }
              },
              "queryParams": {
                "payload": {
                  "type": "string",
                  "description": "GET callers: the payload as JSON text"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                },
                "include_canonical_form": {
                  "type": "string",
                  "description": "true|1 to return the exact hashed bytes"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "sealed:true, payload (verbatim), subject {mode, object, object_note, digest_alg, digest, canonical_bytes, canonical_chars, canonical_form, canonical_form_omitted, canonicalisation}, envelope {type, kind, alg, scheme_id, domain, chain_id, prehash, digest, signed_at, canonical_form, public_key, key_id, signature}, chain_anchor {height, hash, chain_id, block_timestamp, inside_signature, published_on_chain:false, means} or null, label, kind, verification {proves, does_not_prove, steps, offline, free_endpoints, issuer_key_id}, inference:null, computation {deterministic:true, model_used:false}, sealed_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "pq_artifact",
      "name": "Post-quantum artifact attestation (ML-DSA-65, chain-head pinned)",
      "path": "/x402/pq/artifact",
      "method": "POST",
      "url": "https://animica.dev/x402/pq/artifact",
      "documentation": "https://animica.dev/x402#product-pq_artifact",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
      "available": true,
      "endpoints": [
        "POST /x402/pq/artifact",
        "GET /x402/pq/artifact"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "POST /x402/pq/artifact/verify",
          "url": "https://animica.dev/x402/pq/artifact/verify",
          "price": "0",
          "description": "FREE. Check an ML-DSA-65 artifact manifest issued by /x402/pq/artifact: the signature, the internal consistency of the signed bytes, and the release identity it binds. Supply the anchor commitment too and it re-reads the record from this node's data-availability store and confirms that record commits to THIS manifest — a record that points at different bytes is reported as such rather than counted as one. Read that check for what it is: the store is node-local and its root is not in any block, so finding the record proves this node holds bytes that bind this manifest, not that a chain witnessed them. Also reports whether THIS gateway issued it, because a valid signature under somebody else's key proves nothing about this issuer. valid:false is an answer; a verifier we cannot run is a 503, never an accusation of forgery."
        },
        {
          "endpoint": "GET /x402/pq/artifact/pubkey",
          "url": "https://animica.dev/x402/pq/artifact/pubkey",
          "price": "0",
          "description": "FREE. The ML-DSA-65 (FIPS 204, scheme 4099) public key every /x402/pq/artifact manifest is signed with, plus the domain, chain id and prehash needed to verify one offline without calling us at all."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "name": {
              "type": "string",
              "required": true,
              "description": "the artifact's identity — package, image, repo or model name, up to 200 printable ASCII characters (e.g. \"ghcr.io/acme/api\", \"meta-llama/Llama-3-8B\"). Signed."
            },
            "version": {
              "type": "string",
              "required": true,
              "description": "the release identifier, up to 100 printable ASCII characters (e.g. \"1.4.2\", \"2026-08-22\", \"sha-9f3ac1\"). Signed."
            },
            "digest": {
              "type": "string",
              "required": true,
              "description": "the hash of the artifact, computed by YOU: \"sha256:<hex>\", \"0x<hex>\" or bare hex. Supported: sha256, sha512, sha3-256, sha3-512, blake2b-256, blake2b-512, blake3. The artifact itself never leaves your side."
            },
            "digest_alg": {
              "type": "string",
              "required": false,
              "description": "how you hashed it, if the digest carries no \"alg:\" prefix. Defaults from the digest length (64 hex -> sha256, 128 -> sha512) and the manifest records which of those two it was. SHA-1 and MD5 are refused."
            },
            "metadata": {
              "type": "object",
              "required": false,
              "description": "your own JSON object about this release — build id, git commit, toolchain, licence, training run. Canonicalised and signed, capped at 8192 canonical characters. NEVER written into the anchor record under any anchor setting."
            },
            "anchor": {
              "type": "string",
              "required": false,
              "description": "false | \"digest\" (default: records hashes and timestamps only) | \"identity\" (also records name and version). Writes a record into THIS node's data-availability store — not into a block, and evictable — so treat it as retrievable tamper-evidence, not as a timestamp authority."
            },
            "require_anchor": {
              "type": "boolean",
              "required": false,
              "description": "default false. When true, an unwritable DA store raises 503 and charges nothing instead of returning a signed-but-unstored manifest — set this if the stored record is what you are buying. It can never be satisfied on a gateway with anchoring switched off, and that is refused at validation time rather than after a payment."
            },
            "include_payer": {
              "type": "boolean",
              "required": false,
              "description": "default false. When true, the identity the payment verified under is signed INTO the manifest as requested_by, binding the release to the account that published it: the x402 payer address on the on-chain lane, or \"voucher:<id>\" when paid from prepaid credits (and null if neither is known). Never anchored."
            }
          },
          "queryParams": {
            "name": {
              "type": "string",
              "description": "same as body.name, for GET callers"
            },
            "version": {
              "type": "string",
              "description": "same as body.version"
            },
            "digest": {
              "type": "string",
              "description": "same as body.digest"
            },
            "digest_alg": {
              "type": "string",
              "description": "same as body.digest_alg"
            },
            "anchor": {
              "type": "string",
              "description": "same as body.anchor"
            },
            "require_anchor": {
              "type": "string",
              "description": "same as body.require_anchor (\"true\"/\"false\")"
            },
            "include_payer": {
              "type": "string",
              "description": "same as body.include_payer (\"true\"/\"false\")"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "artifact {name, version, digest, digest_alg, digest_alg_source, digest_computed_by}, metadata, manifest (the exact statement signed), alg, scheme_id, scheme, signature, public_key, key_id, signed_at, manifest_digest, envelope (self-contained: post it back to the free verifier), chain {chain_id, head_height, head_hash, observed_at, published_on_chain:false, means, not_a_consensus_timestamp:true} or {available:false, reason}, anchor {anchored, mode, reason, commitment, blob_id, namespace, record, record_bytes_base64, proof {leaf_index, leaf_hash, siblings, tree_height}, published_on_chain:false, durability {eviction_policy, on_full} read from da.status, discloses}, binding (how to re-derive it all), artifact_disclosed:false, verify, public_key_endpoint, inference:null, deterministic {response:false, manifest_canonicalisation:true, model_free:true} — the canonicalisation and the digest repeat, the timestamps, head, commitment and randomised signature do not — took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/artifact",
          "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "name": {
                  "type": "string",
                  "required": true,
                  "description": "the artifact's identity — package, image, repo or model name, up to 200 printable ASCII characters (e.g. \"ghcr.io/acme/api\", \"meta-llama/Llama-3-8B\"). Signed."
                },
                "version": {
                  "type": "string",
                  "required": true,
                  "description": "the release identifier, up to 100 printable ASCII characters (e.g. \"1.4.2\", \"2026-08-22\", \"sha-9f3ac1\"). Signed."
                },
                "digest": {
                  "type": "string",
                  "required": true,
                  "description": "the hash of the artifact, computed by YOU: \"sha256:<hex>\", \"0x<hex>\" or bare hex. Supported: sha256, sha512, sha3-256, sha3-512, blake2b-256, blake2b-512, blake3. The artifact itself never leaves your side."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how you hashed it, if the digest carries no \"alg:\" prefix. Defaults from the digest length (64 hex -> sha256, 128 -> sha512) and the manifest records which of those two it was. SHA-1 and MD5 are refused."
                },
                "metadata": {
                  "type": "object",
                  "required": false,
                  "description": "your own JSON object about this release — build id, git commit, toolchain, licence, training run. Canonicalised and signed, capped at 8192 canonical characters. NEVER written into the anchor record under any anchor setting."
                },
                "anchor": {
                  "type": "string",
                  "required": false,
                  "description": "false | \"digest\" (default: records hashes and timestamps only) | \"identity\" (also records name and version). Writes a record into THIS node's data-availability store — not into a block, and evictable — so treat it as retrievable tamper-evidence, not as a timestamp authority."
                },
                "require_anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, an unwritable DA store raises 503 and charges nothing instead of returning a signed-but-unstored manifest — set this if the stored record is what you are buying. It can never be satisfied on a gateway with anchoring switched off, and that is refused at validation time rather than after a payment."
                },
                "include_payer": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, the identity the payment verified under is signed INTO the manifest as requested_by, binding the release to the account that published it: the x402 payer address on the on-chain lane, or \"voucher:<id>\" when paid from prepaid credits (and null if neither is known). Never anchored."
                }
              },
              "queryParams": {
                "name": {
                  "type": "string",
                  "description": "same as body.name, for GET callers"
                },
                "version": {
                  "type": "string",
                  "description": "same as body.version"
                },
                "digest": {
                  "type": "string",
                  "description": "same as body.digest"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "anchor": {
                  "type": "string",
                  "description": "same as body.anchor"
                },
                "require_anchor": {
                  "type": "string",
                  "description": "same as body.require_anchor (\"true\"/\"false\")"
                },
                "include_payer": {
                  "type": "string",
                  "description": "same as body.include_payer (\"true\"/\"false\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifact {name, version, digest, digest_alg, digest_alg_source, digest_computed_by}, metadata, manifest (the exact statement signed), alg, scheme_id, scheme, signature, public_key, key_id, signed_at, manifest_digest, envelope (self-contained: post it back to the free verifier), chain {chain_id, head_height, head_hash, observed_at, published_on_chain:false, means, not_a_consensus_timestamp:true} or {available:false, reason}, anchor {anchored, mode, reason, commitment, blob_id, namespace, record, record_bytes_base64, proof {leaf_index, leaf_hash, siblings, tree_height}, published_on_chain:false, durability {eviction_policy, on_full} read from da.status, discloses}, binding (how to re-derive it all), artifact_disclosed:false, verify, public_key_endpoint, inference:null, deterministic {response:false, manifest_canonicalisation:true, model_free:true} — the canonicalisation and the digest repeat, the timestamps, head, commitment and randomised signature do not — took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/artifact",
          "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "name": {
                  "type": "string",
                  "required": true,
                  "description": "the artifact's identity — package, image, repo or model name, up to 200 printable ASCII characters (e.g. \"ghcr.io/acme/api\", \"meta-llama/Llama-3-8B\"). Signed."
                },
                "version": {
                  "type": "string",
                  "required": true,
                  "description": "the release identifier, up to 100 printable ASCII characters (e.g. \"1.4.2\", \"2026-08-22\", \"sha-9f3ac1\"). Signed."
                },
                "digest": {
                  "type": "string",
                  "required": true,
                  "description": "the hash of the artifact, computed by YOU: \"sha256:<hex>\", \"0x<hex>\" or bare hex. Supported: sha256, sha512, sha3-256, sha3-512, blake2b-256, blake2b-512, blake3. The artifact itself never leaves your side."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how you hashed it, if the digest carries no \"alg:\" prefix. Defaults from the digest length (64 hex -> sha256, 128 -> sha512) and the manifest records which of those two it was. SHA-1 and MD5 are refused."
                },
                "metadata": {
                  "type": "object",
                  "required": false,
                  "description": "your own JSON object about this release — build id, git commit, toolchain, licence, training run. Canonicalised and signed, capped at 8192 canonical characters. NEVER written into the anchor record under any anchor setting."
                },
                "anchor": {
                  "type": "string",
                  "required": false,
                  "description": "false | \"digest\" (default: records hashes and timestamps only) | \"identity\" (also records name and version). Writes a record into THIS node's data-availability store — not into a block, and evictable — so treat it as retrievable tamper-evidence, not as a timestamp authority."
                },
                "require_anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, an unwritable DA store raises 503 and charges nothing instead of returning a signed-but-unstored manifest — set this if the stored record is what you are buying. It can never be satisfied on a gateway with anchoring switched off, and that is refused at validation time rather than after a payment."
                },
                "include_payer": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, the identity the payment verified under is signed INTO the manifest as requested_by, binding the release to the account that published it: the x402 payer address on the on-chain lane, or \"voucher:<id>\" when paid from prepaid credits (and null if neither is known). Never anchored."
                }
              },
              "queryParams": {
                "name": {
                  "type": "string",
                  "description": "same as body.name, for GET callers"
                },
                "version": {
                  "type": "string",
                  "description": "same as body.version"
                },
                "digest": {
                  "type": "string",
                  "description": "same as body.digest"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "anchor": {
                  "type": "string",
                  "description": "same as body.anchor"
                },
                "require_anchor": {
                  "type": "string",
                  "description": "same as body.require_anchor (\"true\"/\"false\")"
                },
                "include_payer": {
                  "type": "string",
                  "description": "same as body.include_payer (\"true\"/\"false\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifact {name, version, digest, digest_alg, digest_alg_source, digest_computed_by}, metadata, manifest (the exact statement signed), alg, scheme_id, scheme, signature, public_key, key_id, signed_at, manifest_digest, envelope (self-contained: post it back to the free verifier), chain {chain_id, head_height, head_hash, observed_at, published_on_chain:false, means, not_a_consensus_timestamp:true} or {available:false, reason}, anchor {anchored, mode, reason, commitment, blob_id, namespace, record, record_bytes_base64, proof {leaf_index, leaf_hash, siblings, tree_height}, published_on_chain:false, durability {eviction_policy, on_full} read from da.status, discloses}, binding (how to re-derive it all), artifact_disclosed:false, verify, public_key_endpoint, inference:null, deterministic {response:false, manifest_canonicalisation:true, model_free:true} — the canonicalisation and the digest repeat, the timestamps, head, commitment and randomised signature do not — took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "pq_identity",
      "name": "Post-quantum agent identity certificate (ML-DSA-65) — NOT KYC",
      "path": "/x402/pq/identity",
      "method": "POST",
      "url": "https://animica.dev/x402/pq/identity",
      "documentation": "https://animica.dev/x402#product-pq_identity",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/pq/identity",
        "GET /x402/pq/identity"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "POST /x402/pq/identity/verify",
          "url": "https://animica.dev/x402/pq/identity/verify",
          "price": "0",
          "description": "FREE. Check an ML-DSA-65 certificate issued by /x402/pq/identity: the signature, the internal consistency of the signed bytes, the binding to the certificate body, whether THIS gateway issued it, and whether it is still inside its validity window. Restates what the certificate does and does not establish — in particular that it is NOT KYC — so a verifying agent cannot read a valid:true as an identity check. Nothing from the posted payload is returned unless the signature over it verified, and the three ISSUER-VERDICT fields — assurance level, binding and key_possession_proven — are only read from an envelope this gateway signed (issued_by_this_gateway), because anyone can self-sign a payload in this shape; a foreign envelope's versions are quoted under foreign_*_claim instead. valid:false is an answer; a verifier we cannot run is a 503, never an accusation of forgery."
        },
        {
          "endpoint": "GET /x402/pq/identity/key",
          "url": "https://animica.dev/x402/pq/identity/key",
          "price": "0",
          "description": "FREE. The ML-DSA-65 (FIPS 204, scheme 4099) public key every /x402/pq/identity certificate is signed with, plus the domain, chain id and prehash needed to verify one offline without calling us at all."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "agent_name": {
              "type": "string",
              "required": true,
              "description": "your self-declared name, 1-128 printable ASCII characters. SELF-DECLARED and recorded as such: names are not unique, not registered, and never checked."
            },
            "public_key": {
              "type": "string",
              "required": false,
              "description": "your ML-DSA-65 public key as 3904 hex characters (FIPS 204, scheme 4099 — the key type the Animica L1 spends with). Without key_proof the certificate records it as PRESENTED, not proven."
            },
            "key_proof": {
              "type": "object",
              "required": false,
              "description": "proof you hold the secret half: an animica.attest/v1 envelope you self-signed, carrying payload {\"purpose\":\"animica.pq-identity/key-proof\",\"agent_name\":\"<the same name>\"} and signed within the last 3600s. Verified here before the certificate is issued; a proof that does not check out is REFUSED (400, free), never silently downgraded."
            },
            "claims": {
              "type": "object",
              "required": false,
              "description": "up to 32 self-declared key/value claims — a flat map of strings, numbers, booleans, nulls or arrays of those. Signed under the name \"claims_self_asserted\" and endorsed by nobody. Keys using verification vocabulary (kyc, verified, licensed, ...) are flagged inside the signature as self-asserted."
            },
            "ttl_seconds": {
              "type": "integer",
              "required": false,
              "description": "how long the certificate declares itself valid, 60-31536000 (default 2592000). Written into the signature as not_before/not_after."
            },
            "anchor_chain": {
              "type": "boolean",
              "required": false,
              "description": "default false. When true the signed certificate also carries an observed Animica chain head {height, hash}, a lower bound on issue time that this gateway cannot move backwards. If the node is unreachable the call 503s and you are NOT charged."
            }
          },
          "queryParams": {
            "agent_name": {
              "type": "string",
              "description": "same as body.agent_name, for GET callers"
            },
            "public_key": {
              "type": "string",
              "description": "same as body.public_key"
            },
            "claims": {
              "type": "string",
              "description": "same as body.claims, as JSON object text"
            },
            "ttl_seconds": {
              "type": "string",
              "description": "same as body.ttl_seconds"
            },
            "anchor_chain": {
              "type": "string",
              "description": "true|1 to anchor to the observed chain head"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "certificate {type, subject {agent_name, public_key, public_key_alg, public_key_alg_checked, public_key_fingerprint, public_key_fingerprint_derivation, binding}, subject_id, claims_self_asserted, claims_asserting_assurance_vocabulary, key_possession_proven, key_proof, assurance {level:none, is_kyc:false, statement, does_not_establish}, not_before, not_after, chain_anchor, issued_at} (the exact signed statement), envelope {canonical_form, signature, public_key, key_id, ...} (self-contained, publishable), binding, key_possession_proven, not_kyc:true, assurance_level:none, establishes, does_not_establish, validity, subject_id, verify {endpoint, url, price}, issuer_key_endpoint, verification, took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/identity",
          "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "agent_name": {
                  "type": "string",
                  "required": true,
                  "description": "your self-declared name, 1-128 printable ASCII characters. SELF-DECLARED and recorded as such: names are not unique, not registered, and never checked."
                },
                "public_key": {
                  "type": "string",
                  "required": false,
                  "description": "your ML-DSA-65 public key as 3904 hex characters (FIPS 204, scheme 4099 — the key type the Animica L1 spends with). Without key_proof the certificate records it as PRESENTED, not proven."
                },
                "key_proof": {
                  "type": "object",
                  "required": false,
                  "description": "proof you hold the secret half: an animica.attest/v1 envelope you self-signed, carrying payload {\"purpose\":\"animica.pq-identity/key-proof\",\"agent_name\":\"<the same name>\"} and signed within the last 3600s. Verified here before the certificate is issued; a proof that does not check out is REFUSED (400, free), never silently downgraded."
                },
                "claims": {
                  "type": "object",
                  "required": false,
                  "description": "up to 32 self-declared key/value claims — a flat map of strings, numbers, booleans, nulls or arrays of those. Signed under the name \"claims_self_asserted\" and endorsed by nobody. Keys using verification vocabulary (kyc, verified, licensed, ...) are flagged inside the signature as self-asserted."
                },
                "ttl_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "how long the certificate declares itself valid, 60-31536000 (default 2592000). Written into the signature as not_before/not_after."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed certificate also carries an observed Animica chain head {height, hash}, a lower bound on issue time that this gateway cannot move backwards. If the node is unreachable the call 503s and you are NOT charged."
                }
              },
              "queryParams": {
                "agent_name": {
                  "type": "string",
                  "description": "same as body.agent_name, for GET callers"
                },
                "public_key": {
                  "type": "string",
                  "description": "same as body.public_key"
                },
                "claims": {
                  "type": "string",
                  "description": "same as body.claims, as JSON object text"
                },
                "ttl_seconds": {
                  "type": "string",
                  "description": "same as body.ttl_seconds"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "certificate {type, subject {agent_name, public_key, public_key_alg, public_key_alg_checked, public_key_fingerprint, public_key_fingerprint_derivation, binding}, subject_id, claims_self_asserted, claims_asserting_assurance_vocabulary, key_possession_proven, key_proof, assurance {level:none, is_kyc:false, statement, does_not_establish}, not_before, not_after, chain_anchor, issued_at} (the exact signed statement), envelope {canonical_form, signature, public_key, key_id, ...} (self-contained, publishable), binding, key_possession_proven, not_kyc:true, assurance_level:none, establishes, does_not_establish, validity, subject_id, verify {endpoint, url, price}, issuer_key_endpoint, verification, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/identity",
          "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "agent_name": {
                  "type": "string",
                  "required": true,
                  "description": "your self-declared name, 1-128 printable ASCII characters. SELF-DECLARED and recorded as such: names are not unique, not registered, and never checked."
                },
                "public_key": {
                  "type": "string",
                  "required": false,
                  "description": "your ML-DSA-65 public key as 3904 hex characters (FIPS 204, scheme 4099 — the key type the Animica L1 spends with). Without key_proof the certificate records it as PRESENTED, not proven."
                },
                "key_proof": {
                  "type": "object",
                  "required": false,
                  "description": "proof you hold the secret half: an animica.attest/v1 envelope you self-signed, carrying payload {\"purpose\":\"animica.pq-identity/key-proof\",\"agent_name\":\"<the same name>\"} and signed within the last 3600s. Verified here before the certificate is issued; a proof that does not check out is REFUSED (400, free), never silently downgraded."
                },
                "claims": {
                  "type": "object",
                  "required": false,
                  "description": "up to 32 self-declared key/value claims — a flat map of strings, numbers, booleans, nulls or arrays of those. Signed under the name \"claims_self_asserted\" and endorsed by nobody. Keys using verification vocabulary (kyc, verified, licensed, ...) are flagged inside the signature as self-asserted."
                },
                "ttl_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "how long the certificate declares itself valid, 60-31536000 (default 2592000). Written into the signature as not_before/not_after."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed certificate also carries an observed Animica chain head {height, hash}, a lower bound on issue time that this gateway cannot move backwards. If the node is unreachable the call 503s and you are NOT charged."
                }
              },
              "queryParams": {
                "agent_name": {
                  "type": "string",
                  "description": "same as body.agent_name, for GET callers"
                },
                "public_key": {
                  "type": "string",
                  "description": "same as body.public_key"
                },
                "claims": {
                  "type": "string",
                  "description": "same as body.claims, as JSON object text"
                },
                "ttl_seconds": {
                  "type": "string",
                  "description": "same as body.ttl_seconds"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "certificate {type, subject {agent_name, public_key, public_key_alg, public_key_alg_checked, public_key_fingerprint, public_key_fingerprint_derivation, binding}, subject_id, claims_self_asserted, claims_asserting_assurance_vocabulary, key_possession_proven, key_proof, assurance {level:none, is_kyc:false, statement, does_not_establish}, not_before, not_after, chain_anchor, issued_at} (the exact signed statement), envelope {canonical_form, signature, public_key, key_id, ...} (self-contained, publishable), binding, key_possession_proven, not_kyc:true, assurance_level:none, establishes, does_not_establish, validity, subject_id, verify {endpoint, url, price}, issuer_key_endpoint, verification, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_distribution",
      "name": "Animica miner distribution",
      "path": "/x402/chain/distribution",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/distribution",
      "documentation": "https://animica.dev/x402#product-chain_distribution",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/distribution",
        "GET /x402/chain/distribution"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "blocks": {
              "type": "integer",
              "required": false,
              "description": "window size in blocks, 20..500 (default 200). Smaller windows are refused because concentration over a handful of blocks is noise."
            },
            "compare": {
              "type": "boolean",
              "required": false,
              "description": "also sweep the contiguous window of the same size immediately below this one and report the change (default true). false halves the node work and omits every delta."
            },
            "top": {
              "type": "integer",
              "required": false,
              "description": "how many producer rows to return, 1..200 (default 25). Producers beyond it are aggregated, never dropped silently."
            },
            "margin": {
              "type": "integer",
              "required": false,
              "description": "how many blocks below the head to stop, 0..1000 (default: the gateway's reorg margin). Raise it to measure a window that is already settled."
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "sign the response with this gateway's ML-DSA-65 (FIPS 204, scheme 4099) key so a third party can verify the measurement offline (default false). Refuses and charges nothing if the signer is unavailable."
            }
          },
          "queryParams": {
            "blocks": {
              "type": "integer",
              "description": "same as body.blocks, for GET callers"
            },
            "compare": {
              "type": "boolean",
              "description": "same as body.compare"
            },
            "top": {
              "type": "integer",
              "description": "same as body.top"
            },
            "margin": {
              "type": "integer",
              "description": "same as body.margin"
            },
            "attest": {
              "type": "boolean",
              "description": "same as body.attest"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "window {blocks_requested, blocks_in_range, blocks_attempted, blocks_not_attempted, from_height, to_height, attempted_through_height, head_margin}, concentration {at_height, attributed_blocks, unattributed_blocks, distinct_producers, top_producer, top_producer_share, hhi, effective_producers, gini, nakamoto_coefficient[{threshold, producers, combined_share}], window_truncated, truncation_reason}, producers[{rank, account_digest, blocks, share, prior_blocks, prior_share, share_delta, status}] (the last four only when a comparison was made), producers_listed, producers_omitted {count, blocks, share, note}, comparison {available, reason, prior_window, prior, delta, churn{entered[], exited[], entered_count, exited_count}, alignment{contiguous, realigned_by_blocks, measured_ranges_abut}, denominators}, reference_thresholds[], method, caveats, not_measured, attestation (signed:false unless attest:true, else an ML-DSA-65 envelope with subject_keys naming exactly which body keys the digest covers), as_of {head_height, head_hash, observed_at}, provenance."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/distribution",
          "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "window size in blocks, 20..500 (default 200). Smaller windows are refused because concentration over a handful of blocks is noise."
                },
                "compare": {
                  "type": "boolean",
                  "required": false,
                  "description": "also sweep the contiguous window of the same size immediately below this one and report the change (default true). false halves the node work and omits every delta."
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many producer rows to return, 1..200 (default 25). Producers beyond it are aggregated, never dropped silently."
                },
                "margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the head to stop, 0..1000 (default: the gateway's reorg margin). Raise it to measure a window that is already settled."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the response with this gateway's ML-DSA-65 (FIPS 204, scheme 4099) key so a third party can verify the measurement offline (default false). Refuses and charges nothing if the signer is unavailable."
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "compare": {
                  "type": "boolean",
                  "description": "same as body.compare"
                },
                "top": {
                  "type": "integer",
                  "description": "same as body.top"
                },
                "margin": {
                  "type": "integer",
                  "description": "same as body.margin"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "window {blocks_requested, blocks_in_range, blocks_attempted, blocks_not_attempted, from_height, to_height, attempted_through_height, head_margin}, concentration {at_height, attributed_blocks, unattributed_blocks, distinct_producers, top_producer, top_producer_share, hhi, effective_producers, gini, nakamoto_coefficient[{threshold, producers, combined_share}], window_truncated, truncation_reason}, producers[{rank, account_digest, blocks, share, prior_blocks, prior_share, share_delta, status}] (the last four only when a comparison was made), producers_listed, producers_omitted {count, blocks, share, note}, comparison {available, reason, prior_window, prior, delta, churn{entered[], exited[], entered_count, exited_count}, alignment{contiguous, realigned_by_blocks, measured_ranges_abut}, denominators}, reference_thresholds[], method, caveats, not_measured, attestation (signed:false unless attest:true, else an ML-DSA-65 envelope with subject_keys naming exactly which body keys the digest covers), as_of {head_height, head_hash, observed_at}, provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/distribution",
          "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "window size in blocks, 20..500 (default 200). Smaller windows are refused because concentration over a handful of blocks is noise."
                },
                "compare": {
                  "type": "boolean",
                  "required": false,
                  "description": "also sweep the contiguous window of the same size immediately below this one and report the change (default true). false halves the node work and omits every delta."
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many producer rows to return, 1..200 (default 25). Producers beyond it are aggregated, never dropped silently."
                },
                "margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the head to stop, 0..1000 (default: the gateway's reorg margin). Raise it to measure a window that is already settled."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the response with this gateway's ML-DSA-65 (FIPS 204, scheme 4099) key so a third party can verify the measurement offline (default false). Refuses and charges nothing if the signer is unavailable."
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "compare": {
                  "type": "boolean",
                  "description": "same as body.compare"
                },
                "top": {
                  "type": "integer",
                  "description": "same as body.top"
                },
                "margin": {
                  "type": "integer",
                  "description": "same as body.margin"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "window {blocks_requested, blocks_in_range, blocks_attempted, blocks_not_attempted, from_height, to_height, attempted_through_height, head_margin}, concentration {at_height, attributed_blocks, unattributed_blocks, distinct_producers, top_producer, top_producer_share, hhi, effective_producers, gini, nakamoto_coefficient[{threshold, producers, combined_share}], window_truncated, truncation_reason}, producers[{rank, account_digest, blocks, share, prior_blocks, prior_share, share_delta, status}] (the last four only when a comparison was made), producers_listed, producers_omitted {count, blocks, share, note}, comparison {available, reason, prior_window, prior, delta, churn{entered[], exited[], entered_count, exited_count}, alignment{contiguous, realigned_by_blocks, measured_ranges_abut}, denominators}, reference_thresholds[], method, caveats, not_measured, attestation (signed:false unless attest:true, else an ML-DSA-65 envelope with subject_keys naming exactly which body keys the digest covers), as_of {head_height, head_hash, observed_at}, provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_anomalies",
      "name": "Animica chain anomaly detector",
      "path": "/x402/chain/anomalies",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/anomalies",
      "documentation": "https://animica.dev/x402#product-chain_anomalies",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/anomalies",
        "GET /x402/chain/anomalies"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "blocks": {
              "type": "integer",
              "required": false,
              "description": "how many recent blocks to analyse, 12..240 (default 120). Every block is really read. Budget about 200ms of node time per block with producer analysis on and about 100ms with it off — those are PADDED planning figures (the 2026-08-22 walk measured ~160ms and ~80ms, and node load has moved the real cost by ~1.5x), so a 240-block window takes tens of seconds. window.node_read_ms reports what this call actually cost."
            },
            "producers": {
              "type": "boolean",
              "required": false,
              "description": "analyse block-production concentration and its shift across the window (default true). Set false to roughly halve the node work and the latency when you only care about intervals, empty blocks and the mempool."
            },
            "head_margin": {
              "type": "integer",
              "required": false,
              "description": "how many blocks below the tip the window stops, 0..100. Defaults to the gateway setting; the tip is excluded because a shallow reorg can still replace it."
            },
            "long_median_factor": {
              "type": "number",
              "required": false,
              "description": "flag an interval at or above this multiple of the window median, > 1 (default 6)"
            },
            "short_median_factor": {
              "type": "number",
              "required": false,
              "description": "flag an interval at or below the window median divided by this, > 1 (default 8)"
            },
            "empty_run_blocks": {
              "type": "integer",
              "required": false,
              "description": "flag a run of this many consecutive transaction-free blocks, >= 2 (default 20)"
            },
            "theta_jump_ratio": {
              "type": "number",
              "required": false,
              "description": "flag a difficulty (thetaMicro) step of this factor or more between consecutive blocks, > 1 (default 1.5)"
            },
            "concentration_share": {
              "type": "number",
              "required": false,
              "description": "flag when one payout address produced at least this share of the recent half, 0..1 (default 0.5)"
            },
            "hhi_shift": {
              "type": "number",
              "required": false,
              "description": "flag when the Herfindahl index moves by at least this much between the two halves, 0..1 (default 0.15)"
            },
            "share_shift": {
              "type": "number",
              "required": false,
              "description": "treat an address as a mover when its share changes by at least this much between halves, 0..1 (default 0.25)"
            },
            "producer_exit_share": {
              "type": "number",
              "required": false,
              "description": "flag an address that held at least this share in one half and produced nothing in the other, 0..1 (default 0.2)"
            },
            "mempool_age_intervals": {
              "type": "number",
              "required": false,
              "description": "flag when the oldest pending transaction has waited this many median block intervals, > 0 (default 3)"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "return an ML-DSA-65 attestation binding this report to the chain height (default false)"
            }
          },
          "queryParams": {
            "blocks": {
              "type": "integer",
              "description": "same as body.blocks, for GET callers"
            },
            "producers": {
              "type": "boolean",
              "description": "same as body.producers"
            },
            "long_median_factor": {
              "type": "number",
              "description": "same as body.long_median_factor"
            },
            "short_median_factor": {
              "type": "number",
              "description": "same as body.short_median_factor"
            },
            "empty_run_blocks": {
              "type": "integer",
              "description": "same as body.empty_run_blocks"
            },
            "attest": {
              "type": "boolean",
              "description": "same as body.attest"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "analysed {blocks_examined, intervals_examined, coverage, findings, empty_findings_meaning, detectors_not_run[] (which detector groups could not look, and why — an empty findings list plus a non-empty detectors_not_run is NOT a clean bill of health)}, window {blocks_requested, blocks_in_range, blocks_examined, from_height, to_height, head_margin, coverage, minimum_coverage_required, missing_blocks, missing_sample, node_read_ms (measured to the last node read), node_read_ms_estimate + node_read_ms_estimate_basis (a planning constant, NOT a measurement of this call), max_blocks}, findings[] {kind, height|from_height/to_height, observed, rule, threshold {name, value, unit}, basis, source} across kinds long_block_interval, short_block_interval, non_monotonic_timestamp, difficulty_step, empty_block_run, production_concentration, production_concentration_shift, producer_disappeared, producer_appeared, mempool_backlog_age, mempool_not_draining, mempool_feed_disagreement; finding_counts{}, findings_truncated, intervals {samples, min_seconds, p10_seconds, median_seconds, p90_seconds, max_seconds, mean_seconds, mad_seconds, robust_sigma_seconds, long_cut_seconds, short_cut_seconds, calibration {long_observed, long_expected_memoryless, long_observed_over_expected, short_observed, short_expected_memoryless, short_observed_over_expected, reading}}, producers {available, half_that_failed?, windows {earlier, recent (each with blocks_requested/blocks_attempted/blocks_not_attempted/attributed_blocks/window_truncated), equal_length, unequal_length_reason, gap_blocks, overlap_blocks, disjoint}, earlier, recent, combined, shift} — combined and shift each carry their own {available} and are withheld with a reason when the two halves overlap (a head that moved backward between sweeps, or both windows clamping at genesis), because summing overlapping halves would double-count the shared blocks; mempool {available, count, total_bytes, oldest_age_seconds, oldest_age_is_stale, backlog_median_intervals, backlog_finding_suppressed_reason, feeds {getstats_count, getpending_listed, getmininginfo_pooledtx, disagreement, compared, not_read[], *_read_error}, limits} — a feed the node did not answer is null and listed in feeds.not_read, never 0; chain {height, hash, theta_micro + theta_micro_source, difficulty + difficulty_unknown_reason, consensus, peers + peers_unavailable_reason, node_warnings[] (NULL, never [], when the telemetry read failed) + node_warnings_unavailable_reason, telemetry_error}, thresholds{}, method{}, limits{}, inference {used:false, role:\"none\", upstream:null, animica_compute:false}, attestation — always present: an ML-DSA-65 envelope with subject_keys + a verbatim offline verification recipe in `covers` when attest:true, otherwise {signed:false, reason:\"not_requested\"}; as_of {head_height, head_hash, observed_at}, took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/anomalies",
          "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many recent blocks to analyse, 12..240 (default 120). Every block is really read. Budget about 200ms of node time per block with producer analysis on and about 100ms with it off — those are PADDED planning figures (the 2026-08-22 walk measured ~160ms and ~80ms, and node load has moved the real cost by ~1.5x), so a 240-block window takes tens of seconds. window.node_read_ms reports what this call actually cost."
                },
                "producers": {
                  "type": "boolean",
                  "required": false,
                  "description": "analyse block-production concentration and its shift across the window (default true). Set false to roughly halve the node work and the latency when you only care about intervals, empty blocks and the mempool."
                },
                "head_margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the tip the window stops, 0..100. Defaults to the gateway setting; the tip is excluded because a shallow reorg can still replace it."
                },
                "long_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or above this multiple of the window median, > 1 (default 6)"
                },
                "short_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or below the window median divided by this, > 1 (default 8)"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "flag a run of this many consecutive transaction-free blocks, >= 2 (default 20)"
                },
                "theta_jump_ratio": {
                  "type": "number",
                  "required": false,
                  "description": "flag a difficulty (thetaMicro) step of this factor or more between consecutive blocks, > 1 (default 1.5)"
                },
                "concentration_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag when one payout address produced at least this share of the recent half, 0..1 (default 0.5)"
                },
                "hhi_shift": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the Herfindahl index moves by at least this much between the two halves, 0..1 (default 0.15)"
                },
                "share_shift": {
                  "type": "number",
                  "required": false,
                  "description": "treat an address as a mover when its share changes by at least this much between halves, 0..1 (default 0.25)"
                },
                "producer_exit_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag an address that held at least this share in one half and produced nothing in the other, 0..1 (default 0.2)"
                },
                "mempool_age_intervals": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the oldest pending transaction has waited this many median block intervals, > 0 (default 3)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this report to the chain height (default false)"
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "producers": {
                  "type": "boolean",
                  "description": "same as body.producers"
                },
                "long_median_factor": {
                  "type": "number",
                  "description": "same as body.long_median_factor"
                },
                "short_median_factor": {
                  "type": "number",
                  "description": "same as body.short_median_factor"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "description": "same as body.empty_run_blocks"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "analysed {blocks_examined, intervals_examined, coverage, findings, empty_findings_meaning, detectors_not_run[] (which detector groups could not look, and why — an empty findings list plus a non-empty detectors_not_run is NOT a clean bill of health)}, window {blocks_requested, blocks_in_range, blocks_examined, from_height, to_height, head_margin, coverage, minimum_coverage_required, missing_blocks, missing_sample, node_read_ms (measured to the last node read), node_read_ms_estimate + node_read_ms_estimate_basis (a planning constant, NOT a measurement of this call), max_blocks}, findings[] {kind, height|from_height/to_height, observed, rule, threshold {name, value, unit}, basis, source} across kinds long_block_interval, short_block_interval, non_monotonic_timestamp, difficulty_step, empty_block_run, production_concentration, production_concentration_shift, producer_disappeared, producer_appeared, mempool_backlog_age, mempool_not_draining, mempool_feed_disagreement; finding_counts{}, findings_truncated, intervals {samples, min_seconds, p10_seconds, median_seconds, p90_seconds, max_seconds, mean_seconds, mad_seconds, robust_sigma_seconds, long_cut_seconds, short_cut_seconds, calibration {long_observed, long_expected_memoryless, long_observed_over_expected, short_observed, short_expected_memoryless, short_observed_over_expected, reading}}, producers {available, half_that_failed?, windows {earlier, recent (each with blocks_requested/blocks_attempted/blocks_not_attempted/attributed_blocks/window_truncated), equal_length, unequal_length_reason, gap_blocks, overlap_blocks, disjoint}, earlier, recent, combined, shift} — combined and shift each carry their own {available} and are withheld with a reason when the two halves overlap (a head that moved backward between sweeps, or both windows clamping at genesis), because summing overlapping halves would double-count the shared blocks; mempool {available, count, total_bytes, oldest_age_seconds, oldest_age_is_stale, backlog_median_intervals, backlog_finding_suppressed_reason, feeds {getstats_count, getpending_listed, getmininginfo_pooledtx, disagreement, compared, not_read[], *_read_error}, limits} — a feed the node did not answer is null and listed in feeds.not_read, never 0; chain {height, hash, theta_micro + theta_micro_source, difficulty + difficulty_unknown_reason, consensus, peers + peers_unavailable_reason, node_warnings[] (NULL, never [], when the telemetry read failed) + node_warnings_unavailable_reason, telemetry_error}, thresholds{}, method{}, limits{}, inference {used:false, role:\"none\", upstream:null, animica_compute:false}, attestation — always present: an ML-DSA-65 envelope with subject_keys + a verbatim offline verification recipe in `covers` when attest:true, otherwise {signed:false, reason:\"not_requested\"}; as_of {head_height, head_hash, observed_at}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/anomalies",
          "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many recent blocks to analyse, 12..240 (default 120). Every block is really read. Budget about 200ms of node time per block with producer analysis on and about 100ms with it off — those are PADDED planning figures (the 2026-08-22 walk measured ~160ms and ~80ms, and node load has moved the real cost by ~1.5x), so a 240-block window takes tens of seconds. window.node_read_ms reports what this call actually cost."
                },
                "producers": {
                  "type": "boolean",
                  "required": false,
                  "description": "analyse block-production concentration and its shift across the window (default true). Set false to roughly halve the node work and the latency when you only care about intervals, empty blocks and the mempool."
                },
                "head_margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the tip the window stops, 0..100. Defaults to the gateway setting; the tip is excluded because a shallow reorg can still replace it."
                },
                "long_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or above this multiple of the window median, > 1 (default 6)"
                },
                "short_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or below the window median divided by this, > 1 (default 8)"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "flag a run of this many consecutive transaction-free blocks, >= 2 (default 20)"
                },
                "theta_jump_ratio": {
                  "type": "number",
                  "required": false,
                  "description": "flag a difficulty (thetaMicro) step of this factor or more between consecutive blocks, > 1 (default 1.5)"
                },
                "concentration_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag when one payout address produced at least this share of the recent half, 0..1 (default 0.5)"
                },
                "hhi_shift": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the Herfindahl index moves by at least this much between the two halves, 0..1 (default 0.15)"
                },
                "share_shift": {
                  "type": "number",
                  "required": false,
                  "description": "treat an address as a mover when its share changes by at least this much between halves, 0..1 (default 0.25)"
                },
                "producer_exit_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag an address that held at least this share in one half and produced nothing in the other, 0..1 (default 0.2)"
                },
                "mempool_age_intervals": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the oldest pending transaction has waited this many median block intervals, > 0 (default 3)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this report to the chain height (default false)"
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "producers": {
                  "type": "boolean",
                  "description": "same as body.producers"
                },
                "long_median_factor": {
                  "type": "number",
                  "description": "same as body.long_median_factor"
                },
                "short_median_factor": {
                  "type": "number",
                  "description": "same as body.short_median_factor"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "description": "same as body.empty_run_blocks"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "analysed {blocks_examined, intervals_examined, coverage, findings, empty_findings_meaning, detectors_not_run[] (which detector groups could not look, and why — an empty findings list plus a non-empty detectors_not_run is NOT a clean bill of health)}, window {blocks_requested, blocks_in_range, blocks_examined, from_height, to_height, head_margin, coverage, minimum_coverage_required, missing_blocks, missing_sample, node_read_ms (measured to the last node read), node_read_ms_estimate + node_read_ms_estimate_basis (a planning constant, NOT a measurement of this call), max_blocks}, findings[] {kind, height|from_height/to_height, observed, rule, threshold {name, value, unit}, basis, source} across kinds long_block_interval, short_block_interval, non_monotonic_timestamp, difficulty_step, empty_block_run, production_concentration, production_concentration_shift, producer_disappeared, producer_appeared, mempool_backlog_age, mempool_not_draining, mempool_feed_disagreement; finding_counts{}, findings_truncated, intervals {samples, min_seconds, p10_seconds, median_seconds, p90_seconds, max_seconds, mean_seconds, mad_seconds, robust_sigma_seconds, long_cut_seconds, short_cut_seconds, calibration {long_observed, long_expected_memoryless, long_observed_over_expected, short_observed, short_expected_memoryless, short_observed_over_expected, reading}}, producers {available, half_that_failed?, windows {earlier, recent (each with blocks_requested/blocks_attempted/blocks_not_attempted/attributed_blocks/window_truncated), equal_length, unequal_length_reason, gap_blocks, overlap_blocks, disjoint}, earlier, recent, combined, shift} — combined and shift each carry their own {available} and are withheld with a reason when the two halves overlap (a head that moved backward between sweeps, or both windows clamping at genesis), because summing overlapping halves would double-count the shared blocks; mempool {available, count, total_bytes, oldest_age_seconds, oldest_age_is_stale, backlog_median_intervals, backlog_finding_suppressed_reason, feeds {getstats_count, getpending_listed, getmininginfo_pooledtx, disagreement, compared, not_read[], *_read_error}, limits} — a feed the node did not answer is null and listed in feeds.not_read, never 0; chain {height, hash, theta_micro + theta_micro_source, difficulty + difficulty_unknown_reason, consensus, peers + peers_unavailable_reason, node_warnings[] (NULL, never [], when the telemetry read failed) + node_warnings_unavailable_reason, telemetry_error}, thresholds{}, method{}, limits{}, inference {used:false, role:\"none\", upstream:null, animica_compute:false}, attestation — always present: an ML-DSA-65 envelope with subject_keys + a verbatim offline verification recipe in `covers` when attest:true, otherwise {signed:false, reason:\"not_requested\"}; as_of {head_height, head_hash, observed_at}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_economy",
      "name": "Animica ANM economy analyzer",
      "path": "/x402/chain/economy",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/economy",
      "documentation": "https://animica.dev/x402#product-chain_economy",
      "price": "0.008000",
      "price_atomic": "8000",
      "currency": "USDC",
      "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/economy",
        "GET /x402/chain/economy"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "exclude_addresses": {
              "type": "array",
              "required": false,
              "description": "up to 10 anim1… addresses (or 32-byte hex digests) whose balances are read from state and SUBTRACTED from the state total to give a circulating figure. Each deduction is itemised with the balance that was read. Omit it and circulating equals the state total, with basis:\"state_total\" and nothing deducted — this product will not guess which accounts are treasury or locked."
            }
          },
          "queryParams": {
            "exclude_addresses": {
              "type": "string",
              "description": "same as body.exclude_addresses for GET callers, comma-separated, up to 10 entries"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; supply {state_total_nanm, state_total_anm, accounts_with_balance, excluded[], circulating_nanm, circulating_anm, circulating_basis}; emission {miner_reward_per_block_anm, published_subsidy_per_block_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, miner_emission_anm_day, total_emission_anm_day, as_pct_of_circulating_supply {miner_per_day_pct, total_per_day_pct, total_annualised_simple_pct}}; block_production {mean_block_interval_seconds, blocks_per_day_observed, target_block_interval_seconds, blocks_per_day_at_target, interval_window}; hashrate {node_estimate, theta_micro, expected_trials_per_block, network_trials_per_second}; price {available, usd_per_anm, side, source, observed_at, age_seconds}; mining_revenue {available, network_miner_revenue_usd_day, network_total_emission_usd_day, circulating_supply_usd_at_bid}; fixed_pot {usd_per_trial_per_second_day, if_network_hashrate_doubles, statement}; halving {next_halving_height, blocks_to_next_halving, days_to_next_halving_at_observed_rate, published_subsidy_after_next_halving_anm}; issuance_reconciliation; method; caveats; inference {used:false}; provenance."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/economy",
          "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "exclude_addresses": {
                  "type": "array",
                  "required": false,
                  "description": "up to 10 anim1… addresses (or 32-byte hex digests) whose balances are read from state and SUBTRACTED from the state total to give a circulating figure. Each deduction is itemised with the balance that was read. Omit it and circulating equals the state total, with basis:\"state_total\" and nothing deducted — this product will not guess which accounts are treasury or locked."
                }
              },
              "queryParams": {
                "exclude_addresses": {
                  "type": "string",
                  "description": "same as body.exclude_addresses for GET callers, comma-separated, up to 10 entries"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; supply {state_total_nanm, state_total_anm, accounts_with_balance, excluded[], circulating_nanm, circulating_anm, circulating_basis}; emission {miner_reward_per_block_anm, published_subsidy_per_block_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, miner_emission_anm_day, total_emission_anm_day, as_pct_of_circulating_supply {miner_per_day_pct, total_per_day_pct, total_annualised_simple_pct}}; block_production {mean_block_interval_seconds, blocks_per_day_observed, target_block_interval_seconds, blocks_per_day_at_target, interval_window}; hashrate {node_estimate, theta_micro, expected_trials_per_block, network_trials_per_second}; price {available, usd_per_anm, side, source, observed_at, age_seconds}; mining_revenue {available, network_miner_revenue_usd_day, network_total_emission_usd_day, circulating_supply_usd_at_bid}; fixed_pot {usd_per_trial_per_second_day, if_network_hashrate_doubles, statement}; halving {next_halving_height, blocks_to_next_halving, days_to_next_halving_at_observed_rate, published_subsidy_after_next_halving_anm}; issuance_reconciliation; method; caveats; inference {used:false}; provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/economy",
          "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "exclude_addresses": {
                  "type": "array",
                  "required": false,
                  "description": "up to 10 anim1… addresses (or 32-byte hex digests) whose balances are read from state and SUBTRACTED from the state total to give a circulating figure. Each deduction is itemised with the balance that was read. Omit it and circulating equals the state total, with basis:\"state_total\" and nothing deducted — this product will not guess which accounts are treasury or locked."
                }
              },
              "queryParams": {
                "exclude_addresses": {
                  "type": "string",
                  "description": "same as body.exclude_addresses for GET callers, comma-separated, up to 10 entries"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; supply {state_total_nanm, state_total_anm, accounts_with_balance, excluded[], circulating_nanm, circulating_anm, circulating_basis}; emission {miner_reward_per_block_anm, published_subsidy_per_block_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, miner_emission_anm_day, total_emission_anm_day, as_pct_of_circulating_supply {miner_per_day_pct, total_per_day_pct, total_annualised_simple_pct}}; block_production {mean_block_interval_seconds, blocks_per_day_observed, target_block_interval_seconds, blocks_per_day_at_target, interval_window}; hashrate {node_estimate, theta_micro, expected_trials_per_block, network_trials_per_second}; price {available, usd_per_anm, side, source, observed_at, age_seconds}; mining_revenue {available, network_miner_revenue_usd_day, network_total_emission_usd_day, circulating_supply_usd_at_bid}; fixed_pot {usd_per_trial_per_second_day, if_network_hashrate_doubles, statement}; halving {next_halving_height, blocks_to_next_halving, days_to_next_halving_at_observed_rate, published_subsidy_after_next_halving_anm}; issuance_reconciliation; method; caveats; inference {used:false}; provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "market_gaps",
      "name": "x402 opportunity finder (thin supply, with real demand evidence)",
      "path": "/x402/market/gaps",
      "method": "POST",
      "url": "https://animica.dev/x402/market/gaps",
      "documentation": "https://animica.dev/x402#product-market_gaps",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
      "available": true,
      "endpoints": [
        "POST /x402/market/gaps",
        "GET /x402/market/gaps"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "area": {
              "type": "string",
              "required": true,
              "description": "the subject area to map, as free text — \"geocoding\", \"options market data\", \"pdf extraction\". A SUBJECT domain, not a hostname. Matching is lexical over merchant prose, so use the words a merchant would use."
            },
            "limit": {
              "type": "integer",
              "required": false,
              "description": "capability rows to return, 1..12 (default 6)"
            },
            "min_services": {
              "type": "integer",
              "required": false,
              "description": "how many services in the area sample must use a term before it counts as a capability, 1..10 (default 2). At 1 you will get one merchant's private vocabulary and its brand names."
            },
            "max_operators": {
              "type": "integer",
              "required": false,
              "description": "a capability served by more than this many distinct operators IN THE AREA SAMPLE is not thin — excluded and counted, 1..25 (default 3)"
            },
            "max_suppliers": {
              "type": "integer",
              "required": false,
              "description": "the real thinness test: a capability matched by more than this many services ACROSS THE WHOLE INDEX is well supplied and is excluded, 1..1000 (default 40). Raise it to see near-misses."
            }
          },
          "queryParams": {
            "area": {
              "type": "string",
              "description": "same as body.area, for GET callers"
            },
            "q": {
              "type": "string",
              "description": "alias for area"
            },
            "limit": {
              "type": "integer",
              "description": "same as body.limit"
            },
            "min_services": {
              "type": "integer",
              "description": "same as body.min_services"
            },
            "max_operators": {
              "type": "integer",
              "description": "same as body.max_operators"
            },
            "max_suppliers": {
              "type": "integer",
              "description": "same as body.max_suppliers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "area; gaps[] {rank, capability, gap_type (\"demand_observed\"|\"supply_side_only\"), demand_observed, why_this_is_a_gap, supply {services_across_index (a full match count over the PRICED DIRECTORY HALF only, never an all-index total), services_across_index_population, services_in_area_sample_carrying_term, undercount_warning, operators_observed, operators_inspected, operators_is_lower_bound, threshold_max_suppliers, verdict}, in_area {services, distinct_operators, callable_services, services_with_a_usable_price, prices_usd[], example_services[] {resource, host, price_usd, price_source, callable, demand_observed}, counts_are_lower_bounds}, demand {observed, calls_30d, unique_payers_30d_summed (summed per-service counts, NOT de-duplicated between them), payer_diversity, operators_with_demand_data, demand_per_operator, score, score_note, concentration_warning, attribution, source} or {observed:false, reason, means}, network_demand {same shape, over the whole index}, price_band {available, n, min, median, p90, enough_comparables, minimum_required, excluded{}, reason, matched_services, spread, basis, listings[] {resource, price_usd, price_source, demand_observed}}}; count; candidates_considered; network_probe_budget {examined, budget, exhausted, note}; excluded {area_query_terms[], below_min_services, above_max_operators, above_max_suppliers[], not_in_directory_half[] {capability, services_in_area_sample}, stop_or_numeric}; supply_sample {services_inspected, services_matched_in_area, is_sample, cap, counts_are_lower_bounds}; demand_coverage; thresholds; ranking[]; derivation {source_field, source_field_match_basis, lexical, stop_terms[]}; what_this_cannot_see; prices_are_asks; matching; sources {directory, fts}; inference {used:false, role:\"none\", upstream:null, animica_compute:false}; took_ms; generated_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/gaps",
          "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "area": {
                  "type": "string",
                  "required": true,
                  "description": "the subject area to map, as free text — \"geocoding\", \"options market data\", \"pdf extraction\". A SUBJECT domain, not a hostname. Matching is lexical over merchant prose, so use the words a merchant would use."
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "capability rows to return, 1..12 (default 6)"
                },
                "min_services": {
                  "type": "integer",
                  "required": false,
                  "description": "how many services in the area sample must use a term before it counts as a capability, 1..10 (default 2). At 1 you will get one merchant's private vocabulary and its brand names."
                },
                "max_operators": {
                  "type": "integer",
                  "required": false,
                  "description": "a capability served by more than this many distinct operators IN THE AREA SAMPLE is not thin — excluded and counted, 1..25 (default 3)"
                },
                "max_suppliers": {
                  "type": "integer",
                  "required": false,
                  "description": "the real thinness test: a capability matched by more than this many services ACROSS THE WHOLE INDEX is well supplied and is excluded, 1..1000 (default 40). Raise it to see near-misses."
                }
              },
              "queryParams": {
                "area": {
                  "type": "string",
                  "description": "same as body.area, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for area"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "min_services": {
                  "type": "integer",
                  "description": "same as body.min_services"
                },
                "max_operators": {
                  "type": "integer",
                  "description": "same as body.max_operators"
                },
                "max_suppliers": {
                  "type": "integer",
                  "description": "same as body.max_suppliers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "area; gaps[] {rank, capability, gap_type (\"demand_observed\"|\"supply_side_only\"), demand_observed, why_this_is_a_gap, supply {services_across_index (a full match count over the PRICED DIRECTORY HALF only, never an all-index total), services_across_index_population, services_in_area_sample_carrying_term, undercount_warning, operators_observed, operators_inspected, operators_is_lower_bound, threshold_max_suppliers, verdict}, in_area {services, distinct_operators, callable_services, services_with_a_usable_price, prices_usd[], example_services[] {resource, host, price_usd, price_source, callable, demand_observed}, counts_are_lower_bounds}, demand {observed, calls_30d, unique_payers_30d_summed (summed per-service counts, NOT de-duplicated between them), payer_diversity, operators_with_demand_data, demand_per_operator, score, score_note, concentration_warning, attribution, source} or {observed:false, reason, means}, network_demand {same shape, over the whole index}, price_band {available, n, min, median, p90, enough_comparables, minimum_required, excluded{}, reason, matched_services, spread, basis, listings[] {resource, price_usd, price_source, demand_observed}}}; count; candidates_considered; network_probe_budget {examined, budget, exhausted, note}; excluded {area_query_terms[], below_min_services, above_max_operators, above_max_suppliers[], not_in_directory_half[] {capability, services_in_area_sample}, stop_or_numeric}; supply_sample {services_inspected, services_matched_in_area, is_sample, cap, counts_are_lower_bounds}; demand_coverage; thresholds; ranking[]; derivation {source_field, source_field_match_basis, lexical, stop_terms[]}; what_this_cannot_see; prices_are_asks; matching; sources {directory, fts}; inference {used:false, role:\"none\", upstream:null, animica_compute:false}; took_ms; generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/gaps",
          "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "area": {
                  "type": "string",
                  "required": true,
                  "description": "the subject area to map, as free text — \"geocoding\", \"options market data\", \"pdf extraction\". A SUBJECT domain, not a hostname. Matching is lexical over merchant prose, so use the words a merchant would use."
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "capability rows to return, 1..12 (default 6)"
                },
                "min_services": {
                  "type": "integer",
                  "required": false,
                  "description": "how many services in the area sample must use a term before it counts as a capability, 1..10 (default 2). At 1 you will get one merchant's private vocabulary and its brand names."
                },
                "max_operators": {
                  "type": "integer",
                  "required": false,
                  "description": "a capability served by more than this many distinct operators IN THE AREA SAMPLE is not thin — excluded and counted, 1..25 (default 3)"
                },
                "max_suppliers": {
                  "type": "integer",
                  "required": false,
                  "description": "the real thinness test: a capability matched by more than this many services ACROSS THE WHOLE INDEX is well supplied and is excluded, 1..1000 (default 40). Raise it to see near-misses."
                }
              },
              "queryParams": {
                "area": {
                  "type": "string",
                  "description": "same as body.area, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for area"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "min_services": {
                  "type": "integer",
                  "description": "same as body.min_services"
                },
                "max_operators": {
                  "type": "integer",
                  "description": "same as body.max_operators"
                },
                "max_suppliers": {
                  "type": "integer",
                  "description": "same as body.max_suppliers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "area; gaps[] {rank, capability, gap_type (\"demand_observed\"|\"supply_side_only\"), demand_observed, why_this_is_a_gap, supply {services_across_index (a full match count over the PRICED DIRECTORY HALF only, never an all-index total), services_across_index_population, services_in_area_sample_carrying_term, undercount_warning, operators_observed, operators_inspected, operators_is_lower_bound, threshold_max_suppliers, verdict}, in_area {services, distinct_operators, callable_services, services_with_a_usable_price, prices_usd[], example_services[] {resource, host, price_usd, price_source, callable, demand_observed}, counts_are_lower_bounds}, demand {observed, calls_30d, unique_payers_30d_summed (summed per-service counts, NOT de-duplicated between them), payer_diversity, operators_with_demand_data, demand_per_operator, score, score_note, concentration_warning, attribution, source} or {observed:false, reason, means}, network_demand {same shape, over the whole index}, price_band {available, n, min, median, p90, enough_comparables, minimum_required, excluded{}, reason, matched_services, spread, basis, listings[] {resource, price_usd, price_source, demand_observed}}}; count; candidates_considered; network_probe_budget {examined, budget, exhausted, note}; excluded {area_query_terms[], below_min_services, above_max_operators, above_max_suppliers[], not_in_directory_half[] {capability, services_in_area_sample}, stop_or_numeric}; supply_sample {services_inspected, services_matched_in_area, is_sample, cap, counts_are_lower_bounds}; demand_coverage; thresholds; ranking[]; derivation {source_field, source_field_match_basis, lexical, stop_terms[]}; what_this_cannot_see; prices_are_asks; matching; sources {directory, fts}; inference {used:false, role:\"none\", upstream:null, animica_compute:false}; took_ms; generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "market_competitors",
      "name": "x402 competitor set and price band",
      "path": "/x402/market/competitors",
      "method": "POST",
      "url": "https://animica.dev/x402/market/competitors",
      "documentation": "https://animica.dev/x402#product-market_competitors",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
      "available": true,
      "endpoints": [
        "POST /x402/market/competitors",
        "GET /x402/market/competitors"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "resource": {
              "type": "string",
              "required": false,
              "description": "the http(s) URL of the x402 resource to find competitors for; its own published description supplies the query, so no capability is guessed from the path. Supply this OR capability, not both"
            },
            "capability": {
              "type": "string",
              "required": false,
              "description": "free-text capability to compare the market for, e.g. \"web search\" or \"ethereum block by number\". Supply this OR resource, not both"
            },
            "limit": {
              "type": "integer",
              "required": false,
              "description": "competitors to return, 1..25 (default 10)"
            },
            "max_price": {
              "type": "number",
              "required": false,
              "description": "only compare services at or under this price in USD; unpriced listings are kept and counted, because we do not know that they breach it"
            },
            "callable_only": {
              "type": "boolean",
              "required": false,
              "description": "only compare services that publish a call spec an agent could use unattended"
            },
            "include_mirrors": {
              "type": "boolean",
              "required": false,
              "description": "resource mode only: also list same-description same-price duplicates, which are one operator listed twice (default true)"
            }
          },
          "queryParams": {
            "resource": {
              "type": "string",
              "description": "same as body.resource, for GET callers"
            },
            "capability": {
              "type": "string",
              "description": "same as body.capability, for GET callers"
            },
            "q": {
              "type": "string",
              "description": "alias for capability"
            },
            "limit": {
              "type": "integer",
              "description": "same as body.limit"
            },
            "max_price": {
              "type": "number",
              "description": "same as body.max_price"
            },
            "callable_only": {
              "type": "boolean",
              "description": "same as body.callable_only"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "mode (resource|capability), subject {resource, host, description, price, call_spec, demand, payment, observation} in resource mode, competitors[] {rank, resource, host, description, price {usd, source, note}, call_spec {published, method, fields[], source}, demand {observed, calls_30d, unique_payers_30d, concentration}, payment {network, asset, pay_to}, observation {observed, checkable, outcome, http_status, latency_ms, probed_at, price_observed_usd}}, count, total_competitors, distinct_operators with distinct_operators_scope (the whole peer set in resource mode, the returned page in capability mode — read the scope before dividing one by the other), price_band {n, min, median, p90, spread, enough_comparables, minimum_required, excluded, reason, matched_services, computed_over, listings[] when below the comparables floor}, subject_position {percentile, cheaper_than_n_competitors, vs_median_usd} in resource mode, mirrors[], comparison {services_compared, publish_a_call_spec, demand_observed, probed_by_us, never_probed, networks[]}, filters, matching {query_terms[], coverage_floor_used, widened}, corpus {directory, full_text}, how_to_read, provenance, generated_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/competitors",
          "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": false,
                  "description": "the http(s) URL of the x402 resource to find competitors for; its own published description supplies the query, so no capability is guessed from the path. Supply this OR capability, not both"
                },
                "capability": {
                  "type": "string",
                  "required": false,
                  "description": "free-text capability to compare the market for, e.g. \"web search\" or \"ethereum block by number\". Supply this OR resource, not both"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "competitors to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only compare services at or under this price in USD; unpriced listings are kept and counted, because we do not know that they breach it"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only compare services that publish a call spec an agent could use unattended"
                },
                "include_mirrors": {
                  "type": "boolean",
                  "required": false,
                  "description": "resource mode only: also list same-description same-price duplicates, which are one operator listed twice (default true)"
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for capability"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "max_price": {
                  "type": "number",
                  "description": "same as body.max_price"
                },
                "callable_only": {
                  "type": "boolean",
                  "description": "same as body.callable_only"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "mode (resource|capability), subject {resource, host, description, price, call_spec, demand, payment, observation} in resource mode, competitors[] {rank, resource, host, description, price {usd, source, note}, call_spec {published, method, fields[], source}, demand {observed, calls_30d, unique_payers_30d, concentration}, payment {network, asset, pay_to}, observation {observed, checkable, outcome, http_status, latency_ms, probed_at, price_observed_usd}}, count, total_competitors, distinct_operators with distinct_operators_scope (the whole peer set in resource mode, the returned page in capability mode — read the scope before dividing one by the other), price_band {n, min, median, p90, spread, enough_comparables, minimum_required, excluded, reason, matched_services, computed_over, listings[] when below the comparables floor}, subject_position {percentile, cheaper_than_n_competitors, vs_median_usd} in resource mode, mirrors[], comparison {services_compared, publish_a_call_spec, demand_observed, probed_by_us, never_probed, networks[]}, filters, matching {query_terms[], coverage_floor_used, widened}, corpus {directory, full_text}, how_to_read, provenance, generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/competitors",
          "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": false,
                  "description": "the http(s) URL of the x402 resource to find competitors for; its own published description supplies the query, so no capability is guessed from the path. Supply this OR capability, not both"
                },
                "capability": {
                  "type": "string",
                  "required": false,
                  "description": "free-text capability to compare the market for, e.g. \"web search\" or \"ethereum block by number\". Supply this OR resource, not both"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "competitors to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only compare services at or under this price in USD; unpriced listings are kept and counted, because we do not know that they breach it"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only compare services that publish a call spec an agent could use unattended"
                },
                "include_mirrors": {
                  "type": "boolean",
                  "required": false,
                  "description": "resource mode only: also list same-description same-price duplicates, which are one operator listed twice (default true)"
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for capability"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "max_price": {
                  "type": "number",
                  "description": "same as body.max_price"
                },
                "callable_only": {
                  "type": "boolean",
                  "description": "same as body.callable_only"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "mode (resource|capability), subject {resource, host, description, price, call_spec, demand, payment, observation} in resource mode, competitors[] {rank, resource, host, description, price {usd, source, note}, call_spec {published, method, fields[], source}, demand {observed, calls_30d, unique_payers_30d, concentration}, payment {network, asset, pay_to}, observation {observed, checkable, outcome, http_status, latency_ms, probed_at, price_observed_usd}}, count, total_competitors, distinct_operators with distinct_operators_scope (the whole peer set in resource mode, the returned page in capability mode — read the scope before dividing one by the other), price_band {n, min, median, p90, spread, enough_comparables, minimum_required, excluded, reason, matched_services, computed_over, listings[] when below the comparables floor}, subject_position {percentile, cheaper_than_n_competitors, vs_median_usd} in resource mode, mirrors[], comparison {services_compared, publish_a_call_spec, demand_observed, probed_by_us, never_probed, networks[]}, filters, matching {query_terms[], coverage_floor_used, widened}, corpus {directory, full_text}, how_to_read, provenance, generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "market_pricing",
      "name": "x402 price optimizer (Animica index)",
      "path": "/x402/market/pricing",
      "method": "POST",
      "url": "https://animica.dev/x402/market/pricing",
      "documentation": "https://animica.dev/x402#product-market_pricing",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
      "available": true,
      "endpoints": [
        "POST /x402/market/pricing",
        "GET /x402/market/pricing"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "capability": {
              "type": "string",
              "required": true,
              "description": "what the endpoint does, in the words a merchant would use — the comparable set is matched from this text. 1..600 chars."
            },
            "strategy": {
              "type": "string",
              "required": false,
              "description": "where to sit in the observed distribution: undercut | match | premium (default match = the median ask)"
            },
            "target_percentile": {
              "type": "integer",
              "required": false,
              "description": "exact percentile of the ask distribution to target, 1..99. Overrides strategy."
            },
            "current_price_usd": {
              "type": "number",
              "required": false,
              "description": "what you charge today, if anything. Returns your exact rank in the comparable set and the delta to the recommendation. Max 100."
            },
            "cost_usd": {
              "type": "number",
              "required": false,
              "description": "your marginal cost per call. Acts as a hard floor on the recommendation and reports the margin at the recommended price; a market that prices below your cost is itself the finding."
            },
            "comparables": {
              "type": "integer",
              "required": false,
              "description": "how many comparable listings to return, 1..25 (default 10)"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "return an ML-DSA-65 attestation binding the recommendation to the index snapshot it was computed from (default false)"
            }
          },
          "queryParams": {
            "capability": {
              "type": "string",
              "description": "same as body.capability, for GET callers"
            },
            "q": {
              "type": "string",
              "description": "alias of capability"
            },
            "strategy": {
              "type": "string",
              "description": "same as body.strategy"
            },
            "target_percentile": {
              "type": "integer",
              "description": "same as body.target_percentile"
            },
            "current_price_usd": {
              "type": "number",
              "description": "same as body.current_price_usd"
            },
            "cost_usd": {
              "type": "number",
              "description": "same as body.cost_usd"
            },
            "comparables": {
              "type": "integer",
              "description": "same as body.comparables"
            },
            "attest": {
              "type": "boolean",
              "description": "same as body.attest — pass attest=1"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "recommendation {price_usd, price_nanousd, strategy, target_percentile, anchor, anchor_is_exact, is_an_observed_ask, price_rounded_to_usd, floor_applied, confidence_interval_95 {low_usd, high_usd, low_rank, high_rank, width_ratio, method, caveat}, confidence_interval_is_for, derivation[]}; sample {priced_comparables, matched_services, sufficient, minimum_required, grade, grade_bands[], excluded{}}; distribution {min_usd, median_usd, p90_usd, spread_p90_over_min, rounding}; position {percentile_target, percentile_rank_of_recommendation, listings_cheaper, listings_at_this_price, listings_dearer, ties_note}; your_price {price_usd, percentile_rank, listings_cheaper, listings_dearer, delta_to_recommendation_usd, change_bps, verdict} | null; cost_floor {cost_usd, clears_recommendation, margin_usd, margin_bps_of_price, percentile_rank_of_cost, verdict} | null; comparables[] {rank, resource, host, price_usd, price_source, word_coverage, demand{}}; matching {query_terms, terms_used, coverage_floor_used, widened}; index {directory, full_text}; price_values_sorted (audit vector, or null above the cap); limits[]; prices_are_asks; inference {used:false}; attestation? (ML-DSA-65 envelope); took_ms; computed_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/pricing",
          "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "capability": {
                  "type": "string",
                  "required": true,
                  "description": "what the endpoint does, in the words a merchant would use — the comparable set is matched from this text. 1..600 chars."
                },
                "strategy": {
                  "type": "string",
                  "required": false,
                  "description": "where to sit in the observed distribution: undercut | match | premium (default match = the median ask)"
                },
                "target_percentile": {
                  "type": "integer",
                  "required": false,
                  "description": "exact percentile of the ask distribution to target, 1..99. Overrides strategy."
                },
                "current_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "what you charge today, if anything. Returns your exact rank in the comparable set and the delta to the recommendation. Max 100."
                },
                "cost_usd": {
                  "type": "number",
                  "required": false,
                  "description": "your marginal cost per call. Acts as a hard floor on the recommendation and reports the margin at the recommended price; a market that prices below your cost is itself the finding."
                },
                "comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparable listings to return, 1..25 (default 10)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding the recommendation to the index snapshot it was computed from (default false)"
                }
              },
              "queryParams": {
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias of capability"
                },
                "strategy": {
                  "type": "string",
                  "description": "same as body.strategy"
                },
                "target_percentile": {
                  "type": "integer",
                  "description": "same as body.target_percentile"
                },
                "current_price_usd": {
                  "type": "number",
                  "description": "same as body.current_price_usd"
                },
                "cost_usd": {
                  "type": "number",
                  "description": "same as body.cost_usd"
                },
                "comparables": {
                  "type": "integer",
                  "description": "same as body.comparables"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {price_usd, price_nanousd, strategy, target_percentile, anchor, anchor_is_exact, is_an_observed_ask, price_rounded_to_usd, floor_applied, confidence_interval_95 {low_usd, high_usd, low_rank, high_rank, width_ratio, method, caveat}, confidence_interval_is_for, derivation[]}; sample {priced_comparables, matched_services, sufficient, minimum_required, grade, grade_bands[], excluded{}}; distribution {min_usd, median_usd, p90_usd, spread_p90_over_min, rounding}; position {percentile_target, percentile_rank_of_recommendation, listings_cheaper, listings_at_this_price, listings_dearer, ties_note}; your_price {price_usd, percentile_rank, listings_cheaper, listings_dearer, delta_to_recommendation_usd, change_bps, verdict} | null; cost_floor {cost_usd, clears_recommendation, margin_usd, margin_bps_of_price, percentile_rank_of_cost, verdict} | null; comparables[] {rank, resource, host, price_usd, price_source, word_coverage, demand{}}; matching {query_terms, terms_used, coverage_floor_used, widened}; index {directory, full_text}; price_values_sorted (audit vector, or null above the cap); limits[]; prices_are_asks; inference {used:false}; attestation? (ML-DSA-65 envelope); took_ms; computed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/pricing",
          "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "capability": {
                  "type": "string",
                  "required": true,
                  "description": "what the endpoint does, in the words a merchant would use — the comparable set is matched from this text. 1..600 chars."
                },
                "strategy": {
                  "type": "string",
                  "required": false,
                  "description": "where to sit in the observed distribution: undercut | match | premium (default match = the median ask)"
                },
                "target_percentile": {
                  "type": "integer",
                  "required": false,
                  "description": "exact percentile of the ask distribution to target, 1..99. Overrides strategy."
                },
                "current_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "what you charge today, if anything. Returns your exact rank in the comparable set and the delta to the recommendation. Max 100."
                },
                "cost_usd": {
                  "type": "number",
                  "required": false,
                  "description": "your marginal cost per call. Acts as a hard floor on the recommendation and reports the margin at the recommended price; a market that prices below your cost is itself the finding."
                },
                "comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparable listings to return, 1..25 (default 10)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding the recommendation to the index snapshot it was computed from (default false)"
                }
              },
              "queryParams": {
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias of capability"
                },
                "strategy": {
                  "type": "string",
                  "description": "same as body.strategy"
                },
                "target_percentile": {
                  "type": "integer",
                  "description": "same as body.target_percentile"
                },
                "current_price_usd": {
                  "type": "number",
                  "description": "same as body.current_price_usd"
                },
                "cost_usd": {
                  "type": "number",
                  "description": "same as body.cost_usd"
                },
                "comparables": {
                  "type": "integer",
                  "description": "same as body.comparables"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {price_usd, price_nanousd, strategy, target_percentile, anchor, anchor_is_exact, is_an_observed_ask, price_rounded_to_usd, floor_applied, confidence_interval_95 {low_usd, high_usd, low_rank, high_rank, width_ratio, method, caveat}, confidence_interval_is_for, derivation[]}; sample {priced_comparables, matched_services, sufficient, minimum_required, grade, grade_bands[], excluded{}}; distribution {min_usd, median_usd, p90_usd, spread_p90_over_min, rounding}; position {percentile_target, percentile_rank_of_recommendation, listings_cheaper, listings_at_this_price, listings_dearer, ties_note}; your_price {price_usd, percentile_rank, listings_cheaper, listings_dearer, delta_to_recommendation_usd, change_bps, verdict} | null; cost_floor {cost_usd, clears_recommendation, margin_usd, margin_bps_of_price, percentile_rank_of_cost, verdict} | null; comparables[] {rank, resource, host, price_usd, price_source, word_coverage, demand{}}; matching {query_terms, terms_used, coverage_floor_used, widened}; index {directory, full_text}; price_values_sorted (audit vector, or null above the cap); limits[]; prices_are_asks; inference {used:false}; attestation? (ML-DSA-65 envelope); took_ms; computed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "market_reliability",
      "name": "x402 endpoint reliability — what we observed",
      "path": "/x402/market/reliability",
      "method": "POST",
      "url": "https://animica.dev/x402/market/reliability",
      "documentation": "https://animica.dev/x402#product-market_reliability",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
      "available": true,
      "endpoints": [
        "POST /x402/market/reliability",
        "GET /x402/market/reliability"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "resource": {
              "type": "string",
              "required": true,
              "description": "the absolute http(s) URL of the x402 endpoint to report on, e.g. https://api.example.com/x402/thing"
            },
            "attest": {
              "type": "boolean",
              "required": false,
              "description": "return the observation inside an ML-DSA-65 signed envelope (scheme 4099) bound to an Animica chain height, verifiable offline (default false). If it cannot be produced, the call fails and you are not charged."
            }
          },
          "queryParams": {
            "resource": {
              "type": "string",
              "description": "same as body.resource, for GET callers"
            },
            "url": {
              "type": "string",
              "description": "alias of resource"
            },
            "attest": {
              "type": "string",
              "description": "same as body.attest — pass attest=1"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "resource, key (the canonical form we index on), observed, observation {outcome, verdict, serves_x402, means, buyer_action, http_status, method, latency_ms, error, probed_at, age_seconds, fresh, stale_after_seconds, probes_recorded}, payment_terms {price_published_in_challenge, price_observed_usd, note}, uptime {available:false, success_rate:null, why_not_estimated}, call_spec {known, published, source, method, has_input_schema, spec}, directory {listed (null when the harvest was unreadable), listed_unknown_reason, lookup_available, price_usd, price_source, network, asset, pay_to, demand, reported_by_directory}, coverage {directory_services, harvest_age_seconds}, inference {used:false}, chain_anchor? (attest only), attestation? (ML-DSA-65 envelope), generated_at, took_ms"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/reliability",
          "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of the x402 endpoint to report on, e.g. https://api.example.com/x402/thing"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return the observation inside an ML-DSA-65 signed envelope (scheme 4099) bound to an Animica chain height, verifiable offline (default false). If it cannot be produced, the call fails and you are not charged."
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "url": {
                  "type": "string",
                  "description": "alias of resource"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "resource, key (the canonical form we index on), observed, observation {outcome, verdict, serves_x402, means, buyer_action, http_status, method, latency_ms, error, probed_at, age_seconds, fresh, stale_after_seconds, probes_recorded}, payment_terms {price_published_in_challenge, price_observed_usd, note}, uptime {available:false, success_rate:null, why_not_estimated}, call_spec {known, published, source, method, has_input_schema, spec}, directory {listed (null when the harvest was unreadable), listed_unknown_reason, lookup_available, price_usd, price_source, network, asset, pay_to, demand, reported_by_directory}, coverage {directory_services, harvest_age_seconds}, inference {used:false}, chain_anchor? (attest only), attestation? (ML-DSA-65 envelope), generated_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/reliability",
          "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of the x402 endpoint to report on, e.g. https://api.example.com/x402/thing"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return the observation inside an ML-DSA-65 signed envelope (scheme 4099) bound to an Animica chain height, verifiable offline (default false). If it cannot be produced, the call fails and you are not charged."
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "url": {
                  "type": "string",
                  "description": "alias of resource"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "resource, key (the canonical form we index on), observed, observation {outcome, verdict, serves_x402, means, buyer_action, http_status, method, latency_ms, error, probed_at, age_seconds, fresh, stale_after_seconds, probes_recorded}, payment_terms {price_published_in_challenge, price_observed_usd, note}, uptime {available:false, success_rate:null, why_not_estimated}, call_spec {known, published, source, method, has_input_schema, spec}, directory {listed (null when the harvest was unreadable), listed_unknown_reason, lookup_available, price_usd, price_source, network, asset, pay_to, demand, reported_by_directory}, coverage {directory_services, harvest_age_seconds}, inference {used:false}, chain_anchor? (attest only), attestation? (ML-DSA-65 envelope), generated_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_signing_policy",
      "name": "Animica signature-scheme advisory",
      "path": "/x402/chain/signing-policy",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/signing-policy",
      "documentation": "https://animica.dev/x402#product-chain_signing_policy",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/signing-policy",
        "GET /x402/chain/signing-policy"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "include_disabled": {
              "type": "boolean",
              "required": false,
              "description": "include schemes the chain reports as disabled (default false). Useful when auditing why a historical transaction verifies but a new one is refused."
            }
          },
          "queryParams": {
            "include_disabled": {
              "type": "string",
              "description": "same as body.include_disabled for GET callers (\"1\"/\"true\" to include)"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {chain_id, read_at, policy_hash, policy_source}; recommended {name, consensus_scheme_id, pq_algorithm_id, pq_algorithm_id_hex, why}; schemes[] {name, consensus_scheme_id, enabled_on_chain, enabled_by_code, enabled_by_policy, reason_if_disabled, pubkey_lengths_bytes, signature_lengths_bytes, pq_algorithm_id, pq_algorithm_id_hex, usable_for_new_keys, verdict, detail, annotated}; warnings[]; id_spaces; what_is_measured; annotation_source; how_to_verify; inference {used:false}."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/signing-policy",
          "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "include_disabled": {
                  "type": "boolean",
                  "required": false,
                  "description": "include schemes the chain reports as disabled (default false). Useful when auditing why a historical transaction verifies but a new one is refused."
                }
              },
              "queryParams": {
                "include_disabled": {
                  "type": "string",
                  "description": "same as body.include_disabled for GET callers (\"1\"/\"true\" to include)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_id, read_at, policy_hash, policy_source}; recommended {name, consensus_scheme_id, pq_algorithm_id, pq_algorithm_id_hex, why}; schemes[] {name, consensus_scheme_id, enabled_on_chain, enabled_by_code, enabled_by_policy, reason_if_disabled, pubkey_lengths_bytes, signature_lengths_bytes, pq_algorithm_id, pq_algorithm_id_hex, usable_for_new_keys, verdict, detail, annotated}; warnings[]; id_spaces; what_is_measured; annotation_source; how_to_verify; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/signing-policy",
          "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "include_disabled": {
                  "type": "boolean",
                  "required": false,
                  "description": "include schemes the chain reports as disabled (default false). Useful when auditing why a historical transaction verifies but a new one is refused."
                }
              },
              "queryParams": {
                "include_disabled": {
                  "type": "string",
                  "description": "same as body.include_disabled for GET callers (\"1\"/\"true\" to include)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_id, read_at, policy_hash, policy_source}; recommended {name, consensus_scheme_id, pq_algorithm_id, pq_algorithm_id_hex, why}; schemes[] {name, consensus_scheme_id, enabled_on_chain, enabled_by_code, enabled_by_policy, reason_if_disabled, pubkey_lengths_bytes, signature_lengths_bytes, pq_algorithm_id, pq_algorithm_id_hex, usable_for_new_keys, verdict, detail, annotated}; warnings[]; id_spaces; what_is_measured; annotation_source; how_to_verify; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_identity",
      "name": "Animica chain identity and replay-protection check",
      "path": "/x402/chain/identity",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/identity",
      "documentation": "https://animica.dev/x402#product-chain_identity",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/identity",
        "GET /x402/chain/identity"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "expect_chain_id": {
              "type": "integer",
              "required": false,
              "description": "the chain id you BELIEVE you are talking to. When given, the response carries an explicit matches_native / matches_evm_facade verdict instead of leaving you to compare two numbers yourself — which is the comparison people get wrong."
            },
            "expect_genesis_hash": {
              "type": "string",
              "required": false,
              "description": "the genesis hash you have pinned (0x… 32 bytes). Compared byte-for-byte; a mismatch is reported as a hard failure, since it means this is not the chain you think it is."
            }
          },
          "queryParams": {
            "expect_chain_id": {
              "type": "string",
              "description": "same as body.expect_chain_id for GET callers"
            },
            "expect_genesis_hash": {
              "type": "string",
              "description": "same as body.expect_genesis_hash for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {read_at, head_height, head_hash}; native {chain_id, genesis_hash, genesis_header_hash, fork_id, policy_hash}; evm_facade {eth_chain_id, eth_chain_id_decimal, net_version, agrees_with_native, why_it_matters}; checkpoints {source, count, entries[] {height, hash}}; expectation {checked, chain_id {expected, matches_native, matches_evm_facade}, genesis_hash {expected, matches}}; warnings[]; read_errors; inference {used:false}."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/identity",
          "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "expect_chain_id": {
                  "type": "integer",
                  "required": false,
                  "description": "the chain id you BELIEVE you are talking to. When given, the response carries an explicit matches_native / matches_evm_facade verdict instead of leaving you to compare two numbers yourself — which is the comparison people get wrong."
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "required": false,
                  "description": "the genesis hash you have pinned (0x… 32 bytes). Compared byte-for-byte; a mismatch is reported as a hard failure, since it means this is not the chain you think it is."
                }
              },
              "queryParams": {
                "expect_chain_id": {
                  "type": "string",
                  "description": "same as body.expect_chain_id for GET callers"
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "description": "same as body.expect_genesis_hash for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at, head_height, head_hash}; native {chain_id, genesis_hash, genesis_header_hash, fork_id, policy_hash}; evm_facade {eth_chain_id, eth_chain_id_decimal, net_version, agrees_with_native, why_it_matters}; checkpoints {source, count, entries[] {height, hash}}; expectation {checked, chain_id {expected, matches_native, matches_evm_facade}, genesis_hash {expected, matches}}; warnings[]; read_errors; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/identity",
          "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "expect_chain_id": {
                  "type": "integer",
                  "required": false,
                  "description": "the chain id you BELIEVE you are talking to. When given, the response carries an explicit matches_native / matches_evm_facade verdict instead of leaving you to compare two numbers yourself — which is the comparison people get wrong."
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "required": false,
                  "description": "the genesis hash you have pinned (0x… 32 bytes). Compared byte-for-byte; a mismatch is reported as a hard failure, since it means this is not the chain you think it is."
                }
              },
              "queryParams": {
                "expect_chain_id": {
                  "type": "string",
                  "description": "same as body.expect_chain_id for GET callers"
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "description": "same as body.expect_genesis_hash for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at, head_height, head_hash}; native {chain_id, genesis_hash, genesis_header_hash, fork_id, policy_hash}; evm_facade {eth_chain_id, eth_chain_id_decimal, net_version, agrees_with_native, why_it_matters}; checkpoints {source, count, entries[] {height, hash}}; expectation {checked, chain_id {expected, matches_native, matches_evm_facade}, genesis_hash {expected, matches}}; warnings[]; read_errors; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "chain_health",
      "name": "Animica chain health, without the peer list",
      "path": "/x402/chain/health",
      "method": "POST",
      "url": "https://animica.dev/x402/chain/health",
      "documentation": "https://animica.dev/x402#product-chain_health",
      "price": "0.007000",
      "price_atomic": "7000",
      "currency": "USDC",
      "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
      "available": true,
      "endpoints": [
        "POST /x402/chain/health",
        "GET /x402/chain/health"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "max_sync_lag_blocks": {
              "type": "integer",
              "required": false,
              "description": "how many blocks of headers-ahead-of-blocks you are willing to tolerate (default 3). The response carries an explicit healthy true/false against YOUR threshold rather than leaving you to pick one from raw numbers."
            }
          },
          "queryParams": {
            "max_sync_lag_blocks": {
              "type": "string",
              "description": "same as body.max_sync_lag_blocks for GET callers"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {read_at}; head {height, hash, canonical_height}; sync {blocks, headers, lag_blocks, syncing, verification_progress, within_threshold, threshold_blocks}; difficulty {difficulty, theta_micro}; hashrate {value, unit, window_blocks, window_seconds, height_start, height_end, estimator, caveat}; mempool {size, bytes, max_bytes}; peers {range {min, max}, agree, observations, note}; verdict {transactable, reasons[]}; warnings[]; read_errors; not_published; inference {used:false}."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/health",
          "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "max_sync_lag_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks of headers-ahead-of-blocks you are willing to tolerate (default 3). The response carries an explicit healthy true/false against YOUR threshold rather than leaving you to pick one from raw numbers."
                }
              },
              "queryParams": {
                "max_sync_lag_blocks": {
                  "type": "string",
                  "description": "same as body.max_sync_lag_blocks for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; head {height, hash, canonical_height}; sync {blocks, headers, lag_blocks, syncing, verification_progress, within_threshold, threshold_blocks}; difficulty {difficulty, theta_micro}; hashrate {value, unit, window_blocks, window_seconds, height_start, height_end, estimator, caveat}; mempool {size, bytes, max_bytes}; peers {range {min, max}, agree, observations, note}; verdict {transactable, reasons[]}; warnings[]; read_errors; not_published; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "83732057416",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/health",
          "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "max_sync_lag_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks of headers-ahead-of-blocks you are willing to tolerate (default 3). The response carries an explicit healthy true/false against YOUR threshold rather than leaving you to pick one from raw numbers."
                }
              },
              "queryParams": {
                "max_sync_lag_blocks": {
                  "type": "string",
                  "description": "same as body.max_sync_lag_blocks for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; head {height, hash, canonical_height}; sync {blocks, headers, lag_blocks, syncing, verification_progress, within_threshold, threshold_blocks}; difficulty {difficulty, theta_micro}; hashrate {value, unit, window_blocks, window_seconds, height_start, height_end, estimator, caveat}; mempool {size, bytes, max_bytes}; peers {range {min, max}, agree, observations, note}; verdict {transactable, reasons[]}; warnings[]; read_errors; not_published; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "83.732057416 ANM",
            "usd_equivalent": "0.005250",
            "usd_list_price": "0.007000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "tx_preflight",
      "name": "Animica transaction preflight — decode and admission dry-run",
      "path": "/x402/tx/preflight",
      "method": "POST",
      "url": "https://animica.dev/x402/tx/preflight",
      "documentation": "https://animica.dev/x402#product-tx_preflight",
      "price": "0.006000",
      "price_atomic": "6000",
      "currency": "USDC",
      "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
      "available": true,
      "endpoints": [
        "POST /x402/tx/preflight",
        "GET /x402/tx/preflight"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "raw_tx": {
              "type": "string",
              "required": true,
              "description": "the transaction as hex, 0x-prefixed or not. Animica expects canonical CBOR of {body, sigs} with strictly-increasing map keys — non-canonical key order is the most common first failure and the decoder names it explicitly."
            },
            "skip_admission": {
              "type": "boolean",
              "required": false,
              "description": "decode only, skipping the admission dry-run (default false). Useful when you are iterating on encoding and do not yet have signatures attached."
            }
          },
          "queryParams": {
            "raw_tx": {
              "type": "string",
              "description": "same as body.raw_tx for GET callers"
            },
            "skip_admission": {
              "type": "string",
              "description": "same as body.skip_admission (\"1\"/\"true\")"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "as_of {read_at}; input {bytes, hex_chars}; decode {ok, canonical_hash, type, decoded_length, transaction, error {message, code, kind, cause, hint}}; admission {checked, allowed, txid, wtxid, reject_reason, error, note}; next_step; what_we_have_observed; broadcast {performed:false, how_to}; inference {used:false}."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/tx/preflight",
          "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "raw_tx": {
                  "type": "string",
                  "required": true,
                  "description": "the transaction as hex, 0x-prefixed or not. Animica expects canonical CBOR of {body, sigs} with strictly-increasing map keys — non-canonical key order is the most common first failure and the decoder names it explicitly."
                },
                "skip_admission": {
                  "type": "boolean",
                  "required": false,
                  "description": "decode only, skipping the admission dry-run (default false). Useful when you are iterating on encoding and do not yet have signatures attached."
                }
              },
              "queryParams": {
                "raw_tx": {
                  "type": "string",
                  "description": "same as body.raw_tx for GET callers"
                },
                "skip_admission": {
                  "type": "string",
                  "description": "same as body.skip_admission (\"1\"/\"true\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; input {bytes, hex_chars}; decode {ok, canonical_hash, type, decoded_length, transaction, error {message, code, kind, cause, hint}}; admission {checked, allowed, txid, wtxid, reject_reason, error, note}; next_step; what_we_have_observed; broadcast {performed:false, how_to}; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/tx/preflight",
          "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "raw_tx": {
                  "type": "string",
                  "required": true,
                  "description": "the transaction as hex, 0x-prefixed or not. Animica expects canonical CBOR of {body, sigs} with strictly-increasing map keys — non-canonical key order is the most common first failure and the decoder names it explicitly."
                },
                "skip_admission": {
                  "type": "boolean",
                  "required": false,
                  "description": "decode only, skipping the admission dry-run (default false). Useful when you are iterating on encoding and do not yet have signatures attached."
                }
              },
              "queryParams": {
                "raw_tx": {
                  "type": "string",
                  "description": "same as body.raw_tx for GET callers"
                },
                "skip_admission": {
                  "type": "string",
                  "description": "same as body.skip_admission (\"1\"/\"true\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; input {bytes, hex_chars}; decode {ok, canonical_hash, type, decoded_length, transaction, error {message, code, kind, cause, hint}}; admission {checked, allowed, txid, wtxid, reject_reason, error, note}; next_step; what_we_have_observed; broadcast {performed:false, how_to}; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "alpha_risk",
      "name": "Portfolio risk engine — deterministic, bring your own data",
      "path": "/x402/alpha/risk",
      "method": "POST",
      "url": "https://animica.dev/x402/alpha/risk",
      "documentation": "https://animica.dev/x402#product-alpha_risk",
      "price": "0.020000",
      "price_atomic": "20000",
      "currency": "USDC",
      "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
      "available": true,
      "endpoints": [
        "POST /x402/alpha/risk"
      ],
      "mimeType": "application/json",
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "positions": {
              "type": "object",
              "required": true,
              "description": "up to 64 positions keyed by name: {\"BTC\": {\"weight\": 0.6, \"returns\": [...]}}. Supply either returns[] (simple, oldest first) or prices[] and we derive them. At least 20 observations per position, and every series must cover the SAME periods — misaligned series make every correlation meaningless. Negative weight is a short."
            },
            "confidence": {
              "type": "number",
              "required": false,
              "description": "VaR/ES confidence level in (0,1), default 0.95. 0.99 needs a longer series to mean anything."
            },
            "periods_per_year": {
              "type": "integer",
              "required": false,
              "description": "periods per year for annualisation (252 daily, 8760 hourly, 52 weekly). Omit it and nothing is annualised — we do not guess the frequency of a series we did not collect, because a daily series annualised as hourly is wrong by about 5x and looks plausible."
            },
            "portfolio_value_usd": {
              "type": "number",
              "required": false,
              "description": "total book value; when given, VaR and expected shortfall are also returned in dollars."
            },
            "data_timestamp": {
              "type": "string",
              "required": false,
              "description": "ISO timestamp of the most recent observation. Carried through to provenance so an agent can judge how old the analysis is."
            }
          }
        },
        "output": {
          "type": "json",
          "description": "schema_version, product, request_id, generated_at, basis:\"calculation\", result {portfolio {volatility, value_at_risk, expected_shortfall, max_drawdown, equity_curve_final}, positions[] {name, weight, weight_share, volatility, contribution_share}, concentration {hhi, effective_positions, largest_weight}, correlation {names, matrix}, dollar_risk?}, methodology, provenance {inputs_digest, age_seconds, methodology_version}, warnings[], inference {used:false}, confidence_note."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/alpha/risk",
          "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "positions": {
                  "type": "object",
                  "required": true,
                  "description": "up to 64 positions keyed by name: {\"BTC\": {\"weight\": 0.6, \"returns\": [...]}}. Supply either returns[] (simple, oldest first) or prices[] and we derive them. At least 20 observations per position, and every series must cover the SAME periods — misaligned series make every correlation meaningless. Negative weight is a short."
                },
                "confidence": {
                  "type": "number",
                  "required": false,
                  "description": "VaR/ES confidence level in (0,1), default 0.95. 0.99 needs a longer series to mean anything."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "periods per year for annualisation (252 daily, 8760 hourly, 52 weekly). Omit it and nothing is annualised — we do not guess the frequency of a series we did not collect, because a daily series annualised as hourly is wrong by about 5x and looks plausible."
                },
                "portfolio_value_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total book value; when given, VaR and expected shortfall are also returned in dollars."
                },
                "data_timestamp": {
                  "type": "string",
                  "required": false,
                  "description": "ISO timestamp of the most recent observation. Carried through to provenance so an agent can judge how old the analysis is."
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, product, request_id, generated_at, basis:\"calculation\", result {portfolio {volatility, value_at_risk, expected_shortfall, max_drawdown, equity_curve_final}, positions[] {name, weight, weight_share, volatility, contribution_share}, concentration {hhi, effective_positions, largest_weight}, correlation {names, matrix}, dollar_risk?}, methodology, provenance {inputs_digest, age_seconds, methodology_version}, warnings[], inference {used:false}, confidence_note."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/alpha/risk",
          "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "positions": {
                  "type": "object",
                  "required": true,
                  "description": "up to 64 positions keyed by name: {\"BTC\": {\"weight\": 0.6, \"returns\": [...]}}. Supply either returns[] (simple, oldest first) or prices[] and we derive them. At least 20 observations per position, and every series must cover the SAME periods — misaligned series make every correlation meaningless. Negative weight is a short."
                },
                "confidence": {
                  "type": "number",
                  "required": false,
                  "description": "VaR/ES confidence level in (0,1), default 0.95. 0.99 needs a longer series to mean anything."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "periods per year for annualisation (252 daily, 8760 hourly, 52 weekly). Omit it and nothing is annualised — we do not guess the frequency of a series we did not collect, because a daily series annualised as hourly is wrong by about 5x and looks plausible."
                },
                "portfolio_value_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total book value; when given, VaR and expected shortfall are also returned in dollars."
                },
                "data_timestamp": {
                  "type": "string",
                  "required": false,
                  "description": "ISO timestamp of the most recent observation. Carried through to provenance so an agent can judge how old the analysis is."
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, product, request_id, generated_at, basis:\"calculation\", result {portfolio {volatility, value_at_risk, expected_shortfall, max_drawdown, equity_curve_final}, positions[] {name, weight, weight_share, volatility, contribution_share}, concentration {hhi, effective_positions, largest_weight}, correlation {names, matrix}, dollar_risk?}, methodology, provenance {inputs_digest, age_seconds, methodology_version}, warnings[], inference {used:false}, confidence_note."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    },
    {
      "id": "alpha_backtest",
      "name": "Deterministic backtest with a structural look-ahead guarantee",
      "path": "/x402/alpha/backtest",
      "method": "POST",
      "url": "https://animica.dev/x402/alpha/backtest",
      "documentation": "https://animica.dev/x402#product-alpha_backtest",
      "price": "0.030000",
      "price_atomic": "30000",
      "currency": "USDC",
      "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
      "available": true,
      "endpoints": [
        "POST /x402/alpha/backtest"
      ],
      "mimeType": "application/json",
      "free_endpoints": [
        {
          "endpoint": "GET /x402/alpha/strategies",
          "url": "https://animica.dev/x402/alpha/strategies",
          "price": "0",
          "description": "Every strategy kind /x402/alpha/backtest accepts, with parameter names, types and valid ranges. Free: a closed vocabulary is only useful to an agent if it can read it before paying."
        }
      ],
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "POST",
          "bodyType": "json",
          "bodyFields": {
            "bars": {
              "type": "array",
              "required": true,
              "description": "price bars oldest first, up to 20000: [{\"t\": 1700000000, \"close\": 100.5}]. `t` is optional but when present must be strictly increasing — out-of-order or duplicated bars are refused rather than sorted, because sorting hides that your data source is wrong."
            },
            "strategy": {
              "type": "object",
              "required": true,
              "description": "a strategy from the closed vocabulary, e.g. {\"kind\":\"sma_cross\",\"params\":{\"fast\":10,\"slow\":30}}. GET /x402/alpha/strategies lists every kind and its parameter ranges, free."
            },
            "costs": {
              "type": "object",
              "required": false,
              "description": "per-side costs in basis points: {\"fee_bps\":10,\"spread_bps\":5,\"slippage_bps\":5}. Defaults are deliberately unflattering. Setting them all to zero is allowed and warned about."
            },
            "periods_per_year": {
              "type": "integer",
              "required": false,
              "description": "for annualising Sharpe/Sortino/CAGR (252 daily, 8760 hourly). Omit and nothing is annualised."
            },
            "allow_short": {
              "type": "boolean",
              "required": false,
              "description": "permit negative positions (default false)"
            },
            "stop_loss_pct": {
              "type": "number",
              "required": false,
              "description": "exit when the position is down this fraction from entry, e.g. 0.05"
            },
            "take_profit_pct": {
              "type": "number",
              "required": false,
              "description": "exit when up this fraction from entry"
            }
          }
        },
        "output": {
          "type": "json",
          "description": "schema_version, basis:\"calculation\", result {lookahead_guarantee, performance {total_return, cagr, volatility, sharpe, sortino, max_drawdown, win_rate, profit_factor, trade_count, turnover, total_cost_fraction}, benchmark {name, total_return, excess_return}, costs_applied, equity_curve[], trades[]}, methodology, provenance, warnings[], inference {used:false}."
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "30000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/alpha/backtest",
          "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "bars": {
                  "type": "array",
                  "required": true,
                  "description": "price bars oldest first, up to 20000: [{\"t\": 1700000000, \"close\": 100.5}]. `t` is optional but when present must be strictly increasing — out-of-order or duplicated bars are refused rather than sorted, because sorting hides that your data source is wrong."
                },
                "strategy": {
                  "type": "object",
                  "required": true,
                  "description": "a strategy from the closed vocabulary, e.g. {\"kind\":\"sma_cross\",\"params\":{\"fast\":10,\"slow\":30}}. GET /x402/alpha/strategies lists every kind and its parameter ranges, free."
                },
                "costs": {
                  "type": "object",
                  "required": false,
                  "description": "per-side costs in basis points: {\"fee_bps\":10,\"spread_bps\":5,\"slippage_bps\":5}. Defaults are deliberately unflattering. Setting them all to zero is allowed and warned about."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "for annualising Sharpe/Sortino/CAGR (252 daily, 8760 hourly). Omit and nothing is annualised."
                },
                "allow_short": {
                  "type": "boolean",
                  "required": false,
                  "description": "permit negative positions (default false)"
                },
                "stop_loss_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when the position is down this fraction from entry, e.g. 0.05"
                },
                "take_profit_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when up this fraction from entry"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, basis:\"calculation\", result {lookahead_guarantee, performance {total_return, cagr, volatility, sharpe, sortino, max_drawdown, win_rate, profit_factor, trade_count, turnover, total_cost_fraction}, benchmark {name, total_return, excess_return}, costs_applied, equity_curve[], trades[]}, methodology, provenance, warnings[], inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "358851674641",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/alpha/backtest",
          "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "bars": {
                  "type": "array",
                  "required": true,
                  "description": "price bars oldest first, up to 20000: [{\"t\": 1700000000, \"close\": 100.5}]. `t` is optional but when present must be strictly increasing — out-of-order or duplicated bars are refused rather than sorted, because sorting hides that your data source is wrong."
                },
                "strategy": {
                  "type": "object",
                  "required": true,
                  "description": "a strategy from the closed vocabulary, e.g. {\"kind\":\"sma_cross\",\"params\":{\"fast\":10,\"slow\":30}}. GET /x402/alpha/strategies lists every kind and its parameter ranges, free."
                },
                "costs": {
                  "type": "object",
                  "required": false,
                  "description": "per-side costs in basis points: {\"fee_bps\":10,\"spread_bps\":5,\"slippage_bps\":5}. Defaults are deliberately unflattering. Setting them all to zero is allowed and warned about."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "for annualising Sharpe/Sortino/CAGR (252 daily, 8760 hourly). Omit and nothing is annualised."
                },
                "allow_short": {
                  "type": "boolean",
                  "required": false,
                  "description": "permit negative positions (default false)"
                },
                "stop_loss_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when the position is down this fraction from entry, e.g. 0.05"
                },
                "take_profit_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when up this fraction from entry"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, basis:\"calculation\", result {lookahead_guarantee, performance {total_return, cagr, volatility, sharpe, sortino, max_drawdown, win_rate, profit_factor, trade_count, turnover, total_cost_fraction}, benchmark {name, total_return, excess_return}, costs_applied, equity_curve[], trades[]}, methodology, provenance, warnings[], inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "358.851674641 ANM",
            "usd_equivalent": "0.022500",
            "usd_list_price": "0.030000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ]
    }
  ],
  "items": [
    {
      "resource": "https://animica.dev/x402/qrng/draw",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/qrng/draw",
          "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "bytes": {
                  "type": "integer",
                  "description": "number of random bytes, 1..1024 (default 32); alias: n"
                }
              },
              "alternateMethods": [
                {
                  "method": "POST",
                  "path": "/x402/qrng",
                  "bodyType": "json",
                  "bodyFields": {
                    "bytes": {
                      "type": "integer",
                      "required": false,
                      "description": "number of random bytes, 1..1024 (default 32); alias: n"
                    }
                  },
                  "note": "query parameters also work on POST; supplying both with different values is a 400 rather than a silent winner"
                }
              ]
            },
            "output": {
              "type": "json",
              "description": "randomness (hex), bytes, source, health {passed, min_entropy_per_byte}, attestation {alg, public_key_hex, digest_hex, signature_hex, attested}, verification rules, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/qrng/draw",
          "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "bytes": {
                  "type": "integer",
                  "description": "number of random bytes, 1..1024 (default 32); alias: n"
                }
              },
              "alternateMethods": [
                {
                  "method": "POST",
                  "path": "/x402/qrng",
                  "bodyType": "json",
                  "bodyFields": {
                    "bytes": {
                      "type": "integer",
                      "required": false,
                      "description": "number of random bytes, 1..1024 (default 32); alias: n"
                    }
                  },
                  "note": "query parameters also work on POST; supplying both with different values is a 400 rather than a silent winner"
                }
              ]
            },
            "output": {
              "type": "json",
              "description": "randomness (hex), bytes, source, health {passed, min_entropy_per_byte}, attestation {alg, public_key_hex, digest_hex, signature_hex, attested}, verification rules, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "qrng",
        "name": "Signed random bytes",
        "description": "Random bytes from the Animica node's randomness service with a signed digest attestation and an entropy-health report, 1..1024 bytes per draw. Current trust model, stated up front and in every response: the entropy source is a software CSPRNG (os.urandom) and the signer is a software key, so source.is_quantum=false and attestation.attested=false today; those fields flip truthfully if a hardware/quantum provider is ever connected. The free catalog entry carries the same live entropy block, so you can check the source before paying.",
        "method": "GET",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-qrng",
        "free_trial": "https://animica.dev/x402/qrng/draw/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/export",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/export",
          "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
          "mimeType": "application/x-ndjson",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "type": {
                  "type": "string",
                  "description": "blocks | transactions (export route only; /blocks and /transactions imply it)"
                },
                "from": {
                  "type": "integer",
                  "description": "first block height (required; also the pagination cursor)"
                },
                "to": {
                  "type": "integer",
                  "description": "last height inclusive (window <= 1000 blocks)"
                },
                "count": {
                  "type": "integer",
                  "description": "alternative to `to`: number of blocks from `from`"
                },
                "address": {
                  "type": "string",
                  "description": "transactions only: anim1… bech32m or 32-byte hex account digest; matches from/to"
                },
                "format": {
                  "type": "string",
                  "description": "ndjson (default) | json"
                }
              }
            },
            "output": {
              "type": "ndjson",
              "description": "meta line, one block/tx per line (amounts in nANM as decimal strings), summary line with next_cursor when truncated; ?format=json returns {meta, blocks|transactions, summary}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/export",
          "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
          "mimeType": "application/x-ndjson",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {
                "type": {
                  "type": "string",
                  "description": "blocks | transactions (export route only; /blocks and /transactions imply it)"
                },
                "from": {
                  "type": "integer",
                  "description": "first block height (required; also the pagination cursor)"
                },
                "to": {
                  "type": "integer",
                  "description": "last height inclusive (window <= 1000 blocks)"
                },
                "count": {
                  "type": "integer",
                  "description": "alternative to `to`: number of blocks from `from`"
                },
                "address": {
                  "type": "string",
                  "description": "transactions only: anim1… bech32m or 32-byte hex account digest; matches from/to"
                },
                "format": {
                  "type": "string",
                  "description": "ndjson (default) | json"
                }
              }
            },
            "output": {
              "type": "ndjson",
              "description": "meta line, one block/tx per line (amounts in nANM as decimal strings), summary line with next_cursor when truncated; ?format=json returns {meta, blocks|transactions, summary}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "bulk_chain",
        "name": "Bulk chain data export",
        "description": "Block-range and transaction-range exports from the Animica L1 (chunked reads, cursor pagination, NDJSON/JSON, gzip). Caps per request: 1000 blocks, 10000 tx records, 16000000 bytes. The free per-block APIs stay free.",
        "method": "GET",
        "mimeType": "application/x-ndjson",
        "available": true,
        "documentation": "https://animica.dev/x402#product-bulk_chain",
        "free_trial": "https://animica.dev/x402/chain/export/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/address-history",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/address-history",
          "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "address": {
                  "type": "string",
                  "description": "anim1… bech32m address (or a 32-byte hex account digest)"
                },
                "limit": {
                  "type": "integer",
                  "description": "rows per page, 1..500 (default 100)"
                },
                "cursor": {
                  "type": "string",
                  "description": "\"<as_of>:<height>:<tx_index>\" from a previous response's next_cursor; pages the same index snapshot"
                },
                "order": {
                  "type": "string",
                  "description": "desc (newest first, default) | asc"
                },
                "direction": {
                  "type": "string",
                  "description": "any (default) | in | out | self"
                },
                "from_height": {
                  "type": "integer",
                  "description": "inclusive lower height bound (default 0 = genesis)"
                },
                "to_height": {
                  "type": "integer",
                  "description": "inclusive upper height bound (default: the index tip)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "transactions[] {height, tx_index, tx_hash, direction, counterparty, value, tip, gas, kind, block_hash, timestamp} with amounts in nANM decimal strings, plus index {as_of_height, head_height, lag_blocks}, total, has_more, next_cursor, a derivation block documenting the digest/direction/ordering/cursor rules, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/address-history",
          "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "address": {
                  "type": "string",
                  "description": "anim1… bech32m address (or a 32-byte hex account digest)"
                },
                "limit": {
                  "type": "integer",
                  "description": "rows per page, 1..500 (default 100)"
                },
                "cursor": {
                  "type": "string",
                  "description": "\"<as_of>:<height>:<tx_index>\" from a previous response's next_cursor; pages the same index snapshot"
                },
                "order": {
                  "type": "string",
                  "description": "desc (newest first, default) | asc"
                },
                "direction": {
                  "type": "string",
                  "description": "any (default) | in | out | self"
                },
                "from_height": {
                  "type": "integer",
                  "description": "inclusive lower height bound (default 0 = genesis)"
                },
                "to_height": {
                  "type": "integer",
                  "description": "inclusive upper height bound (default: the index tip)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "transactions[] {height, tx_index, tx_hash, direction, counterparty, value, tip, gas, kind, block_hash, timestamp} with amounts in nANM decimal strings, plus index {as_of_height, head_height, lag_blocks}, total, has_more, next_cursor, a derivation block documenting the digest/direction/ordering/cursor rules, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "chain_address_history",
        "name": "Account transaction history",
        "description": "Full transaction history for one Animica account (anim1… bech32m), served from the gateway's own head-following index with a stable cursor — up to 500 rows per call, amounts in nANM as decimal strings. The free per-block and per-tx APIs stay free; single-address lookups on explorer.animica.org stay free too (they scan at most 250 blocks per call).",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_address_history",
        "free_trial": "https://animica.dev/x402/chain/address-history/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/balances",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/balances",
          "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "addresses": {
                  "type": "array",
                  "description": "1..500 anim1… bech32m addresses (32-byte hex account digests also accepted); duplicates are collapsed to one lookup but still answered in place"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "balances[] {address, account_digest, balance (nANM decimal string), spendable_balance?, exists?, error?} in request order, plus unique_addresses, total_balance, as_of {head_height, head_hash, entry_head_min/max, consistent} and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/balances",
          "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "addresses": {
                  "type": "array",
                  "description": "1..500 anim1… bech32m addresses (32-byte hex account digests also accepted); duplicates are collapsed to one lookup but still answered in place"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "balances[] {address, account_digest, balance (nANM decimal string), spendable_balance?, exists?, error?} in request order, plus unique_addresses, total_balance, as_of {head_height, head_hash, entry_head_min/max, consistent} and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "chain_batch_balances",
        "name": "Bulk account balances",
        "description": "Balances for up to 500 Animica accounts in ONE batched call, head-pinned, amounts in nANM as exact decimal strings. Single-address balance lookups stay free on the public API — this sells the batch.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_batch_balances",
        "free_trial": "https://animica.dev/x402/chain/balances/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/v1/chat/completions",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/v1/chat/completions",
          "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/v1/chat/completions",
          "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "priority_inference",
        "name": "Priority inference",
        "description": "OpenAI-compatible chat completions with capacity-gated admission, no per-IP rate limit, direct upstream routing and a 180 s timeout. Only sold while enough workers are live-serving; disabled by default.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-priority_inference",
        "free_trial": "https://animica.dev/x402/v1/chat/completions/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/v1/standard/chat/completions",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/v1/standard/chat/completions",
          "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/v1/standard/chat/completions",
          "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "model": {
                  "type": "string",
                  "description": "model id (see the free /v1/models)"
                },
                "messages": {
                  "type": "array",
                  "description": "OpenAI-style chat messages"
                },
                "max_tokens": {
                  "type": "integer",
                  "description": "completion budget"
                },
                "stream": {
                  "type": "boolean",
                  "description": "must be false/absent — streaming is not yet supported on the paid path"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "OpenAI-compatible chat.completion object from the Animica serving bridge"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "tier_standards",
        "name": "Tier Standards inference",
        "description": "Standard-tier chat/completions (OpenAI-compatible), served by Animica's network. Cheaper than priority, standard latency — priced at 3x settlement gas.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-tier_standards",
        "free_trial": "https://animica.dev/x402/v1/standard/chat/completions/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/credits/buy",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "500000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/credits/buy",
          "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "optional free-text label (<=64 chars) returned with your balance, so an agent can tell its own vouchers apart"
                }
              },
              "headers": {
                "X-Animica-Credits": {
                  "required": false,
                  "description": "an existing anmc_ token — when present the purchase TOPS UP that voucher and no new token is minted"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "voucher {token (shown ONCE, only on a new mint), voucher_id, balance_atomic, balance_usdc, bonus_atomic, expires_at}, how_to_use, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "5980861244019",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/credits/buy",
          "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "optional free-text label (<=64 chars) returned with your balance, so an agent can tell its own vouchers apart"
                }
              },
              "headers": {
                "X-Animica-Credits": {
                  "required": false,
                  "description": "an existing anmc_ token — when present the purchase TOPS UP that voucher and no new token is minted"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "voucher {token (shown ONCE, only on a new mint), voucher_id, balance_atomic, balance_usdc, bonus_atomic, expires_at}, how_to_use, and payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "5980.861244019 ANM",
            "usd_equivalent": "0.375000",
            "usd_list_price": "0.50",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "credits_buy",
        "name": "Prepaid call credits",
        "description": "Buy a prepaid credit voucher in ONE on-chain settlement, then spend it across every paid product on this gateway with no further settlement and no gas. Send the returned token as \"X-Animica-Credits: anmc_...\" (or \"Authorization: Bearer anmc_...\") on any paid route and the call is served from the balance instead of a payment. Credit is granted at face value plus 10% — that bonus is the Base settlement gas we do not spend on your calls 2..N, returned to you. The voucher is a BEARER secret shown exactly once and stored only as its SHA-256 hash: anyone holding it can spend it, and we cannot recover it for you. Balance and full spend history are readable for free at GET /x402/credits/balance with the token. Unused credit expires 365 days after purchase. Send the token on THIS route to top up an existing voucher instead of minting a new one.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-credits_buy"
      }
    },
    {
      "resource": "https://animica.dev/x402/web/fetch",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/web/fetch",
          "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "include_html": {
                  "type": "boolean",
                  "required": false,
                  "description": "also return raw HTML (default false)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate extracted text to this many characters"
                }
              },
              "queryParams": {
                "url": {
                  "type": "string",
                  "description": "same as body.url, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "url, final_url, status, title, description, text, chars, bytes, body_truncated, text_truncated, content_type, fetched_at, redirects[], and html when requested"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/web/fetch",
          "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "include_html": {
                  "type": "boolean",
                  "required": false,
                  "description": "also return raw HTML (default false)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate extracted text to this many characters"
                }
              },
              "queryParams": {
                "url": {
                  "type": "string",
                  "description": "same as body.url, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "url, final_url, status, title, description, text, chars, bytes, body_truncated, text_truncated, content_type, fetched_at, redirects[], and html when requested"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "fetch_extract",
        "name": "Fetch & extract web page text",
        "description": "Fetch a public web page and return clean readable text with its title and metadata - the form a model can actually use, with navigation, scripts and styling removed. Follows up to 3 redirects, caps the download at 2000000 bytes and gives up after 15000ms. Reaches the PUBLIC internet only: the hostname is resolved and every redirect hop re-checked against private, loopback, link-local and CGNAT ranges, so this cannot read internal services or cloud metadata. Returns raw HTML too on request.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-fetch_extract"
      }
    },
    {
      "resource": "https://animica.dev/x402/notarize",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/notarize",
          "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "a 32-byte SHA-256 digest as hex (with or without 0x). Supply this OR data."
                },
                "data": {
                  "type": "string",
                  "required": false,
                  "description": "base64 document to hash and anchor (we store the digest and the memo, never your bytes, unless store_data is true)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "optional label stored with the record, <=256 chars"
                },
                "store_data": {
                  "type": "boolean",
                  "required": false,
                  "description": "also store the supplied data itself, retrievable later (default false — by default only the digest is committed)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, namespace, digest, record (the exact bytes committed), proof {leaf_index, leaf_hash, siblings[], tree_height}, anchored_at {head_height, head_hash, observed_at}, verify_url, and what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/notarize",
          "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "a 32-byte SHA-256 digest as hex (with or without 0x). Supply this OR data."
                },
                "data": {
                  "type": "string",
                  "required": false,
                  "description": "base64 document to hash and anchor (we store the digest and the memo, never your bytes, unless store_data is true)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "optional label stored with the record, <=256 chars"
                },
                "store_data": {
                  "type": "boolean",
                  "required": false,
                  "description": "also store the supplied data itself, retrievable later (default false — by default only the digest is committed)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, namespace, digest, record (the exact bytes committed), proof {leaf_index, leaf_hash, siblings[], tree_height}, anchored_at {head_height, head_hash, observed_at}, verify_url, and what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "notarize",
        "name": "Notarise a digest on-chain",
        "description": "Anchor a SHA-256 digest (or a small document, which we hash for you) into the Animica data-availability layer and get back a commitment plus a Merkle inclusion proof anyone can check without trusting us. The record is erasure-coded across shards and committed to a Merkle root; the response carries the commitment, the leaf index and sibling path, and the chain head height and hash observed at the moment of anchoring. Verification is FREE and permanent at GET /x402/notarize/verify/{commitment} — a notarisation nobody can check would be worth nothing. Note precisely what this proves: the record is committed in this node's DA tree under the returned commitment, alongside the head it observed. That is not the same as a timestamp signed by the whole consensus set, and the response says so rather than blurring the two.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-notarize"
      }
    },
    {
      "resource": "https://animica.dev/x402/blob",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/blob",
          "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "data": {
                  "type": "string",
                  "required": true,
                  "description": "base64 payload"
                },
                "content_type": {
                  "type": "string",
                  "required": false,
                  "description": "informational label stored alongside, e.g. application/json"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, size_bytes, sha256, retrieve_url, shard layout"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/blob",
          "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "data": {
                  "type": "string",
                  "required": true,
                  "description": "base64 payload"
                },
                "content_type": {
                  "type": "string",
                  "required": false,
                  "description": "informational label stored alongside, e.g. application/json"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, blob_id, size_bytes, sha256, retrieve_url, shard layout"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "blob_put",
        "name": "Store a blob with a retrieval proof",
        "description": "Store up to 1024 KiB and get back a content commitment you can hand to anyone. The blob is erasure-coded across shards in the Animica data-availability layer and is retrievable for free by commitment at GET /x402/blob/{commitment}, with a Merkle inclusion proof. Useful when an agent needs to hand another agent a durable, addressable artifact rather than a link that rots. Stored blobs are PUBLIC to anyone holding the commitment — do not put secrets here.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-blob_put"
      }
    },
    {
      "resource": "https://animica.dev/x402/embed",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/embed",
          "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "texts": {
                  "type": "array",
                  "required": true,
                  "description": "1..256 strings"
                },
                "normalize": {
                  "type": "boolean",
                  "required": false,
                  "description": "vectors are already unit-normalised; set false only if you want them raw (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "model, dimensions, count, vectors[][] in request order, total_chars, and per-text char counts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/embed",
          "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "texts": {
                  "type": "array",
                  "required": true,
                  "description": "1..256 strings"
                },
                "normalize": {
                  "type": "boolean",
                  "required": false,
                  "description": "vectors are already unit-normalised; set false only if you want them raw (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "model, dimensions, count, vectors[][] in request order, total_chars, and per-text char counts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "embed_batch",
        "name": "Batch text embeddings",
        "description": "Embed up to 256 texts in ONE call with all-MiniLM-L6-v2 (384-dimensional, normalised for cosine similarity), up to 8192 characters each. Sold as a batch on purpose: a single settlement costs real gas, so a per-string price would be almost entirely payment overhead — one call, many vectors, is the only honest shape for this. This is a small fast local sentence-transformer, not a frontier embedding model; the model id rides on every response so a future change is visible rather than silent.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-embed_batch"
      }
    },
    {
      "resource": "https://animica.dev/x402/web/ask",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/web/ask",
          "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "what you want to know about that page"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "passages to retrieve (default 4)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "answer, grounded (bool), passages[] {text, score, index}, page {url, final_url, title, chars}, model, chunks_total, usage"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/web/ask",
          "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of a public page"
                },
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "what you want to know about that page"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "passages to retrieve (default 4)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "answer, grounded (bool), passages[] {text, score, index}, page {url, final_url, title, chars}, model, chunks_total, usage"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "ask_url",
        "name": "Ask a question about a web page",
        "description": "Give a URL and a question; get an answer grounded in that page, WITH the passages the answer was drawn from. We fetch the page, chunk it, embed the chunks and your question, retrieve the closest 4 passages and answer from those only. Nothing is stored — it is a one-shot pipeline, not an index. The retrieved passages come back with the answer so you can check it rather than trust it, and when nothing on the page is relevant the product says so instead of letting the model improvise. Reaches the public internet only, with the same SSRF protections as the fetch product.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-ask_url"
      }
    },
    {
      "resource": "https://animica.dev/x402/oracle/price",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/oracle/price",
          "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "attestation {symbol, usd_per_anm, side, source, observed_at, age_seconds, head_height, head_hash, issued_at, nonce}, signed, signature, signer_address, message_hash, canonical_message, verification instructions"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/oracle/price",
          "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "attestation {symbol, usd_per_anm, side, source, observed_at, age_seconds, head_height, head_hash, issued_at, nonce}, signed, signature, signer_address, message_hash, canonical_message, verification instructions"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "price_oracle",
        "name": "Signed ANM price attestation",
        "description": "The ANM/USD reference price this operator actually uses, attested at a specific chain head. Quoted from the NonKYC BID (the conservative side), with the observation timestamp and feed age included so you can judge freshness yourself. NOTE: no signing key is configured on this gateway, so attestations are returned UNSIGNED (signed:false). The price is still the live one we use; it simply carries no cryptographic attestation. A stale or indicative feed makes this product unavailable rather than quoting a dead rate.",
        "method": "GET",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-price_oracle"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/holders",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/holders",
          "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many holders to return, 1..1000 (default 100)"
                }
              },
              "queryParams": {
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {height}, total_addresses, count, holders[] {rank, address, balance_nanm, balance_anm, share_percent}, total_supply_observed"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "83732057416",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/holders",
          "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many holders to return, 1..1000 (default 100)"
                }
              },
              "queryParams": {
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {height}, total_addresses, count, holders[] {rank, address, balance_nanm, balance_anm, share_percent}, total_supply_observed"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "83.732057416 ANM",
            "usd_equivalent": "0.005250",
            "usd_list_price": "0.007000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "holder_snapshot",
        "name": "Holder snapshot / rich list",
        "description": "A ranked snapshot of ANM holders at a pinned chain height — up to 1000 accounts with exact nANM balances as decimal strings, plus the total address count and the head it was taken at. The shape airdrops, governance weighting and distribution analysis actually need, in one call instead of thousands of balance lookups.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-holder_snapshot"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/mempool",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/mempool",
          "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "mempool {count, total_bytes, oldest_age_seconds, pending_txids[], pending_returned, stats_count_disagrees?}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/mempool",
          "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "GET",
              "queryParams": {}
            },
            "output": {
              "type": "json",
              "description": "mempool {count, total_bytes, oldest_age_seconds, pending_txids[], pending_returned, stats_count_disagrees?}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "mempool_feed",
        "name": "Mempool and network telemetry",
        "description": "A point-in-time read of the Animica mempool and network: pending transaction count and ids, total pending bytes, the age of the oldest entry, chain head, peer count and network hashrate. What a bot watching for congestion, fee conditions or inclusion timing needs, without running a node.",
        "method": "GET",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mempool_feed"
      }
    },
    {
      "resource": "https://animica.dev/x402/pq/verify",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/verify",
          "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "alg_id": {
                  "type": "integer",
                  "required": true,
                  "description": "scheme id - 4099 (0x1003) is ML-DSA-65, the only scheme that can spend on Animica"
                },
                "message": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded message bytes"
                },
                "signature": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded signature"
                },
                "public_key": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded public key"
                },
                "sign_hash": {
                  "type": "string",
                  "required": false,
                  "description": "hex domain/sign-hash bytes, when the scheme binds one"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ok (the verdict), reason, scheme_id, scheme_name, pub_fingerprint, sizes, verified_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/verify",
          "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "alg_id": {
                  "type": "integer",
                  "required": true,
                  "description": "scheme id - 4099 (0x1003) is ML-DSA-65, the only scheme that can spend on Animica"
                },
                "message": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded message bytes"
                },
                "signature": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded signature"
                },
                "public_key": {
                  "type": "string",
                  "required": true,
                  "description": "hex-encoded public key"
                },
                "sign_hash": {
                  "type": "string",
                  "required": false,
                  "description": "hex domain/sign-hash bytes, when the scheme binds one"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ok (the verdict), reason, scheme_id, scheme_name, pub_fingerprint, sizes, verified_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "pq_verify",
        "name": "Post-quantum signature verification",
        "description": "Verify a post-quantum signature (ML-DSA-65 / Dilithium3 / SPHINCS+ as enabled by chain policy) against a message and public key, using the same verifier the Animica chain itself uses to admit transactions. Useful when an agent must check a PQ-signed attestation without shipping a post-quantum library of its own. A signature that does not verify is a SUCCESSFUL call answering ok:false - you paid for the answer, and \"invalid\" is an answer. Only an inability to perform the check is treated as a failure.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-pq_verify"
      }
    },
    {
      "resource": "https://animica.dev/x402/geo/audit",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7984",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/geo/audit",
          "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to audit; the origin is derived from it"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "score (0-100), grade, categories[] {id, label, weight, score, findings[]}, findings[] {id, category, status, detail, evidence, fix}, crawler_access[] {agent, operator, purpose, http_status, robots, verdict}, fixes[] (prioritised, highest impact first), pages_fetched, not_measured[], audited_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95502392344",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/geo/audit",
          "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to audit; the origin is derived from it"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "score (0-100), grade, categories[] {id, label, weight, score, findings[]}, findings[] {id, category, status, detail, evidence, fix}, crawler_access[] {agent, operator, purpose, http_status, robots, verdict}, fixes[] (prioritised, highest impact first), pages_fetched, not_measured[], audited_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.502392344 ANM",
            "usd_equivalent": "0.005988",
            "usd_list_price": "0.007984",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464416,
      "metadata": {
        "id": "geo_audit",
        "name": "GEO / agent-legibility audit",
        "description": "Audit whether a website can actually be read, quoted and cited by AI agents, and get a prioritised fix list. Probes the homepage as each real AI crawler (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, CCBot, meta-externalagent, Amazonbot) to catch the 429s, 403s and soft-404s that make a live site invisible; parses robots.txt per agent including the robots-only training tokens Google-Extended and Applebot-Extended; and checks llms.txt, structured data, machine-readable endpoints (OpenAPI, MCP, x402, well-known), sitemap, canonical and title/meta, plus how much of the page survives with JavaScript off. Fully deterministic — no model is called, so the same site scores the same twice. It does NOT ask ChatGPT or Perplexity whether they have heard of your brand; it measures the inputs that decide whether they can.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-geo_audit",
        "free_trial": "https://animica.dev/x402/geo/audit/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/search",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/search",
          "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to search for (1..400 characters)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..20 (default 10)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, title, url, snippet, published, engines[]}, count, provider, engines[] (which answered), unavailable_engines[] (which did not), degraded (bool), searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/search",
          "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to search for (1..400 characters)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..20 (default 10)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, title, url, snippet, published, engines[]}, count, provider, engines[] (which answered), unavailable_engines[] (which did not), degraded (bool), searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "web_search",
        "name": "Web search",
        "description": "Search the live web and get back ranked results with titles, URLs and snippets — no account, no API key, one payment per query. Built for agents that need to look something up mid-task: results are deduplicated by URL across every engine that answered, and the engines that produced them are named in the response so you can judge the coverage you actually received rather than assuming it was complete. If no engine answers, the request fails and you are NOT charged — an empty result set is never sold as an answer.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-web_search",
        "free_trial": "https://animica.dev/x402/search/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/research",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/research",
          "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to research (1..400 characters)"
                },
                "pages": {
                  "type": "integer",
                  "required": false,
                  "description": "how many top results to fetch and read, 1..8 (default 4)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, pages[] {rank, url, requested_url, title, chars, truncated, text}, pages_failed[] {url, error, detail}, pages_read, pages_requested, search {provider, engines[], unavailable_engines[], degraded}, took_ms, researched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/research",
          "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "what to research (1..400 characters)"
                },
                "pages": {
                  "type": "integer",
                  "required": false,
                  "description": "how many top results to fetch and read, 1..8 (default 4)"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                },
                "lang": {
                  "type": "string",
                  "required": false,
                  "description": "two-letter language hint, e.g. en"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, pages[] {rank, url, requested_url, title, chars, truncated, text}, pages_failed[] {url, error, detail}, pages_read, pages_requested, search {provider, engines[], unavailable_engines[], degraded}, took_ms, researched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "web_research",
        "name": "Research: search the web and read the pages",
        "description": "One call that searches the web and returns the readable text of the top pages — the whole \"look this up\" loop an agent otherwise writes by hand as a search plus N fetches plus N HTML cleanups. Pages are fetched concurrently under a deadline, stripped of navigation and scripts, and returned with their titles and source URLs. Every page you asked for is accounted for: the ones that could not be read come back in pages_failed WITH the reason (403, timeout, paywall, no extractable text), because a thin web and a broken fetcher look identical otherwise. No model is called and nothing is summarised — you get the evidence, not an answer to trust. If the search finds nothing, or every page fails, you are NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-web_research",
        "free_trial": "https://animica.dev/x402/research/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/contents",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/contents",
          "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "urls": {
                  "type": "array",
                  "required": true,
                  "description": "1..10 absolute http(s) URLs"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "pages[] {url, requested_url, title, content_type, chars, truncated, text}, failed[] {url, error, detail}, pages_read, urls_requested, took_ms, fetched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/contents",
          "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "urls": {
                  "type": "array",
                  "required": true,
                  "description": "1..10 absolute http(s) URLs"
                },
                "max_chars": {
                  "type": "integer",
                  "required": false,
                  "description": "truncate each page to this many characters (default 6000)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "pages[] {url, requested_url, title, content_type, chars, truncated, text}, failed[] {url, error, detail}, pages_read, urls_requested, took_ms, fetched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "web_contents",
        "name": "Page contents in bulk",
        "description": "Give it up to 10 URLs and get back the readable text of each — titles, clean body text, navigation and scripts removed — in a single call and a single payment. The half of every retrieval pipeline an agent already has links for: search results, a sitemap, an RSS feed, a user's reading list. Pages are fetched concurrently under a deadline. Every URL you send is accounted for: the ones that could not be read come back in failed[] WITH the reason (403, timeout, paywall, no extractable text, private address), because a bad input and a broken fetcher need opposite responses from you. If not one URL could be read, you are NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-web_contents",
        "free_trial": "https://animica.dev/x402/contents/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/index",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/index",
          "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "words to match: a capability, a parameter name, a schema field, a network"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only services at or under this price in USD"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only services that publish a call spec"
                }
              },
              "queryParams": {
                "q": {
                  "type": "string",
                  "description": "same as body.query, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, url, host, title, snippet, price_usd, payment_protocol, http_method, callable, score, indexed_at}, count, corpus {documents, sources, oldest_document_age_seconds, last_build}, searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/index",
          "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true,
                  "description": "words to match: a capability, a parameter name, a schema field, a network"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "results to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only services at or under this price in USD"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only services that publish a call spec"
                }
              },
              "queryParams": {
                "q": {
                  "type": "string",
                  "description": "same as body.query, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "query, results[] {rank, url, host, title, snippet, price_usd, payment_protocol, http_method, callable, score, indexed_at}, count, corpus {documents, sources, oldest_document_age_seconds, last_build}, searched_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "agent_index",
        "name": "Search the agent-payable web",
        "description": "Full-text search over what machine-payable services actually publish — their descriptions, input schemas, parameter names, prices and settlement networks — across ~18,000 x402 endpoints. Built from their own payment challenges, which a general crawler discards as a dead page: ask for a parameter name, a schema field or a network and you match services whose one-line blurb never mentions it. Filter by price ceiling, by whether the service publishes a call spec, and by payment protocol. Every response states how many documents were searched and how stale the oldest is, because an index that will not tell you its size is asking to be trusted about the one thing you cannot check. Ranked by BM25 — no model, so the same query ranks the same way twice. If the index is empty or nothing matches, you are NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-agent_index",
        "free_trial": "https://animica.dev/x402/index/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/geo/fix",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/geo/fix",
          "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to fix; the origin is derived from it"
                },
                "max_links": {
                  "type": "integer",
                  "required": false,
                  "description": "how many pages to verify and list in llms.txt (1..40, default 20)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifacts {llms_txt {path, content, links_verified, links_dropped, summary_source}, robots_txt {path, content, diff, changes, still_blocked_by_wildcard}, json_ld {content, types, grounded_in, omitted}}, discovered {sitemap, candidate_links, verified}, next_step"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/geo/fix",
          "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "url": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the site to fix; the origin is derived from it"
                },
                "max_links": {
                  "type": "integer",
                  "required": false,
                  "description": "how many pages to verify and list in llms.txt (1..40, default 20)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifacts {llms_txt {path, content, links_verified, links_dropped, summary_source}, robots_txt {path, content, diff, changes, still_blocked_by_wildcard}, json_ld {content, types, grounded_in, omitted}}, discovered {sitemap, candidate_links, verified}, next_step"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "geo_fix",
        "name": "GEO fix — deployable llms.txt, robots.txt and JSON-LD",
        "description": "Emit the actual files that fix a site's AI legibility, ready to deploy: a real /llms.txt, a /robots.txt that stops excluding AI crawlers (with a unified diff against the current one), and a JSON-LD block for the page <head>. Nothing is invented: every link in the llms.txt is discovered on the site and then FETCHED to confirm it answers 200, with failures dropped and counted, and every JSON-LD field is copied from something the page actually declares — anything that cannot be grounded is omitted rather than guessed. A small model writes only the prose, from the titles and descriptions we extracted; any URL it returns that is not in the verified set is discarded. Pairs with /x402/geo/audit: audit tells you what is wrong, this hands you the files. Re-run the audit afterwards to confirm the score moved.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-geo_fix",
        "free_trial": "https://animica.dev/x402/geo/fix/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/mesh/find",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mesh/find",
          "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you are trying to do, in plain words — matched against service descriptions"
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "exclude anything priced above this per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "only return services that publish a call spec you can invoke without guessing (default false)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many results, 1..50 (default 10)"
                },
                "weights": {
                  "type": "object",
                  "required": false,
                  "description": "override the ranking weights {relevance, demand, price, callable}; they are normalised as given"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "results[] {resource, description, price_usd, network, callable, call_spec, demand {calls_30d, unique_payers_30d, concentration, note}, score, why}, weights, index {total, callable, priced, price_rejected, with_demand, in_both_directories, sources, age_seconds}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mesh/find",
          "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you are trying to do, in plain words — matched against service descriptions"
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "exclude anything priced above this per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "only return services that publish a call spec you can invoke without guessing (default false)"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "how many results, 1..50 (default 10)"
                },
                "weights": {
                  "type": "object",
                  "required": false,
                  "description": "override the ranking weights {relevance, demand, price, callable}; they are normalised as given"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "results[] {resource, description, price_usd, network, callable, call_spec, demand {calls_30d, unique_payers_30d, concentration, note}, score, why}, weights, index {total, callable, priced, price_rejected, with_demand, in_both_directories, sources, age_seconds}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mesh_find",
        "name": "x402 Mesh — find who to buy from",
        "description": "Search the whole x402 economy and get a ranked shortlist of services that can do a job, within a budget. Merges Coinbase Bazaar and 402index into one index keyed by canonical resource URL, then answers the three questions a directory does not: CAN this be invoked (only about 5% publish a call spec, and that is a first-class field here, not something you infer from missing keys), is the price REAL (one live listing advertises ten billion dollars a call — implausible prices are excluded as bad data and reported, never silently rewritten), and is the demand real (total calls are trivially inflated by a merchant calling itself, so volume is credited only in proportion to distinct paying counterparties). Every result explains its own score, and the weights are returned so you can disagree with them. Lexical matching, no model: the same query against the same index ranks the same way.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mesh_find",
        "free_trial": "https://animica.dev/x402/mesh/find/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/mesh/probe",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mesh/probe",
          "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the x402 endpoint to verify"
                },
                "method": {
                  "type": "string",
                  "required": false,
                  "description": "HTTP verb to probe with. Omit and GET is tried first, then POST with an empty body — a write verb is never guessed at an unknown endpoint"
                },
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "ignore any cached probe and call it again now (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "outcome (paywalled|open|dead|error|blocked), http_status, method, price {atomic, usd, asset, network, pay_to, scheme, max_timeout_seconds}, call_spec, accepts[], latency_ms, probed_at, cached"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mesh/probe",
          "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "absolute http(s) URL of the x402 endpoint to verify"
                },
                "method": {
                  "type": "string",
                  "required": false,
                  "description": "HTTP verb to probe with. Omit and GET is tried first, then POST with an empty body — a write verb is never guessed at an unknown endpoint"
                },
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "ignore any cached probe and call it again now (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "outcome (paywalled|open|dead|error|blocked), http_status, method, price {atomic, usd, asset, network, pay_to, scheme, max_timeout_seconds}, call_spec, accepts[], latency_ms, probed_at, cached"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mesh_probe",
        "name": "x402 Mesh — verify one endpoint before you pay it",
        "description": "Call any x402 endpoint WITHOUT paying and get back what its own 402 challenge says: the real price, asset, network, payTo address, scheme, timeout, and the request schema when the merchant publishes one. Directory listings are written once and go stale; this is the merchant's own current statement of the terms you are about to accept. It also distinguishes the cases a directory cannot: a resource that answers 402 properly, one that is listed as paid but answers WITHOUT payment, one that is listed but gone, and one that simply fails. No payment header is ever sent, so this cannot settle anything, and unknown endpoints are probed with GET — never a write verb with a guessed body.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mesh_probe"
      }
    },
    {
      "resource": "https://animica.dev/x402/solve",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/solve",
          "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you want accomplished, in plain words"
                },
                "max_budget_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total you are willing to spend executing the plan (default 1.00)"
                },
                "max_steps": {
                  "type": "integer",
                  "required": false,
                  "description": "cap the plan length, 1..6"
                },
                "require_verified": {
                  "type": "boolean",
                  "required": false,
                  "description": "only plan services we have called ourselves and confirmed answer 402 (default false — it is a much smaller pool)"
                },
                "exclude_hosts": {
                  "type": "array",
                  "required": false,
                  "description": "hostnames never to plan against"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "plan {steps[] {index, capability, why, depends_on, chosen, alternatives[], dataflow}, total_cost_usd, within_budget, steps_planned, steps_unplanned}, gaps[], execution {performed: false, how_to_run}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/solve",
          "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what you want accomplished, in plain words"
                },
                "max_budget_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total you are willing to spend executing the plan (default 1.00)"
                },
                "max_steps": {
                  "type": "integer",
                  "required": false,
                  "description": "cap the plan length, 1..6"
                },
                "require_verified": {
                  "type": "boolean",
                  "required": false,
                  "description": "only plan services we have called ourselves and confirmed answer 402 (default false — it is a much smaller pool)"
                },
                "exclude_hosts": {
                  "type": "array",
                  "required": false,
                  "description": "hostnames never to plan against"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "plan {steps[] {index, capability, why, depends_on, chosen, alternatives[], dataflow}, total_cost_usd, within_budget, steps_planned, steps_unplanned}, gaps[], execution {performed: false, how_to_run}, caveats[]"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "solve_plan",
        "name": "x402 Solve — compile a goal into a priced plan of real API calls",
        "description": "Describe a goal and a budget; get back a concrete plan of real x402 calls that would accomplish it — exact URLs, HTTP methods, request shapes, per-step prices from the merchants' own 402 challenges where we have verified them, alternates for every step, and a total you can check before committing. Only services that publish a callable request shape are planned; a step with no invokable candidate is returned as an explicit gap rather than a URL and a shrug. IT DOES NOT SPEND: this compiles the plan and stops, so you execute it with your own wallet on your own terms. It also does not claim the pipeline type-checks — roughly 5% of the x402 economy publishes schemas, so most step-to-step handoffs cannot be verified, and every edge says which it is.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-solve_plan",
        "free_trial": "https://animica.dev/x402/solve/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/analytics/market",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/market",
          "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "segment": {
                  "type": "string",
                  "required": false,
                  "description": "words describing the segment to analyse, e.g. \"weather forecast data\". Omit to analyse the whole indexed economy"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict to one settlement network, e.g. \"base\""
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "restrict to services at or below this price per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "restrict to services that publish a call spec (default false)"
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many example services to return, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "segment {matched, coverage_floor, filters}, price {min,p10,p25,median,p75,p90,max,mean}, demand, callability, verification, networks[], assets[], hosts, freshness, trend, examples[], narrative, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/market",
          "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "segment": {
                  "type": "string",
                  "required": false,
                  "description": "words describing the segment to analyse, e.g. \"weather forecast data\". Omit to analyse the whole indexed economy"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict to one settlement network, e.g. \"base\""
                },
                "max_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "restrict to services at or below this price per call"
                },
                "require_callable": {
                  "type": "boolean",
                  "required": false,
                  "description": "restrict to services that publish a call spec (default false)"
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many example services to return, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "segment {matched, coverage_floor, filters}, price {min,p10,p25,median,p75,p90,max,mean}, demand, callability, verification, networks[], assets[], hosts, freshness, trend, examples[], narrative, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "analytics_market",
        "name": "x402 Analytics — the shape of a market segment",
        "description": "Statistical analysis of any segment of the x402 economy, computed over a merged index of Coinbase Bazaar and 402index overlaid with our own unpaid 402 probes. Returns the full price distribution (min, p10, p25, median, p75, p90, max, mean), demand discounted by payer concentration, what share of the segment can actually be invoked, the network and asset split, host concentration, liveness, and — once history exists — the trend. Every figure is computed in code from named rows; the interpretation is written by Animica's own AICF inference network and every sentence containing a number not in the computed facts is deleted before delivery. Directories publish rows; this publishes the distribution.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-analytics_market",
        "free_trial": "https://animica.dev/x402/analytics/market/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/analytics/price",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/price",
          "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "description": {
                  "type": "string",
                  "required": true,
                  "description": "what the service does, in the words a merchant would use to describe it"
                },
                "price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "the price per call you charge or are considering. Omit to get the market band without a position"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict comparables to one settlement network"
                },
                "top_comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparables to list back, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "comparables {count, floor, listed[]}, distribution {deciles}, your_position {percentile, vs_median}, demand_by_band[], suggested_band, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/price",
          "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "description": {
                  "type": "string",
                  "required": true,
                  "description": "what the service does, in the words a merchant would use to describe it"
                },
                "price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "the price per call you charge or are considering. Omit to get the market band without a position"
                },
                "network": {
                  "type": "string",
                  "required": false,
                  "description": "restrict comparables to one settlement network"
                },
                "top_comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparables to list back, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "comparables {count, floor, listed[]}, distribution {deciles}, your_position {percentile, vs_median}, demand_by_band[], suggested_band, inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "analytics_price",
        "name": "x402 Analytics — where does this price sit?",
        "description": "Price positioning for an x402 service. Describe what you sell (and optionally what you charge) and get the comparable set — named, counted, and listed — plus your exact percentile within it, the full decile ladder of what those comparables charge, how much demand sits in each price band, and a suggested band derived from the comparables rather than asserted. Refuses to compute a percentile when too few real comparables exist, because a confident percentile over four loosely-related rows is worse than no answer. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-analytics_price",
        "free_trial": "https://animica.dev/x402/analytics/price/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/analytics/peers",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/analytics/peers",
          "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of a service listed in the x402 index"
                },
                "top_peers": {
                  "type": "integer",
                  "required": false,
                  "description": "how many peers to list, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "subject {listing, verified}, peers {count, listed[]}, ranks {price, calls, payer_diversity}, mirrors[], inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/analytics/peers",
          "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of a service listed in the x402 index"
                },
                "top_peers": {
                  "type": "integer",
                  "required": false,
                  "description": "how many peers to list, 0-25 (default 10)"
                },
                "narrative": {
                  "type": "boolean",
                  "required": false,
                  "description": "include the AICF-written interpretation (default true)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "subject {listing, verified}, peers {count, listed[]}, ranks {price, calls, payer_diversity}, mirrors[], inference {provenance, grounding}"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "analytics_peers",
        "name": "x402 Analytics — one endpoint against its peers",
        "description": "Competitive position for a single x402 resource. Give a URL that is listed anywhere in the merged index and get back what the index holds on it (including any correction our own unpaid 402 probe made to its advertised price), the peer set derived from its own description, and where it ranks among those peers on price, call volume, payer diversity and callability — plus the mirrors of itself that are listed as separate services. Useful whether the endpoint is yours or one you are about to buy from. Interpretation is written by Animica's own AICF inference network; every figure is computed in code.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-analytics_peers",
        "free_trial": "https://animica.dev/x402/analytics/peers/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/crawl/pass",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "crawl_pass",
        "name": "Crawl pass (small)",
        "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.010 buys $0.010 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-crawl_pass"
      }
    },
    {
      "resource": "https://animica.dev/x402/crawl/pass/10",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "100000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass/10",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "1196172248803",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass/10",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "1196.172248803 ANM",
            "usd_equivalent": "0.075000",
            "usd_list_price": "0.100",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "crawl_pass_10",
        "name": "Crawl pass (medium)",
        "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $0.100 buys $0.100 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-crawl_pass_10"
      }
    },
    {
      "resource": "https://animica.dev/x402/crawl/pass/100",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "1000000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/crawl/pass/100",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "11961722488038",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/crawl/pass/100",
          "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "json",
              "bodyFields": {
                "domain": {
                  "type": "string",
                  "required": true,
                  "description": "the domain to buy crawl access to; it must publish terms at /x402/crawl/{domain}"
                },
                "ttl_seconds": {
                  "type": "integer",
                  "description": "how long the pass stays valid, 60-86400 (default 3600)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "a crawl pass token (anmcp_...), how many requests it covers, the per-page rate it was priced at, and its expiry"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "11961.722488038 ANM",
            "usd_equivalent": "0.750000",
            "usd_list_price": "1.000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "crawl_pass_100",
        "name": "Crawl pass (bulk)",
        "description": "Buy bulk crawl access to one domain that publishes Paid Crawl terms. $1.000 buys $1.000 worth of that site's pages — the site sets the per-page rate, so the request budget is the pass value divided by that rate. ONE settlement covers the whole budget: per-page settlement is impossible at these prices because Base gas would exceed the fee. Send the returned token back as \"X-Crawl-Pass: anmcp_...\". Site operators pay nothing for Paid Crawl; crawlers do.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-crawl_pass_100"
      }
    },
    {
      "resource": "https://animica.dev/x402/forecast",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "9124",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/forecast",
          "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "a yes/no question about the future, e.g. \"Will X happen before 2027?\""
                },
                "market_slug": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison to a specific prediction market by slug"
                },
                "market_id": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison by market id"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, verify_url, record (the exact anchored bytes), model {probability, reasoning, name}, market {price, id, slug, end_date, source} or null, divergence, anchored_at {head_height, head_hash}, proof, and an explicit statement of what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "109138755980",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/forecast",
          "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "question": {
                  "type": "string",
                  "required": true,
                  "description": "a yes/no question about the future, e.g. \"Will X happen before 2027?\""
                },
                "market_slug": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison to a specific prediction market by slug"
                },
                "market_id": {
                  "type": "string",
                  "required": false,
                  "description": "pin the comparison by market id"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commitment, verify_url, record (the exact anchored bytes), model {probability, reasoning, name}, market {price, id, slug, end_date, source} or null, divergence, anchored_at {head_height, head_hash}, proof, and an explicit statement of what the proof does and does not establish"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "109.138755980 ANM",
            "usd_equivalent": "0.006843",
            "usd_list_price": "0.009124",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "forecast_notarized",
        "name": "Notarised forecast with market comparison",
        "description": "Ask a yes/no question about the future and get three things: an independent model probability, the live price of the matching prediction market when one exists, and — the point of the product — the whole record anchored into the Animica data-availability layer with a commitment anyone can verify FREE and permanently at GET /x402/forecast/{commitment}. Anyone can claim afterwards that they called it; this proves what was believed beforehand. Both numbers are always returned side by side: the model is NOT claimed to beat the market, and our own accuracy against every resolved market is published free at GET /x402/forecast/calibration, including when we lose. If the record cannot be anchored the call fails rather than selling an unanchored prediction.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-forecast_notarized"
      }
    },
    {
      "resource": "https://animica.dev/x402/execute",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/execute",
          "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "task": {
                  "type": "string",
                  "required": true,
                  "description": "what to do, in plain language. A URL in the task routes it to extraction."
                },
                "quality": {
                  "type": "string",
                  "required": false,
                  "description": "\"fast\" (1 pass, no verification) or \"verified\" (multiple samples + agreement). Default fast."
                },
                "anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "anchor the result on-chain and return a free permanent proof (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "status, capability, result, verification {provider_count, providers_distinct, samples, agreement, confidence, method, caveat}, receipt {alg, signature, public_key, preimage, verify}, anchor {commitment, verify_url} when requested, and elapsed_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/execute",
          "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "task": {
                  "type": "string",
                  "required": true,
                  "description": "what to do, in plain language. A URL in the task routes it to extraction."
                },
                "quality": {
                  "type": "string",
                  "required": false,
                  "description": "\"fast\" (1 pass, no verification) or \"verified\" (multiple samples + agreement). Default fast."
                },
                "anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "anchor the result on-chain and return a free permanent proof (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "status, capability, result, verification {provider_count, providers_distinct, samples, agreement, confidence, method, caveat}, receipt {alg, signature, public_key, preimage, verify}, anchor {commitment, verify_url} when requested, and elapsed_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "execute",
        "name": "Animica Execute — pay once, get a verified result",
        "description": "Give a task and a budget; get the result, a measured verification signal, and an ML-DSA-65 signed receipt over the exact bytes delivered. Routes the task to a capability and says which one ran: extract (fetch a URL and read it), research, predict (with the live prediction-market price where one matches), chain (Animica L1 facts), code, summarize, or a direct answer. HONEST ABOUT VERIFICATION: there is one inference backend today, so multi-sample checking measures SELF-CONSISTENCY, not independent providers — the response states provider_count, whether providers were distinct, and what the agreement number means. Confidence is measured from real agreement or reported as null; it is never a decorative number. The receipt is signed with the same post-quantum scheme this chain admits transactions with, the public key ships with it, and the result can optionally be anchored on-chain with a free permanent proof.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-execute"
      }
    },
    {
      "resource": "https://animica.dev/x402/extract",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/extract",
          "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the unstructured text to extract from"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the result must satisfy (subset: type, properties, required, items, enum, const, min/max, minLength/maxLength, minItems/maxItems, additionalProperties)"
                },
                "instruction": {
                  "type": "string",
                  "required": false,
                  "description": "optional extra guidance, e.g. \"amounts in minor units\""
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data (validated against your schema), model, attempts, repaired, unsupported_schema_keywords"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/extract",
          "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the unstructured text to extract from"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the result must satisfy (subset: type, properties, required, items, enum, const, min/max, minLength/maxLength, minItems/maxItems, additionalProperties)"
                },
                "instruction": {
                  "type": "string",
                  "required": false,
                  "description": "optional extra guidance, e.g. \"amounts in minor units\""
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data (validated against your schema), model, attempts, repaired, unsupported_schema_keywords"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "extract_structured",
        "name": "Structured data extraction (your JSON Schema)",
        "description": "Turn messy text — a web page, email, invoice, receipt, job posting, contract clause, product description — into strict JSON matching a schema YOU supply. The schema is enforced in code, not merely requested: output is parsed, validated, repaired once against the exact validation error, and the call FAILS with the violated constraint rather than returning unvalidated JSON. Fields not present in the input come back null instead of a plausible invention. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-extract_structured",
        "free_trial": "https://animica.dev/x402/extract/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/classify",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/classify",
          "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the text to classify"
                },
                "labels": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 candidate labels"
                },
                "multi": {
                  "type": "boolean",
                  "required": false,
                  "description": "allow multiple labels (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "label (or labels), confidence 0..1, rationale, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/classify",
          "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the text to classify"
                },
                "labels": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 candidate labels"
                },
                "multi": {
                  "type": "boolean",
                  "required": false,
                  "description": "allow multiple labels (default false)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "label (or labels), confidence 0..1, rationale, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "classify",
        "name": "Text classification",
        "description": "Assign text to one of YOUR labels — spam, sentiment, urgency, topic, ticket category, lead quality, intent, moderation — with a confidence and a one-line rationale. The label is constrained to your list by schema enum, so it cannot return a category you did not define. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-classify",
        "free_trial": "https://animica.dev/x402/classify/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/entities",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/entities",
          "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "text to scan"
                },
                "types": {
                  "type": "array",
                  "required": false,
                  "description": "restrict to a subset of person, organization, location, date, amount, product, url, email, phone, wallet_address, other"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "entities[] {type, text, normalized?}, count, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/entities",
          "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "text to scan"
                },
                "types": {
                  "type": "array",
                  "required": false,
                  "description": "restrict to a subset of person, organization, location, date, amount, product, url, email, phone, wallet_address, other"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "entities[] {type, text, normalized?}, count, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "entities",
        "name": "Entity extraction",
        "description": "Pull people, organizations, locations, dates, amounts, products, URLs, emails, phone numbers and wallet addresses out of text, each with the exact surface form as it appeared so you can locate it. Types are constrained by schema, so the result is always one of the known kinds. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-entities",
        "free_trial": "https://animica.dev/x402/entities/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/json/repair",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/json/repair",
          "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the malformed / fenced / prose-wrapped JSON"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the repaired value must satisfy"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data, method (\"parsed\" | \"model_repaired\"), model, attempts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/json/repair",
          "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the malformed / fenced / prose-wrapped JSON"
                },
                "schema": {
                  "type": "object",
                  "required": true,
                  "description": "JSON Schema the repaired value must satisfy"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "data, method (\"parsed\" | \"model_repaired\"), model, attempts"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "json_repair",
        "name": "JSON repair and schema enforcement",
        "description": "Hand over malformed model output and a JSON Schema; get back JSON that provably satisfies it. Tries a pure-parse fast path FIRST and returns immediately when the input is already valid — you are not charged a model call for text that merely looked broken. Otherwise a small model repairs it and the result is validated in code before it is returned. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-json_repair",
        "free_trial": "https://animica.dev/x402/json/repair/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/security/injection",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/security/injection",
          "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the untrusted content to scan"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "risk 0..1, verdict, findings[] {technique, span, severity}, pattern_hits[], model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/security/injection",
          "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "input": {
                  "type": "string",
                  "required": true,
                  "description": "the untrusted content to scan"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "risk 0..1, verdict, findings[] {technique, span, severity}, pattern_hits[], model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "injection_scan",
        "name": "Prompt-injection detector",
        "description": "Scan retrieved content — a fetched page, an email, a tool result — for text trying to manipulate the agent reading it: instruction overrides, role/system impersonation, exfiltration requests, hidden or encoded directives. Returns a risk score, the suspicious spans verbatim, and the technique observed. Deterministic pattern checks run ALONGSIDE the model so a blatant \"ignore all previous instructions\" is caught even if the model misses it, and the two signals are reported separately rather than blended into one number you cannot interrogate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-injection_scan",
        "free_trial": "https://animica.dev/x402/security/injection/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/rerank",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/rerank",
          "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true
                },
                "documents": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 strings"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to return (default 5)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ranked[] {index, score, reason}, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/rerank",
          "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "query": {
                  "type": "string",
                  "required": true
                },
                "documents": {
                  "type": "array",
                  "required": true,
                  "description": "2..50 strings"
                },
                "top_k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to return (default 5)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "ranked[] {index, score, reason}, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "rerank",
        "name": "Rerank search results",
        "description": "Give a query and up to 50 candidate snippets; get the top N by relevance with a score and a one-line reason. Indexes are returned so you can map straight back to your own objects without string matching. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-rerank",
        "free_trial": "https://animica.dev/x402/rerank/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/route",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/route",
          "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what the agent is trying to achieve"
                },
                "actions": {
                  "type": "array",
                  "required": true,
                  "description": "2..20 actions: {name, description, parameters?}"
                },
                "context": {
                  "type": "string",
                  "required": false,
                  "description": "extra state the decision depends on"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "action, arguments, confidence, reason, escalate, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/route",
          "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "goal": {
                  "type": "string",
                  "required": true,
                  "description": "what the agent is trying to achieve"
                },
                "actions": {
                  "type": "array",
                  "required": true,
                  "description": "2..20 actions: {name, description, parameters?}"
                },
                "context": {
                  "type": "string",
                  "required": false,
                  "description": "extra state the decision depends on"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "action, arguments, confidence, reason, escalate, model"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "route_action",
        "name": "Agent action router",
        "description": "Give a goal and the actions available to you; get back the single best action, its arguments, a confidence and a reason. The chosen action is constrained by schema enum to your list, so it can never name a tool you do not have. Built for the decision an agent makes before spending a frontier-model call — including the honest answer that it should escalate. Priced per call. For high-volume use, buy prepaid credits (POST /x402/credits/buy) and send X-Animica-Credits on each request — no settlement, no gas, no per-call payment round trip. Paying in ANM on the animica:1 lane is also ~25% cheaper because we sponsor no gas there.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-route_action",
        "free_trial": "https://animica.dev/x402/route/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/random/int",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/int",
          "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "min": {
                  "type": "integer",
                  "required": true,
                  "description": "lower bound, inclusive"
                },
                "max": {
                  "type": "integer",
                  "required": true,
                  "description": "upper bound, inclusive (>= min)"
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many integers, 1..1000 (default 1; alias n)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed so you can recompute this exact draw"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {ints}, randomness (hex raw draw), source, health, attestation, verification, derivation {rules, steps, recompute} for offline recomputation, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/int",
          "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "min": {
                  "type": "integer",
                  "required": true,
                  "description": "lower bound, inclusive"
                },
                "max": {
                  "type": "integer",
                  "required": true,
                  "description": "upper bound, inclusive (>= min)"
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many integers, 1..1000 (default 1; alias n)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed so you can recompute this exact draw"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {ints}, randomness (hex raw draw), source, health, attestation, verification, derivation {rules, steps, recompute} for offline recomputation, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "random_int",
        "name": "Uniform random integers",
        "description": "Uniform integers in [min, max] derived from ONE verified randomness draw by rejection sampling (never modulo bias) — up to 1000 per request. The response carries the raw draw, the node's source/health/attestation and the exact rule, so you can recompute every integer offline.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-random_int",
        "free_trial": "https://animica.dev/x402/random/int/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/random/shuffle",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/shuffle",
          "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": false,
                  "description": "the list to shuffle, 1..10000 entries (any JSON values)"
                },
                "n": {
                  "type": "integer",
                  "required": false,
                  "description": "shuffle 1..n instead of a supplied list (1..10000); supply exactly one of items or n"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {permutation (0-based indices), items (shuffled), count}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/shuffle",
          "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": false,
                  "description": "the list to shuffle, 1..10000 entries (any JSON values)"
                },
                "n": {
                  "type": "integer",
                  "required": false,
                  "description": "shuffle 1..n instead of a supplied list (1..10000); supply exactly one of items or n"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {permutation (0-based indices), items (shuffled), count}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "random_shuffle",
        "name": "Verifiable shuffle",
        "description": "Fisher-Yates permutation of your list (or of 1..N), up to 10000 items, derived from ONE verified randomness draw. Returns the permutation of 0-based indices plus the shuffled items, with the exact swap-and-byte-consumption rule so you can recompute it offline.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-random_shuffle",
        "free_trial": "https://animica.dev/x402/random/shuffle/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/random/pick",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/pick",
          "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": true,
                  "description": "candidates, 1..10000 entries (any JSON values)"
                },
                "k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to pick, 1..1000 (default 1; alias count). Without replacement k <= items.length"
                },
                "replace": {
                  "type": "boolean",
                  "required": false,
                  "description": "true = with replacement (an item can win twice); default false"
                },
                "weights": {
                  "type": "array",
                  "required": false,
                  "description": "one non-negative INTEGER weight per item (floats rejected: the cumulative search must be recomputable exactly)"
                },
                "indices_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "omit the picked items and return only their 0-based indices — use it when the items are large: the response cap is 4000000 bytes and with replace:true the same item can be emitted k times"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {picked (omitted when indices_only), indices, k, replace, weighted}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute?}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/pick",
          "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "items": {
                  "type": "array",
                  "required": true,
                  "description": "candidates, 1..10000 entries (any JSON values)"
                },
                "k": {
                  "type": "integer",
                  "required": false,
                  "description": "how many to pick, 1..1000 (default 1; alias count). Without replacement k <= items.length"
                },
                "replace": {
                  "type": "boolean",
                  "required": false,
                  "description": "true = with replacement (an item can win twice); default false"
                },
                "weights": {
                  "type": "array",
                  "required": false,
                  "description": "one non-negative INTEGER weight per item (floats rejected: the cumulative search must be recomputable exactly)"
                },
                "indices_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "omit the picked items and return only their 0-based indices — use it when the items are large: the response cap is 4000000 bytes and with replace:true the same item can be emitted k times"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {picked (omitted when indices_only), indices, k, replace, weighted}, randomness, source, health, attestation, verification, derivation {rules, steps, recompute?}, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "random_pick",
        "name": "Weighted random pick",
        "description": "Pick k of your items with or without replacement, optionally weighted by integer weights (raffles, lotteries, sortition, A/B splits). One verified randomness draw, cumulative-weight search over a rejection-sampled uniform value, up to 10000 items. The exact rule and the raw draw ride along so you can recompute the winners.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-random_pick",
        "free_trial": "https://animica.dev/x402/random/pick/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/qrng/bulk",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/qrng/bulk",
          "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "draws": {
                  "type": "integer",
                  "required": false,
                  "description": "how many INDEPENDENT draws, 5..10 (default 10; alias count). Below 5 this endpoint is more expensive than 5 single draws and refuses with a 400."
                },
                "bytes": {
                  "type": "integer",
                  "required": false,
                  "description": "bytes per draw, 1..1024 (default 32; draws*bytes <= 65536)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {draws: [{index, bytes, randomness, sha3_256, source, health, attestation, verification}], count, bytes_per_draw, pricing}, source, health (aggregate), attestation {scope: per_draw}, verification, derivation (independence + digest rules), payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/qrng/bulk",
          "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "draws": {
                  "type": "integer",
                  "required": false,
                  "description": "how many INDEPENDENT draws, 5..10 (default 10; alias count). Below 5 this endpoint is more expensive than 5 single draws and refuses with a 400."
                },
                "bytes": {
                  "type": "integer",
                  "required": false,
                  "description": "bytes per draw, 1..1024 (default 32; draws*bytes <= 65536)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "result {draws: [{index, bytes, randomness, sha3_256, source, health, attestation, verification}], count, bytes_per_draw, pricing}, source, health (aggregate), attestation {scope: per_draw}, verification, derivation (independence + digest rules), payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "random_bulk",
        "name": "Batched independent draws (one settlement)",
        "description": "5..10 INDEPENDENT randomness draws — each one its own node call with its own signed digest attestation and health report — delivered under ONE payment of $0.004. Fewer than 5 draws is refused with a 400 that points at GET /x402/qrng/draw ($0.001 per draw), because only at 5+ draws is this genuinely cheaper per draw. Priced per draw, not per byte: if you just need many bytes under one attestation, a single 1024-byte qrng draw is cheaper — the response states which is cheaper for the call you made.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-random_bulk",
        "free_trial": "https://animica.dev/x402/qrng/bulk/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/random/commit",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/random/commit",
          "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "reveal_after_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "seconds until the free reveal opens, 0..604800 (default 0 = revealable immediately)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "up to 256 printable ASCII chars, published verbatim at reveal (bind the commitment to your round/bet id)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed that produced the secret"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commit_id, commitment, algorithm, reveal_after (unix seconds), reveal_url, source, health, attestation (the draw is NOT disclosed yet), verification, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/random/commit",
          "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "reveal_after_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "seconds until the free reveal opens, 0..604800 (default 0 = revealable immediately)"
                },
                "memo": {
                  "type": "string",
                  "required": false,
                  "description": "up to 256 printable ASCII chars, published verbatim at reveal (bind the commitment to your round/bet id)"
                },
                "request_id": {
                  "type": "string",
                  "required": false,
                  "description": "your own tag; mixed into the DRNG seed that produced the secret"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "commit_id, commitment, algorithm, reveal_after (unix seconds), reveal_url, source, health, attestation (the draw is NOT disclosed yet), verification, payment metadata"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "random_commit",
        "name": "Commit-reveal randomness (public audit trail)",
        "description": "Commit now, reveal to everyone later: the paid call returns a commitment sha3_256(secret||salt) and a commit id; GET /x402/random/reveal/{commit_id} is FREE, public and idempotent, and discloses the secret, the salt, the raw draw and the node's attestation so anyone — not just the buyer — can check the commitment. Reveal delay 0..604800s. For games, sealed-bid rounds and auditable draws. Trust model, stated plainly: the commitment binds the outcome from the moment you publish it, and the reveal proves the secret came from a node-signed draw — it does NOT prove the operator discarded no draws before committing, so publish the commitment to your players before the round.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-random_commit"
      }
    },
    {
      "resource": "https://animica.dev/x402/media/image",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/image",
          "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: image (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/image",
          "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: image (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "media_image",
        "name": "AI image render",
        "description": "Text-to-image, rendered by an online GPU miner. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: image.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-media_image",
        "free_trial": "https://animica.dev/x402/media/image/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/media/video",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "10000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/video",
          "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "119617224880",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/video",
          "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "119.617224880 ANM",
            "usd_equivalent": "0.007500",
            "usd_list_price": "0.010000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "media_video",
        "name": "AI video render",
        "description": "Text-to-video, image-to-video, upscale, interpolate, subtitles, background removal and shorts. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: video_t2v, video_i2v, video_multiscene, video_upscale, video_interpolate, video_subtitles, video_bgremove, video_shorts.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-media_video",
        "free_trial": "https://animica.dev/x402/media/video/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/media/audio",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7984",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/media/audio",
          "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: audio, audio_stems, audio_isolate, audio_enhance, audio_master (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95502392344",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/media/audio",
          "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "description": "one of: audio, audio_stems, audio_isolate, audio_enhance, audio_master (aliases accepted, e.g. \"video\", \"music\", \"upscale\")"
                },
                "prompt": {
                  "type": "string",
                  "description": "what to render; required except for upload-driven kinds"
                },
                "params": {
                  "type": "object",
                  "description": "optional per-kind parameters, clamped by the renderer"
                },
                "upload_ids": {
                  "type": "array",
                  "description": "ids from /api/mkt/v1/media/uploads, for image-to-video and the edit kinds"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "Job handle: {job_id, kind, status, position, miners_online, poll_url, message}. Rendering is asynchronous — GET poll_url (free, public) until status is done, then fetch the artifact."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.502392344 ANM",
            "usd_equivalent": "0.005988",
            "usd_list_price": "0.007984",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "media_audio",
        "name": "AI audio render",
        "description": "Music generation, stem separation, vocal isolation, enhancement and mastering. Rendered by the Animica GPU-miner queue. Sold only while a miner for the requested kind is online — the catalog reports available:false and the endpoint answers 503 otherwise. Returns a job handle immediately (rendering is asynchronous); polling the returned poll_url is free. Kinds: audio, audio_stems, audio_isolate, audio_enhance, audio_master.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-media_audio",
        "free_trial": "https://animica.dev/x402/media/audio/trial"
      }
    },
    {
      "resource": "https://animica.dev/x402/compute/inventory",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/compute/inventory",
          "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "force a live re-probe instead of the short-lived memo (default false). Use it immediately before you commit money to a job."
                },
                "workloads": {
                  "type": "array",
                  "required": false,
                  "description": "up to 8 workloads to get an admission verdict for — inference, image, video, audio, or a media kind such as video_i2v or audio_master"
                }
              },
              "queryParams": {
                "fresh": {
                  "type": "string",
                  "description": "same as body.fresh, for GET callers: 1/true"
                },
                "workloads": {
                  "type": "string",
                  "description": "same as body.workloads, comma-separated, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "measured_at, fresh, media {available, reason, probe_age_ms, min_renderers, kinds[] {kind, family, renderers_online, required, available, reason}, families[] {id, endpoint, list_price_usd, best_online, servable_kinds, available}, list_price_note}, inference {available, reason, bridge_reachable, models_serving[], requested_model, animica_workers_serving, answer_would_come_from, claim, proof}, inference_workers {available, serving_workers, required, tier, probe_age_ms}, queue_depth {available, reason, positions_we_observed[] {kind, position, miners_online, observed_at}}, chain {available, head_height, head_hash}, workloads[] (only if requested) {workload, ok, reason, detail}, summary {subsystems_measured[], subsystems_dark[], servable_kinds[], media_kinds_servable, inference_servable, anything_servable}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/compute/inventory",
          "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "fresh": {
                  "type": "boolean",
                  "required": false,
                  "description": "force a live re-probe instead of the short-lived memo (default false). Use it immediately before you commit money to a job."
                },
                "workloads": {
                  "type": "array",
                  "required": false,
                  "description": "up to 8 workloads to get an admission verdict for — inference, image, video, audio, or a media kind such as video_i2v or audio_master"
                }
              },
              "queryParams": {
                "fresh": {
                  "type": "string",
                  "description": "same as body.fresh, for GET callers: 1/true"
                },
                "workloads": {
                  "type": "string",
                  "description": "same as body.workloads, comma-separated, for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "measured_at, fresh, media {available, reason, probe_age_ms, min_renderers, kinds[] {kind, family, renderers_online, required, available, reason}, families[] {id, endpoint, list_price_usd, best_online, servable_kinds, available}, list_price_note}, inference {available, reason, bridge_reachable, models_serving[], requested_model, animica_workers_serving, answer_would_come_from, claim, proof}, inference_workers {available, serving_workers, required, tier, probe_age_ms}, queue_depth {available, reason, positions_we_observed[] {kind, position, miners_online, observed_at}}, chain {available, head_height, head_hash}, workloads[] (only if requested) {workload, ok, reason, detail}, summary {subsystems_measured[], subsystems_dark[], servable_kinds[], media_kinds_servable, inference_servable, anything_servable}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "compute_inventory",
        "name": "Animica compute inventory",
        "description": "Live capacity of the Animica compute network in one call: which GPU render kinds have miners online right now and how many, whether a registered AICF worker is serving inference, and the chain height it was measured at. Buy it BEFORE you pay for a render or an inference call, so you pick a servable kind instead of learning from a job nothing claims. Anything we could not reach reports available:false with a reason: counts are never guessed and never a zero we did not measure.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-compute_inventory"
      }
    },
    {
      "resource": "https://animica.dev/x402/compute/quote",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6843",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/compute/quote",
          "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": true,
                  "description": "workload to quote: inference, image, video, audio, or a canonical media kind such as video_i2v or audio_master"
                },
                "prompt": {
                  "type": "string",
                  "required": false,
                  "description": "the prompt you intend to submit; checked for acceptance and copied into the example body, never sent anywhere"
                },
                "params": {
                  "type": "object",
                  "required": false,
                  "description": "render params you intend to submit; shape-checked only"
                },
                "upload_ids": {
                  "type": "array",
                  "required": false,
                  "description": "upload ids for the upload-driven media kinds"
                },
                "quantity": {
                  "type": "integer",
                  "required": false,
                  "description": "how many of this job you intend to buy, 1..1000 (default 1)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "quantity": {
                  "type": "integer",
                  "description": "same as body.quantity"
                },
                "prompt": {
                  "type": "string",
                  "description": "same as body.prompt"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "workload {requested, type, kind, family, servable}, price {unit_usd, unit_atomic, quantity, total_atomic, asset, decimals, network, source, basis}, capacity — for media {renderers_online, required, probe_age_ms, counted}, for inference {requested_model, animica_workers_serving, serving_workers, required, tier, probe_age_ms, worker_count_unavailable_reason, network, proof}, queue {expected_position, available, reason, renderers_online, observed_on_our_own_submissions[] (position only — job handles are withheld)}, latency {samples, basis, basis_is_requested_kind, queue_ms, exec_ms} (false there means the samples are the family bucket, not this kind), execute {product_id, method, path, url, body, notes[]}, payload_check {ok, problems[]}, guarantees {reserves_capacity:false, locks_price:false}, observed_at {iso, head_height, head_hash}, provenance {deterministic:false, model_free:true, sources[]}. Every figure is read from the single observation stamped in observed_at."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "81850079744",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/compute/quote",
          "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": true,
                  "description": "workload to quote: inference, image, video, audio, or a canonical media kind such as video_i2v or audio_master"
                },
                "prompt": {
                  "type": "string",
                  "required": false,
                  "description": "the prompt you intend to submit; checked for acceptance and copied into the example body, never sent anywhere"
                },
                "params": {
                  "type": "object",
                  "required": false,
                  "description": "render params you intend to submit; shape-checked only"
                },
                "upload_ids": {
                  "type": "array",
                  "required": false,
                  "description": "upload ids for the upload-driven media kinds"
                },
                "quantity": {
                  "type": "integer",
                  "required": false,
                  "description": "how many of this job you intend to buy, 1..1000 (default 1)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "quantity": {
                  "type": "integer",
                  "description": "same as body.quantity"
                },
                "prompt": {
                  "type": "string",
                  "description": "same as body.prompt"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "workload {requested, type, kind, family, servable}, price {unit_usd, unit_atomic, quantity, total_atomic, asset, decimals, network, source, basis}, capacity — for media {renderers_online, required, probe_age_ms, counted}, for inference {requested_model, animica_workers_serving, serving_workers, required, tier, probe_age_ms, worker_count_unavailable_reason, network, proof}, queue {expected_position, available, reason, renderers_online, observed_on_our_own_submissions[] (position only — job handles are withheld)}, latency {samples, basis, basis_is_requested_kind, queue_ms, exec_ms} (false there means the samples are the family bucket, not this kind), execute {product_id, method, path, url, body, notes[]}, payload_check {ok, problems[]}, guarantees {reserves_capacity:false, locks_price:false}, observed_at {iso, head_height, head_hash}, provenance {deterministic:false, model_free:true, sources[]}. Every figure is read from the single observation stamped in observed_at."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "81.850079744 ANM",
            "usd_equivalent": "0.005132",
            "usd_list_price": "0.006843",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "compute_quote",
        "name": "Compute quote",
        "description": "Price and feasibility for ONE specific Animica compute job before you pay for it. Send {kind, prompt, quantity} and get the exact cost in atomic units, whether a GPU miner or AICF worker is online for that exact kind right now (with probe age and chain head), the endpoint and body to POST, and a pre-check of your payload. Refuses with 503 and charges nothing when nothing can serve the work. Buy this when a failed render would cost you more than the quote.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-compute_quote"
      }
    },
    {
      "resource": "https://animica.dev/x402/mining/jobs",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "5703",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/jobs",
          "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": false,
                  "description": "restrict the render matrix to one media kind, e.g. video_t2v or audio_master. Filters the render lane only, so it cannot be combined with lane=proof_of_work or lane=inference_serving"
                },
                "lane": {
                  "type": "string",
                  "required": false,
                  "description": "one of render, proof_of_work, inference_serving (default: all three)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the snapshot with ML-DSA-65 (FIPS 204, scheme 4099)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "lane": {
                  "type": "string",
                  "description": "same as body.lane, for GET callers"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest (\"1\"/\"true\"), for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "feed, generated_at, snapshot_age_ms, summary {kinds_reported, kinds_servable_now, kinds_with_no_renderer, max_renderers_for_any_kind, work_queued_now}, lanes {render {kinds[] {kind, family, renderers_online, servable_now, supply_gap, requirements {cuda, min_vram_gb, min_vram_source, needs, env_override}, sold_by_this_gateway_at}}, proof_of_work {difficulty, theta_micro, network_hashrate, mempool, work_queued_now}, inference_serving {observable, models_serving, serving_workers}}, demand {render_queue_depth, paid_render_jobs_from_this_gateway, proof_of_work_backlog}, enroll {render, proof_of_work, inference_serving}, hardware_source, attestation (when requested)"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "68213716108",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/jobs",
          "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "kind": {
                  "type": "string",
                  "required": false,
                  "description": "restrict the render matrix to one media kind, e.g. video_t2v or audio_master. Filters the render lane only, so it cannot be combined with lane=proof_of_work or lane=inference_serving"
                },
                "lane": {
                  "type": "string",
                  "required": false,
                  "description": "one of render, proof_of_work, inference_serving (default: all three)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the snapshot with ML-DSA-65 (FIPS 204, scheme 4099)"
                }
              },
              "queryParams": {
                "kind": {
                  "type": "string",
                  "description": "same as body.kind, for GET callers"
                },
                "lane": {
                  "type": "string",
                  "description": "same as body.lane, for GET callers"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest (\"1\"/\"true\"), for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "feed, generated_at, snapshot_age_ms, summary {kinds_reported, kinds_servable_now, kinds_with_no_renderer, max_renderers_for_any_kind, work_queued_now}, lanes {render {kinds[] {kind, family, renderers_online, servable_now, supply_gap, requirements {cuda, min_vram_gb, min_vram_source, needs, env_override}, sold_by_this_gateway_at}}, proof_of_work {difficulty, theta_micro, network_hashrate, mempool, work_queued_now}, inference_serving {observable, models_serving, serving_workers}}, demand {render_queue_depth, paid_render_jobs_from_this_gateway, proof_of_work_backlog}, enroll {render, proof_of_work, inference_serving}, hardware_source, attestation (when requested)"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "68.213716108 ANM",
            "usd_equivalent": "0.004277",
            "usd_list_price": "0.005703",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mining_jobs",
        "name": "Miner job feed",
        "description": "Which Animica workloads a machine can earn on, in one poll. Per-kind GPU render supply, with the kinds NOBODY serves flagged as supply gaps; the proof-of-work lane off an Animica node (difficulty, thetaMicro, hashrate with unit+window, mempool depth); VRAM floor and deps per kind from the reference miner client; probed enrolment endpoints. Buy it to decide where to point GPU or hash capacity, or to size a box. Empty queues read empty, unreadable ones unreadable. No observable lane, no charge.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mining_jobs"
      }
    },
    {
      "resource": "https://animica.dev/x402/mining/opportunity",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/opportunity",
          "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "free text, e.g. \"RTX 4090\", \"RX 7900 XTX\", \"M3 Max\", \"16-core CPU\". Required unless hashrate_mhs is given."
                },
                "hashrate_mhs": {
                  "type": "number",
                  "required": false,
                  "description": "YOUR measured SHA3-256 rate in MH/s per unit. Overrides the table and is never derated — pass this if you have benchmarked."
                },
                "vram_gb": {
                  "type": "number",
                  "required": false,
                  "description": "VRAM per unit. Gates which render families are offered; omit to skip the gate entirely."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..4096 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "whole-device draw per unit in watts while working. Defaults to the table value for a matched model; without it no NET figure is produced."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your electricity price in USD per kWh (default 0.15, reported as an assumption)"
                },
                "serving_claimants": {
                  "type": "integer",
                  "required": false,
                  "description": "how many machines you assume claim the service carve; only scales the stated carve CEILING (default 1)"
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY mining Animica, so it is inside the measured network rate and must not be added to the denominator twice (default false)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this answer to the chain height (default false)"
                }
              },
              "queryParams": {
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model, for GET callers"
                },
                "vram_gb": {
                  "type": "number",
                  "description": "same as body.vram_gb"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "hashrate_mhs": {
                  "type": "number",
                  "description": "same as body.hashrate_mhs"
                },
                "serving_claimants": {
                  "type": "integer",
                  "description": "same as body.serving_claimants"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining — pass already_mining=1"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {workload, title, tier, why, comparison_limit}; workloads[] {workload, title, eligible, ineligible_reason, tier} each carrying either mining {share_of_network, share_pct, share_basis, share_clamped?, blocks_per_day, blocks_per_day_capped, anm_per_day, nanm_per_day, usd_per_day_gross, power_usd_per_day, usd_per_day_net, usd_unavailable_reason, break_even_electricity_usd_kwh, marginal_one_more_unit {extra_anm_per_day, extra_usd_per_day_net, worth_it}, fees_excluded} or capacity {kinds, renderers_online_by_kind, best_online, min_renderers_required, unserved_kinds, unserved_count, below_floor_kinds, servable_kinds_today, probe_age_ms, vram_floor_gb, vram_verdict} + revenue {available:false, reason}; machine {gpu_model_as_given, resolved_device, device_class, count, sha3_mhs_per_unit, sha3_mhs_total, provenance (measured|extrapolated|hashcat|modeled|caller_supplied), source, kernel_efficiency_applied, power_w_per_unit, power_w_total, power_w_assumed, power_w_source, vram_gb}; network {hashshare_per_second, difficulty, theta_micro, trials_per_second, trials_per_second_from_difficulty, derivation_spread_ratio, derivations_are_not_independent, denominator_used, network_mhs, observed_seconds_per_block, observed_blocks_per_day, cadence_window, conversion, pooled_transactions}; emission {height, subsidy_anm_per_block, halvings_elapsed, service_carve_active, split_pct, miner_anm_per_block, carve_anm_per_block, network_daily_cap_anm, split_provenance}; price {available, usd_per_anm, side, source, observed_at, age_seconds} or {available:false, reason, detail, consequence}; service_carve {active, ceiling_anm_per_day, ceiling_blocks_per_day_used, assumed_claimants}; capacity_census; inference_workers; excluded_workloads[]; ranking_rule[]; assumptions{}; inference {used:false}; attestation? (ML-DSA-65 envelope); as_of {head_height, head_hash, observed_at}; took_ms; computed_at. ALL ANM and USD figures are decimal STRINGS carried from integer nANM / micro-dollars; the floats are ratios and measurements only."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/opportunity",
          "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "free text, e.g. \"RTX 4090\", \"RX 7900 XTX\", \"M3 Max\", \"16-core CPU\". Required unless hashrate_mhs is given."
                },
                "hashrate_mhs": {
                  "type": "number",
                  "required": false,
                  "description": "YOUR measured SHA3-256 rate in MH/s per unit. Overrides the table and is never derated — pass this if you have benchmarked."
                },
                "vram_gb": {
                  "type": "number",
                  "required": false,
                  "description": "VRAM per unit. Gates which render families are offered; omit to skip the gate entirely."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..4096 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "whole-device draw per unit in watts while working. Defaults to the table value for a matched model; without it no NET figure is produced."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your electricity price in USD per kWh (default 0.15, reported as an assumption)"
                },
                "serving_claimants": {
                  "type": "integer",
                  "required": false,
                  "description": "how many machines you assume claim the service carve; only scales the stated carve CEILING (default 1)"
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY mining Animica, so it is inside the measured network rate and must not be added to the denominator twice (default false)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this answer to the chain height (default false)"
                }
              },
              "queryParams": {
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model, for GET callers"
                },
                "vram_gb": {
                  "type": "number",
                  "description": "same as body.vram_gb"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "hashrate_mhs": {
                  "type": "number",
                  "description": "same as body.hashrate_mhs"
                },
                "serving_claimants": {
                  "type": "integer",
                  "description": "same as body.serving_claimants"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining — pass already_mining=1"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {workload, title, tier, why, comparison_limit}; workloads[] {workload, title, eligible, ineligible_reason, tier} each carrying either mining {share_of_network, share_pct, share_basis, share_clamped?, blocks_per_day, blocks_per_day_capped, anm_per_day, nanm_per_day, usd_per_day_gross, power_usd_per_day, usd_per_day_net, usd_unavailable_reason, break_even_electricity_usd_kwh, marginal_one_more_unit {extra_anm_per_day, extra_usd_per_day_net, worth_it}, fees_excluded} or capacity {kinds, renderers_online_by_kind, best_online, min_renderers_required, unserved_kinds, unserved_count, below_floor_kinds, servable_kinds_today, probe_age_ms, vram_floor_gb, vram_verdict} + revenue {available:false, reason}; machine {gpu_model_as_given, resolved_device, device_class, count, sha3_mhs_per_unit, sha3_mhs_total, provenance (measured|extrapolated|hashcat|modeled|caller_supplied), source, kernel_efficiency_applied, power_w_per_unit, power_w_total, power_w_assumed, power_w_source, vram_gb}; network {hashshare_per_second, difficulty, theta_micro, trials_per_second, trials_per_second_from_difficulty, derivation_spread_ratio, derivations_are_not_independent, denominator_used, network_mhs, observed_seconds_per_block, observed_blocks_per_day, cadence_window, conversion, pooled_transactions}; emission {height, subsidy_anm_per_block, halvings_elapsed, service_carve_active, split_pct, miner_anm_per_block, carve_anm_per_block, network_daily_cap_anm, split_provenance}; price {available, usd_per_anm, side, source, observed_at, age_seconds} or {available:false, reason, detail, consequence}; service_carve {active, ceiling_anm_per_day, ceiling_blocks_per_day_used, assumed_claimants}; capacity_census; inference_workers; excluded_workloads[]; ranking_rule[]; assumptions{}; inference {used:false}; attestation? (ML-DSA-65 envelope); as_of {head_height, head_hash, observed_at}; took_ms; computed_at. ALL ANM and USD figures are decimal STRINGS carried from integer nANM / micro-dollars; the floats are ratios and measurements only."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mining_opportunity",
        "name": "GPU opportunity router (Animica)",
        "description": "Buy this before pointing a GPU at Animica, or when you run one and need to know whether today it should mine, render or stay off. Send gpu_model, vram_gb, count, power_w and electricity_usd_kwh; get a deterministic ranking of the workloads this network can actually use right now — proof-of-work mining, image, video, audio or idle. Mining is priced from LIVE chain state (difficulty, the observed block interval, the subsidy at the current height, the ANM/USD feed): ANM/day, USD/day gross and NET of power, the break-even electricity price, and the marginal effect of one more card — which on a capped-emission chain is frequently NEGATIVE, so eight cards can net less than one. Rendering is ranked on a live renderer census: which media kinds have ZERO GPU miners online, i.e. where you would be the only supplier. Rendering gets no dollar figure on purpose — the marketplace publishes no job-arrival rate, and inventing one would be the most useful-looking number here and the only fabricated one. No model is consulted, so the same inputs rank the same way twice. Pass already_mining:true if this rig is ALREADY on Animica, or its own work is counted in both your share and the network it is divided into. Optional ML-DSA-65 attestation binds the answer to a chain height. Unreachable node: NOT charged. Dead price feed: you still get ANM/day and the census, USD null with the reason. Renderer census down: mining is still priced and the census field says why it could not be read, which is not the same fact as zero renderers.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mining_opportunity"
      }
    },
    {
      "resource": "https://animica.dev/x402/mining/profit",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/profit",
          "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hashrate_hps": {
                  "type": "number",
                  "required": true,
                  "description": "raw trials per second PER UNIT, as your Animica miner reports it for this chain. Not a SHA-256 or ethash figure from another coin, and not HShare/s."
                },
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "a LABEL returned unchanged for your records. No hashrate is looked up from it — we hold no hardware table and will not invent one."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..100000 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "wall watts PER UNIT. Omit and the electricity and net lines come back null rather than as a fabricated zero."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh. Omit and the electricity and net lines come back null."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you pay, 0..50 (default 0 = solo). Your assumption, not a measured value."
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY inside the measured network hashrate, so it is not added to the denominator twice (default false)"
                }
              },
              "queryParams": {
                "hashrate_hps": {
                  "type": "number",
                  "description": "same as body.hashrate_hps, for GET callers"
                },
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, template_height, computed_at}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, total_emission_usd_day, node_hashrate}; price {usd_per_anm, side, source, observed_at, age_seconds}; your_share {trials_per_second, denominator_trials_per_second, basis, pct}; estimate {anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d}; at_target_interval; dilution {existing_miners_revenue_change_pct, doubling_multiplier}; break_even {electricity_usd_kwh, anm_price_usd}; verdict; method; caveats; inference {used:false}. Every *_usd* and *_anm* value is a decimal STRING — USD at twelve decimals, ANM at nine — because a miner's daily revenue on this chain is smaller than the micro-dollar grid the rest of the gateway settles in and would otherwise render as a zero."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/profit",
          "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hashrate_hps": {
                  "type": "number",
                  "required": true,
                  "description": "raw trials per second PER UNIT, as your Animica miner reports it for this chain. Not a SHA-256 or ethash figure from another coin, and not HShare/s."
                },
                "gpu_model": {
                  "type": "string",
                  "required": false,
                  "description": "a LABEL returned unchanged for your records. No hashrate is looked up from it — we hold no hardware table and will not invent one."
                },
                "count": {
                  "type": "integer",
                  "required": false,
                  "description": "how many identical units, 1..100000 (default 1)"
                },
                "power_w": {
                  "type": "number",
                  "required": false,
                  "description": "wall watts PER UNIT. Omit and the electricity and net lines come back null rather than as a fabricated zero."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh. Omit and the electricity and net lines come back null."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you pay, 0..50 (default 0 = solo). Your assumption, not a measured value."
                },
                "already_mining": {
                  "type": "boolean",
                  "required": false,
                  "description": "true if this hardware is ALREADY inside the measured network hashrate, so it is not added to the denominator twice (default false)"
                }
              },
              "queryParams": {
                "hashrate_hps": {
                  "type": "number",
                  "description": "same as body.hashrate_hps, for GET callers"
                },
                "gpu_model": {
                  "type": "string",
                  "description": "same as body.gpu_model"
                },
                "count": {
                  "type": "integer",
                  "description": "same as body.count"
                },
                "power_w": {
                  "type": "number",
                  "description": "same as body.power_w"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "already_mining": {
                  "type": "boolean",
                  "description": "same as body.already_mining"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, template_height, computed_at}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, total_emission_usd_day, node_hashrate}; price {usd_per_anm, side, source, observed_at, age_seconds}; your_share {trials_per_second, denominator_trials_per_second, basis, pct}; estimate {anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d}; at_target_interval; dilution {existing_miners_revenue_change_pct, doubling_multiplier}; break_even {electricity_usd_kwh, anm_price_usd}; verdict; method; caveats; inference {used:false}. Every *_usd* and *_anm* value is a decimal STRING — USD at twelve decimals, ANM at nine — because a miner's daily revenue on this chain is smaller than the micro-dollar grid the rest of the gateway settles in and would otherwise render as a zero."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mining_profit",
        "name": "Animica mining profit, computed at a chain height",
        "description": "Deterministic mining P&L for Animica L1 at a named chain height. The per-block reward comes from the node's own live block template, not the published subsidy split (which is wrong by 2x on mainnet); the block interval and difficulty are measured, the ANM price is the NonKYC bid. Buy before pointing hardware here: it states the FIXED daily pot every miner shares, your share AFTER you join, and how much you dilute the incumbents. No model, no growth curve. Backend down = 503, no charge.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mining_profit"
      }
    },
    {
      "resource": "https://animica.dev/x402/mining/breakeven",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/breakeven",
          "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hardware_cost_usd": {
                  "type": "number",
                  "required": true,
                  "description": "up-front cost of the rig in USD; 0 for hardware you already own"
                },
                "power_watts": {
                  "type": "number",
                  "required": true,
                  "description": "draw at the wall for the whole rig, in watts"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "required": true,
                  "description": "what you pay per kWh, in USD"
                },
                "payout_address": {
                  "type": "string",
                  "required": false,
                  "description": "anim1… address or 32-byte hex digest — your share is MEASURED from the blocks it produced. Supply exactly one of payout_address, hashrate_hs or network_share_percent"
                },
                "hashrate_hs": {
                  "type": "number",
                  "required": false,
                  "description": "the rig's sha3-256 rate in HASHES per second (5e9 for a 5 GH/s card). Modelled as hardware being ADDED to the network"
                },
                "network_share_percent": {
                  "type": "number",
                  "required": false,
                  "description": "your share of block production as a percentage, if you already know it"
                },
                "window_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "blocks to measure a payout_address over, 20..500 (default 200)"
                },
                "pool_fee_percent": {
                  "type": "number",
                  "required": false,
                  "description": "fee your pool takes off mined ANM (default 0)"
                },
                "uptime_percent": {
                  "type": "number",
                  "required": false,
                  "description": "share of the day the rig runs; applied to both revenue and power (default 100)"
                },
                "other_costs_usd_per_month": {
                  "type": "number",
                  "required": false,
                  "description": "hosting, cooling, bandwidth — anything recurring that is not power (default 0)"
                },
                "horizons_days": {
                  "type": "array",
                  "required": false,
                  "description": "up to 6 day counts to solve the required ANM price at (default 30,90,180,365)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "attach an ML-DSA-65 signature over the measured facts and the verdict"
                }
              },
              "queryParams": {
                "hardware_cost_usd": {
                  "type": "number",
                  "description": "same as the body field, for GET callers"
                },
                "power_watts": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "hashrate_hs": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "payout_address": {
                  "type": "string",
                  "description": "same as the body field"
                },
                "horizons_days": {
                  "type": "string",
                  "description": "comma-separated day counts"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "breaks_even, breakeven_days, breakeven_date, verdict, economics {revenue_usd_per_day, electricity_usd_per_day, other_costs_usd_per_day, net_usd_per_day, net_usd_per_month, anm_per_day, expected_blocks_per_day, expected_days_between_blocks}, price_required {current_usd_per_anm, to_cover_running_costs_usd_per_anm, at_horizon[] {days, usd_per_anm, multiple_of_current}}, sensitivity {max_electricity_usd_per_kwh[]}, production {model, share_of_network_percent, source}, chain {head_height, miner_reward_anm_per_block, schedule_says_anm_per_block, observed_seconds_per_block, observed_blocks_per_day, network_ceiling_*, next_subsidy_halving}, assumptions[] {name, value, source}, caveats[], sources{}, attestation?, as_of"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/breakeven",
          "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "hardware_cost_usd": {
                  "type": "number",
                  "required": true,
                  "description": "up-front cost of the rig in USD; 0 for hardware you already own"
                },
                "power_watts": {
                  "type": "number",
                  "required": true,
                  "description": "draw at the wall for the whole rig, in watts"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "required": true,
                  "description": "what you pay per kWh, in USD"
                },
                "payout_address": {
                  "type": "string",
                  "required": false,
                  "description": "anim1… address or 32-byte hex digest — your share is MEASURED from the blocks it produced. Supply exactly one of payout_address, hashrate_hs or network_share_percent"
                },
                "hashrate_hs": {
                  "type": "number",
                  "required": false,
                  "description": "the rig's sha3-256 rate in HASHES per second (5e9 for a 5 GH/s card). Modelled as hardware being ADDED to the network"
                },
                "network_share_percent": {
                  "type": "number",
                  "required": false,
                  "description": "your share of block production as a percentage, if you already know it"
                },
                "window_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "blocks to measure a payout_address over, 20..500 (default 200)"
                },
                "pool_fee_percent": {
                  "type": "number",
                  "required": false,
                  "description": "fee your pool takes off mined ANM (default 0)"
                },
                "uptime_percent": {
                  "type": "number",
                  "required": false,
                  "description": "share of the day the rig runs; applied to both revenue and power (default 100)"
                },
                "other_costs_usd_per_month": {
                  "type": "number",
                  "required": false,
                  "description": "hosting, cooling, bandwidth — anything recurring that is not power (default 0)"
                },
                "horizons_days": {
                  "type": "array",
                  "required": false,
                  "description": "up to 6 day counts to solve the required ANM price at (default 30,90,180,365)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "attach an ML-DSA-65 signature over the measured facts and the verdict"
                }
              },
              "queryParams": {
                "hardware_cost_usd": {
                  "type": "number",
                  "description": "same as the body field, for GET callers"
                },
                "power_watts": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "electricity_usd_per_kwh": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "hashrate_hs": {
                  "type": "number",
                  "description": "same as the body field"
                },
                "payout_address": {
                  "type": "string",
                  "description": "same as the body field"
                },
                "horizons_days": {
                  "type": "string",
                  "description": "comma-separated day counts"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "breaks_even, breakeven_days, breakeven_date, verdict, economics {revenue_usd_per_day, electricity_usd_per_day, other_costs_usd_per_day, net_usd_per_day, net_usd_per_month, anm_per_day, expected_blocks_per_day, expected_days_between_blocks}, price_required {current_usd_per_anm, to_cover_running_costs_usd_per_anm, at_horizon[] {days, usd_per_anm, multiple_of_current}}, sensitivity {max_electricity_usd_per_kwh[]}, production {model, share_of_network_percent, source}, chain {head_height, miner_reward_anm_per_block, schedule_says_anm_per_block, observed_seconds_per_block, observed_blocks_per_day, network_ceiling_*, next_subsidy_halving}, assumptions[] {name, value, source}, caveats[], sources{}, attestation?, as_of"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mining_breakeven",
        "name": "Animica mining break-even",
        "description": "Break-even for Animica mining from live chain state. The per-block miner reward is read off the node's block template, not the params file that still advertises the pre-carve figure; cadence, network hashrate and the ANM bid are measured too. Send hardware cost, watts, $/kWh and either your payout address (we count the blocks it won), your hashrate, or your share. Returns break-even days, the ANM price needed at each horizon, and every assumption named. Says so plainly when it never breaks even.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mining_breakeven"
      }
    },
    {
      "resource": "https://animica.dev/x402/mining/compare",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/mining/compare",
          "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "rigs": {
                  "type": "array",
                  "required": true,
                  "description": "1..12 candidate rigs. Each entry is an object: gpu_model (string LABEL, returned unchanged — no hashrate, wattage or VRAM is looked up from it, this product holds no hardware table), hashrate_hps (number, REQUIRED — raw trials per second per unit as YOUR Animica miner reports them for this chain, not a SHA-256/ethash benchmark and not HShare/s), power_w (number, wall watts per unit — omit and the net/payback lines come back null rather than as a fabricated zero), cost_usd (number, purchase price per unit — omit and payback comes back null), vram_gb (number — omit and the render column reports which kinds it could not confirm), count (integer, identical units, default 1). A bare JSON array body is accepted as the rigs list."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh, shared by every rig. Omit and electricity, net and payback come back null with the reason."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you would pay, 0..50 (default 0 = solo). YOUR assumption, carried through unchanged."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this ranking to the chain height it was computed at (default false)"
                }
              },
              "queryParams": {
                "rig": {
                  "type": "string",
                  "description": "repeatable, one per candidate: `gpu_model,hashrate_hps,power_w,cost_usd,vram_gb,count`. Trailing fields and empty slots may be omitted: `RTX4090,120000,450,1600,24`."
                },
                "rigs": {
                  "type": "string",
                  "description": "the body `rigs` array as a JSON string, for GET callers that would rather send JSON"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; ranking {basis, basis_reason, order[], winner, margin_over_runner_up_usd_day, profitable_candidates, winner_is_least_loss, verdict, power_dominates_the_ranking, note}; rigs[] each {rank, label, inputs, mining {share_pct, anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d, break_even_electricity_usd_kwh, hashrate_per_watt, capex_usd, payback_days, net_usd_day_per_1000_usd_capex}, render {best_use, servable_kinds, kinds[] with min_vram_gb + renderers_online + clears_vram, no_dollar_figure}}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, node_hashrate}; render_census {probe_age_ms, min_renderers, kinds, families}; vram_floors {source, floors, caveat}; price {usd_per_anm, side, source, observed_at, age_seconds}; method; caveats; inference {used:false}; attestation? (ML-DSA-65 envelope); animica? (provenance receipt); took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/mining/compare",
          "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "rigs": {
                  "type": "array",
                  "required": true,
                  "description": "1..12 candidate rigs. Each entry is an object: gpu_model (string LABEL, returned unchanged — no hashrate, wattage or VRAM is looked up from it, this product holds no hardware table), hashrate_hps (number, REQUIRED — raw trials per second per unit as YOUR Animica miner reports them for this chain, not a SHA-256/ethash benchmark and not HShare/s), power_w (number, wall watts per unit — omit and the net/payback lines come back null rather than as a fabricated zero), cost_usd (number, purchase price per unit — omit and payback comes back null), vram_gb (number — omit and the render column reports which kinds it could not confirm), count (integer, identical units, default 1). A bare JSON array body is accepted as the rigs list."
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "required": false,
                  "description": "your tariff in USD per kWh, shared by every rig. Omit and electricity, net and payback come back null with the reason."
                },
                "pool_fee_pct": {
                  "type": "number",
                  "required": false,
                  "description": "pool fee you would pay, 0..50 (default 0 = solo). YOUR assumption, carried through unchanged."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this ranking to the chain height it was computed at (default false)"
                }
              },
              "queryParams": {
                "rig": {
                  "type": "string",
                  "description": "repeatable, one per candidate: `gpu_model,hashrate_hps,power_w,cost_usd,vram_gb,count`. Trailing fields and empty slots may be omitted: `RTX4090,120000,450,1600,24`."
                },
                "rigs": {
                  "type": "string",
                  "description": "the body `rigs` array as a JSON string, for GET callers that would rather send JSON"
                },
                "electricity_usd_kwh": {
                  "type": "number",
                  "description": "same as body.electricity_usd_kwh"
                },
                "pool_fee_pct": {
                  "type": "number",
                  "description": "same as body.pool_fee_pct"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; ranking {basis, basis_reason, order[], winner, margin_over_runner_up_usd_day, profitable_candidates, winner_is_least_loss, verdict, power_dominates_the_ranking, note}; rigs[] each {rank, label, inputs, mining {share_pct, anm_per_day, gross_usd_day, pool_fee_usd_day, revenue_usd_day, electricity_usd_day, net_usd_day, net_usd_30d, break_even_electricity_usd_kwh, hashrate_per_watt, capex_usd, payback_days, net_usd_day_per_1000_usd_capex}, render {best_use, servable_kinds, kinds[] with min_vram_gb + renderers_online + clears_vram, no_dollar_figure}}; network {miner_reward_per_block_anm, block_subsidy_total_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, mean_block_interval_seconds, blocks_per_day_observed, expected_trials_per_block, network_trials_per_second, miner_pot_anm_day, total_network_revenue_usd_day, node_hashrate}; render_census {probe_age_ms, min_renderers, kinds, families}; vram_floors {source, floors, caveat}; price {usd_per_anm, side, source, observed_at, age_seconds}; method; caveats; inference {used:false}; attestation? (ML-DSA-65 envelope); animica? (provenance receipt); took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "mining_compare",
        "name": "Animica rig comparison (mine or render)",
        "description": "Buy this before spending money on GPUs for Animica, or when choosing which of several boxes to point here. POST an array of candidate rigs — gpu_model, hashrate_hps, power_w, cost_usd, vram_gb — and get them RANKED by net Animica return against live network state: the per-block reward from the node's own block template (not the published subsidy split, which overstates the miner's slice by 2x on mainnet), the measured block interval, live difficulty, and the ANM/USD bid. Per rig you get ANM/day, USD/day gross and NET of power, break-even electricity price, payback days from cost_usd, and USD/day per $1,000 of capital. Every rig ALSO gets its best non-PoW Animica use: which marketplace media kinds its VRAM clears (floors parsed live from the reference miner client, never remembered) crossed against a live census of how many GPU miners serve each kind — so a card that loses on hashrate can still win because it is the only supplier for a kind nobody serves. Rendering gets no USD figure on purpose: no job-arrival rate is published and inventing one would be the only fabricated number here. Deterministic, no model called, optional ML-DSA-65 attestation binding the ranking to a chain height. Node, renderer census or price feed unreachable: 503 with the reason, NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-mining_compare"
      }
    },
    {
      "resource": "https://animica.dev/x402/pq/sign",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/sign",
          "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "64 hex characters — the 32-byte digest of your document. Send this OR payload, never both. Your document never leaves your side."
                },
                "payload": {
                  "type": "object",
                  "required": false,
                  "description": "a JSON value to canonicalise and SHA-256 here instead of sending a digest. Hashed and dropped: never stored, logged or returned."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how YOU computed digest, recorded in the signature as your declaration: sha256, sha3-256, keccak-256, blake2b-256. Omit it and the signature says sha256 with document_digest_alg_source:'assumed_default' — a default, marked as one, never presented as something you stated. With payload it must be omitted or sha256, which is what we run."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your own annotation for what this covers, up to 128 printable ASCII characters; signed, and marked in the envelope as the client's claim"
                }
              },
              "queryParams": {
                "digest": {
                  "type": "string",
                  "description": "same as body.digest, for GET callers"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "alg, scheme_id, scheme, digest, digest_alg, digest_alg_source (client_declared|assumed_default|gateway_computed), digest_source (client|gateway), canonical_bytes, label, signature, public_key, key_id, signed_at, commitment {type, document_digest, document_digest_alg, document_digest_alg_source, digest_source, canonical_bytes, canonicalisation, client_label}, envelope {kind, canonical_form, digest, payload, verification} (the self-contained object to publish or POST back), commitment_digest, commitment_digest_alg, binding, verify {endpoint, url, price}, public_key_endpoint, took_ms, payload_disclosed:false"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/sign",
          "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "digest": {
                  "type": "string",
                  "required": false,
                  "description": "64 hex characters — the 32-byte digest of your document. Send this OR payload, never both. Your document never leaves your side."
                },
                "payload": {
                  "type": "object",
                  "required": false,
                  "description": "a JSON value to canonicalise and SHA-256 here instead of sending a digest. Hashed and dropped: never stored, logged or returned."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how YOU computed digest, recorded in the signature as your declaration: sha256, sha3-256, keccak-256, blake2b-256. Omit it and the signature says sha256 with document_digest_alg_source:'assumed_default' — a default, marked as one, never presented as something you stated. With payload it must be omitted or sha256, which is what we run."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your own annotation for what this covers, up to 128 printable ASCII characters; signed, and marked in the envelope as the client's claim"
                }
              },
              "queryParams": {
                "digest": {
                  "type": "string",
                  "description": "same as body.digest, for GET callers"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "alg, scheme_id, scheme, digest, digest_alg, digest_alg_source (client_declared|assumed_default|gateway_computed), digest_source (client|gateway), canonical_bytes, label, signature, public_key, key_id, signed_at, commitment {type, document_digest, document_digest_alg, document_digest_alg_source, digest_source, canonical_bytes, canonicalisation, client_label}, envelope {kind, canonical_form, digest, payload, verification} (the self-contained object to publish or POST back), commitment_digest, commitment_digest_alg, binding, verify {endpoint, url, price}, public_key_endpoint, took_ms, payload_disclosed:false"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "pq_sign",
        "name": "Post-quantum document signature (ML-DSA-65)",
        "description": "Get a post-quantum ML-DSA-65 signature (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) over a document you never have to send us. Post a sha256 digest, or post a JSON payload and we canonicalise and hash it here; either way the signature covers the HASH, so the resulting envelope can be published, escrowed or put on-chain without disclosing the content. Buy this when a claim has to stay checkable by a third party years from now — a dataset manifest, a model card, an audit-log segment, a delivery receipt between two agents, the exact bytes of an agreement — because an HMAC proves nothing to anyone but its issuer and an ECDSA signature made today is retrospectively forgeable once a cryptographically-relevant quantum computer exists. You need no PQ library and no key of your own. Verification is FREE (POST /x402/pq/sign/verify) and the signing public key is FREE (GET /x402/pq/sign/pubkey), so anyone can check an envelope offline without paying us. The signed statement records whether YOU or WE computed the digest, because those are different claims. If the signer or its key is not reachable you get a 503 with the reason and are NOT charged — this endpoint has no branch that returns an unsigned envelope.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-pq_sign"
      }
    },
    {
      "resource": "https://animica.dev/x402/pq/envelope",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/envelope",
          "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "payload": {
                  "type": "any",
                  "required": true,
                  "description": "the JSON value to seal — object, array, string, number, boolean or null. Sealed verbatim; nothing is normalised, rewritten or interpreted."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your filing tag, bound INSIDE the signature as kind \"api-response/<label>\". Up to 64 chars of [A-Za-z0-9._:- ]. Namespaced so it can never impersonate one of this gateway's own attestations."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed object also carries an observed Animica chain head {height, hash}: a lower bound on when the seal happened that this gateway cannot inflate, because a block hash cannot exist before its block. Nothing is written to the chain — the head is read from a node. If the node is unreachable the call 503s and you are NOT charged."
                },
                "include_canonical_form": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. Return the exact hashed bytes (only when under 8192 chars) as a debugging aid for canonicalisation interop."
                }
              },
              "queryParams": {
                "payload": {
                  "type": "string",
                  "description": "GET callers: the payload as JSON text"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                },
                "include_canonical_form": {
                  "type": "string",
                  "description": "true|1 to return the exact hashed bytes"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "sealed:true, payload (verbatim), subject {mode, object, object_note, digest_alg, digest, canonical_bytes, canonical_chars, canonical_form, canonical_form_omitted, canonicalisation}, envelope {type, kind, alg, scheme_id, domain, chain_id, prehash, digest, signed_at, canonical_form, public_key, key_id, signature}, chain_anchor {height, hash, chain_id, block_timestamp, inside_signature, published_on_chain:false, means} or null, label, kind, verification {proves, does_not_prove, steps, offline, free_endpoints, issuer_key_id}, inference:null, computation {deterministic:true, model_used:false}, sealed_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/envelope",
          "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "payload": {
                  "type": "any",
                  "required": true,
                  "description": "the JSON value to seal — object, array, string, number, boolean or null. Sealed verbatim; nothing is normalised, rewritten or interpreted."
                },
                "label": {
                  "type": "string",
                  "required": false,
                  "description": "your filing tag, bound INSIDE the signature as kind \"api-response/<label>\". Up to 64 chars of [A-Za-z0-9._:- ]. Namespaced so it can never impersonate one of this gateway's own attestations."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed object also carries an observed Animica chain head {height, hash}: a lower bound on when the seal happened that this gateway cannot inflate, because a block hash cannot exist before its block. Nothing is written to the chain — the head is read from a node. If the node is unreachable the call 503s and you are NOT charged."
                },
                "include_canonical_form": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. Return the exact hashed bytes (only when under 8192 chars) as a debugging aid for canonicalisation interop."
                }
              },
              "queryParams": {
                "payload": {
                  "type": "string",
                  "description": "GET callers: the payload as JSON text"
                },
                "label": {
                  "type": "string",
                  "description": "same as body.label"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                },
                "include_canonical_form": {
                  "type": "string",
                  "description": "true|1 to return the exact hashed bytes"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "sealed:true, payload (verbatim), subject {mode, object, object_note, digest_alg, digest, canonical_bytes, canonical_chars, canonical_form, canonical_form_omitted, canonicalisation}, envelope {type, kind, alg, scheme_id, domain, chain_id, prehash, digest, signed_at, canonical_form, public_key, key_id, signature}, chain_anchor {height, hash, chain_id, block_timestamp, inside_signature, published_on_chain:false, means} or null, label, kind, verification {proves, does_not_prove, steps, offline, free_endpoints, issuer_key_id}, inference:null, computation {deterministic:true, model_used:false}, sealed_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "pq_envelope",
        "name": "Post-quantum API response envelope",
        "description": "Seal any JSON in a post-quantum signed envelope: canonicalise (keys sorted, stable bytes), SHA3-256, then sign that digest with ML-DSA-65 (FIPS 204, scheme 4099) — the scheme the Animica L1 admits transactions with. Buy it when a response you emit must cross a broker, cache or reseller and still be provably unaltered. Proves INTEGRITY and ANIMICA ORIGIN, not that the content is true and not anyone's real-world identity. Key and verification are free. No signature, no charge.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-pq_envelope"
      }
    },
    {
      "resource": "https://animica.dev/x402/pq/artifact",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/artifact",
          "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "name": {
                  "type": "string",
                  "required": true,
                  "description": "the artifact's identity — package, image, repo or model name, up to 200 printable ASCII characters (e.g. \"ghcr.io/acme/api\", \"meta-llama/Llama-3-8B\"). Signed."
                },
                "version": {
                  "type": "string",
                  "required": true,
                  "description": "the release identifier, up to 100 printable ASCII characters (e.g. \"1.4.2\", \"2026-08-22\", \"sha-9f3ac1\"). Signed."
                },
                "digest": {
                  "type": "string",
                  "required": true,
                  "description": "the hash of the artifact, computed by YOU: \"sha256:<hex>\", \"0x<hex>\" or bare hex. Supported: sha256, sha512, sha3-256, sha3-512, blake2b-256, blake2b-512, blake3. The artifact itself never leaves your side."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how you hashed it, if the digest carries no \"alg:\" prefix. Defaults from the digest length (64 hex -> sha256, 128 -> sha512) and the manifest records which of those two it was. SHA-1 and MD5 are refused."
                },
                "metadata": {
                  "type": "object",
                  "required": false,
                  "description": "your own JSON object about this release — build id, git commit, toolchain, licence, training run. Canonicalised and signed, capped at 8192 canonical characters. NEVER written into the anchor record under any anchor setting."
                },
                "anchor": {
                  "type": "string",
                  "required": false,
                  "description": "false | \"digest\" (default: records hashes and timestamps only) | \"identity\" (also records name and version). Writes a record into THIS node's data-availability store — not into a block, and evictable — so treat it as retrievable tamper-evidence, not as a timestamp authority."
                },
                "require_anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, an unwritable DA store raises 503 and charges nothing instead of returning a signed-but-unstored manifest — set this if the stored record is what you are buying. It can never be satisfied on a gateway with anchoring switched off, and that is refused at validation time rather than after a payment."
                },
                "include_payer": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, the identity the payment verified under is signed INTO the manifest as requested_by, binding the release to the account that published it: the x402 payer address on the on-chain lane, or \"voucher:<id>\" when paid from prepaid credits (and null if neither is known). Never anchored."
                }
              },
              "queryParams": {
                "name": {
                  "type": "string",
                  "description": "same as body.name, for GET callers"
                },
                "version": {
                  "type": "string",
                  "description": "same as body.version"
                },
                "digest": {
                  "type": "string",
                  "description": "same as body.digest"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "anchor": {
                  "type": "string",
                  "description": "same as body.anchor"
                },
                "require_anchor": {
                  "type": "string",
                  "description": "same as body.require_anchor (\"true\"/\"false\")"
                },
                "include_payer": {
                  "type": "string",
                  "description": "same as body.include_payer (\"true\"/\"false\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifact {name, version, digest, digest_alg, digest_alg_source, digest_computed_by}, metadata, manifest (the exact statement signed), alg, scheme_id, scheme, signature, public_key, key_id, signed_at, manifest_digest, envelope (self-contained: post it back to the free verifier), chain {chain_id, head_height, head_hash, observed_at, published_on_chain:false, means, not_a_consensus_timestamp:true} or {available:false, reason}, anchor {anchored, mode, reason, commitment, blob_id, namespace, record, record_bytes_base64, proof {leaf_index, leaf_hash, siblings, tree_height}, published_on_chain:false, durability {eviction_policy, on_full} read from da.status, discloses}, binding (how to re-derive it all), artifact_disclosed:false, verify, public_key_endpoint, inference:null, deterministic {response:false, manifest_canonicalisation:true, model_free:true} — the canonicalisation and the digest repeat, the timestamps, head, commitment and randomised signature do not — took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/artifact",
          "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "name": {
                  "type": "string",
                  "required": true,
                  "description": "the artifact's identity — package, image, repo or model name, up to 200 printable ASCII characters (e.g. \"ghcr.io/acme/api\", \"meta-llama/Llama-3-8B\"). Signed."
                },
                "version": {
                  "type": "string",
                  "required": true,
                  "description": "the release identifier, up to 100 printable ASCII characters (e.g. \"1.4.2\", \"2026-08-22\", \"sha-9f3ac1\"). Signed."
                },
                "digest": {
                  "type": "string",
                  "required": true,
                  "description": "the hash of the artifact, computed by YOU: \"sha256:<hex>\", \"0x<hex>\" or bare hex. Supported: sha256, sha512, sha3-256, sha3-512, blake2b-256, blake2b-512, blake3. The artifact itself never leaves your side."
                },
                "digest_alg": {
                  "type": "string",
                  "required": false,
                  "description": "how you hashed it, if the digest carries no \"alg:\" prefix. Defaults from the digest length (64 hex -> sha256, 128 -> sha512) and the manifest records which of those two it was. SHA-1 and MD5 are refused."
                },
                "metadata": {
                  "type": "object",
                  "required": false,
                  "description": "your own JSON object about this release — build id, git commit, toolchain, licence, training run. Canonicalised and signed, capped at 8192 canonical characters. NEVER written into the anchor record under any anchor setting."
                },
                "anchor": {
                  "type": "string",
                  "required": false,
                  "description": "false | \"digest\" (default: records hashes and timestamps only) | \"identity\" (also records name and version). Writes a record into THIS node's data-availability store — not into a block, and evictable — so treat it as retrievable tamper-evidence, not as a timestamp authority."
                },
                "require_anchor": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, an unwritable DA store raises 503 and charges nothing instead of returning a signed-but-unstored manifest — set this if the stored record is what you are buying. It can never be satisfied on a gateway with anchoring switched off, and that is refused at validation time rather than after a payment."
                },
                "include_payer": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true, the identity the payment verified under is signed INTO the manifest as requested_by, binding the release to the account that published it: the x402 payer address on the on-chain lane, or \"voucher:<id>\" when paid from prepaid credits (and null if neither is known). Never anchored."
                }
              },
              "queryParams": {
                "name": {
                  "type": "string",
                  "description": "same as body.name, for GET callers"
                },
                "version": {
                  "type": "string",
                  "description": "same as body.version"
                },
                "digest": {
                  "type": "string",
                  "description": "same as body.digest"
                },
                "digest_alg": {
                  "type": "string",
                  "description": "same as body.digest_alg"
                },
                "anchor": {
                  "type": "string",
                  "description": "same as body.anchor"
                },
                "require_anchor": {
                  "type": "string",
                  "description": "same as body.require_anchor (\"true\"/\"false\")"
                },
                "include_payer": {
                  "type": "string",
                  "description": "same as body.include_payer (\"true\"/\"false\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "artifact {name, version, digest, digest_alg, digest_alg_source, digest_computed_by}, metadata, manifest (the exact statement signed), alg, scheme_id, scheme, signature, public_key, key_id, signed_at, manifest_digest, envelope (self-contained: post it back to the free verifier), chain {chain_id, head_height, head_hash, observed_at, published_on_chain:false, means, not_a_consensus_timestamp:true} or {available:false, reason}, anchor {anchored, mode, reason, commitment, blob_id, namespace, record, record_bytes_base64, proof {leaf_index, leaf_hash, siblings, tree_height}, published_on_chain:false, durability {eviction_policy, on_full} read from da.status, discloses}, binding (how to re-derive it all), artifact_disclosed:false, verify, public_key_endpoint, inference:null, deterministic {response:false, manifest_canonicalisation:true, model_free:true} — the canonicalisation and the digest repeat, the timestamps, head, commitment and randomised signature do not — took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "pq_artifact",
        "name": "Post-quantum artifact attestation (ML-DSA-65, chain-head pinned)",
        "description": "Bind a build to its identity with a post-quantum signature: POST {name, version, digest} and get an ML-DSA-65 manifest (FIPS 204, alg 4099/0x1003 — the current Animica L1 signature scheme) committing that name+version+digest+timestamp. Buy it after building, training or repackaging something you may later have to prove you published — an image, a wheel, a model checkpoint — or before installing one, so two attestations claiming one name+version with different digests visibly contradict. That question is not answerable from a bare digest signature, which is why this is a separate product from /x402/pq/sign. The manifest also records the Animica chain head read just before signing — or, if the node could not be reached, records that absence and its reason, inside the signature either way, so a missing pin can never be mistaken for one that was never asked for. That pin is the part nobody can move: a block hash cannot be known before its block exists, so the manifest was signed at or AFTER that height, a bound we cannot inflate and anyone can re-check on any Animica node. Nothing is written to the chain. The artifact bytes never leave your side: you send the digest your pipeline already computed (sha256:… , 0x… or bare hex; sha256/sha512/sha3/blake2b/blake3 — SHA-1 and MD5 are refused with a reason, since a collidable digest identifies no single artifact). Optional anchor: the manifest digest is committed as a record in the node data-availability store (da.put), which returns a commitment plus a Merkle inclusion proof against it. Read that for what it is — a node-local, operator-run store, NOT a block: no blob written there is committed by consensus (the live chain's headers carry an all-zero daRoot), and the store evicts (lru) and can be deleted, so the record buys retrievability and tamper-evidence, never a trustless timestamp. anchor:\"digest\" (default) records only hashes and timestamps, anchor:\"identity\" also records name and version for a public release registry, anchor:false writes nothing — and your metadata is never anchored under any setting. Anchoring is operator-gated and off unless enabled here, so the default response may carry anchored:false for that reason alone; either way you get the real machine reason and never a commitment field that reads like a proof. Set require_anchor:true and an unwritable store becomes a 503 with nothing charged instead. Verification is FREE (POST /x402/pq/artifact/verify — it also re-reads the anchor and confirms it binds the manifest) and the signing public key is FREE (GET /x402/pq/artifact/pubkey), so anyone can check an attestation offline without paying us. No model is involved anywhere: every field is your input returned unchanged, a value the signer returned, or a value our node returned.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-pq_artifact"
      }
    },
    {
      "resource": "https://animica.dev/x402/pq/identity",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/pq/identity",
          "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "agent_name": {
                  "type": "string",
                  "required": true,
                  "description": "your self-declared name, 1-128 printable ASCII characters. SELF-DECLARED and recorded as such: names are not unique, not registered, and never checked."
                },
                "public_key": {
                  "type": "string",
                  "required": false,
                  "description": "your ML-DSA-65 public key as 3904 hex characters (FIPS 204, scheme 4099 — the key type the Animica L1 spends with). Without key_proof the certificate records it as PRESENTED, not proven."
                },
                "key_proof": {
                  "type": "object",
                  "required": false,
                  "description": "proof you hold the secret half: an animica.attest/v1 envelope you self-signed, carrying payload {\"purpose\":\"animica.pq-identity/key-proof\",\"agent_name\":\"<the same name>\"} and signed within the last 3600s. Verified here before the certificate is issued; a proof that does not check out is REFUSED (400, free), never silently downgraded."
                },
                "claims": {
                  "type": "object",
                  "required": false,
                  "description": "up to 32 self-declared key/value claims — a flat map of strings, numbers, booleans, nulls or arrays of those. Signed under the name \"claims_self_asserted\" and endorsed by nobody. Keys using verification vocabulary (kyc, verified, licensed, ...) are flagged inside the signature as self-asserted."
                },
                "ttl_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "how long the certificate declares itself valid, 60-31536000 (default 2592000). Written into the signature as not_before/not_after."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed certificate also carries an observed Animica chain head {height, hash}, a lower bound on issue time that this gateway cannot move backwards. If the node is unreachable the call 503s and you are NOT charged."
                }
              },
              "queryParams": {
                "agent_name": {
                  "type": "string",
                  "description": "same as body.agent_name, for GET callers"
                },
                "public_key": {
                  "type": "string",
                  "description": "same as body.public_key"
                },
                "claims": {
                  "type": "string",
                  "description": "same as body.claims, as JSON object text"
                },
                "ttl_seconds": {
                  "type": "string",
                  "description": "same as body.ttl_seconds"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "certificate {type, subject {agent_name, public_key, public_key_alg, public_key_alg_checked, public_key_fingerprint, public_key_fingerprint_derivation, binding}, subject_id, claims_self_asserted, claims_asserting_assurance_vocabulary, key_possession_proven, key_proof, assurance {level:none, is_kyc:false, statement, does_not_establish}, not_before, not_after, chain_anchor, issued_at} (the exact signed statement), envelope {canonical_form, signature, public_key, key_id, ...} (self-contained, publishable), binding, key_possession_proven, not_kyc:true, assurance_level:none, establishes, does_not_establish, validity, subject_id, verify {endpoint, url, price}, issuer_key_endpoint, verification, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/pq/identity",
          "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "agent_name": {
                  "type": "string",
                  "required": true,
                  "description": "your self-declared name, 1-128 printable ASCII characters. SELF-DECLARED and recorded as such: names are not unique, not registered, and never checked."
                },
                "public_key": {
                  "type": "string",
                  "required": false,
                  "description": "your ML-DSA-65 public key as 3904 hex characters (FIPS 204, scheme 4099 — the key type the Animica L1 spends with). Without key_proof the certificate records it as PRESENTED, not proven."
                },
                "key_proof": {
                  "type": "object",
                  "required": false,
                  "description": "proof you hold the secret half: an animica.attest/v1 envelope you self-signed, carrying payload {\"purpose\":\"animica.pq-identity/key-proof\",\"agent_name\":\"<the same name>\"} and signed within the last 3600s. Verified here before the certificate is issued; a proof that does not check out is REFUSED (400, free), never silently downgraded."
                },
                "claims": {
                  "type": "object",
                  "required": false,
                  "description": "up to 32 self-declared key/value claims — a flat map of strings, numbers, booleans, nulls or arrays of those. Signed under the name \"claims_self_asserted\" and endorsed by nobody. Keys using verification vocabulary (kyc, verified, licensed, ...) are flagged inside the signature as self-asserted."
                },
                "ttl_seconds": {
                  "type": "integer",
                  "required": false,
                  "description": "how long the certificate declares itself valid, 60-31536000 (default 2592000). Written into the signature as not_before/not_after."
                },
                "anchor_chain": {
                  "type": "boolean",
                  "required": false,
                  "description": "default false. When true the signed certificate also carries an observed Animica chain head {height, hash}, a lower bound on issue time that this gateway cannot move backwards. If the node is unreachable the call 503s and you are NOT charged."
                }
              },
              "queryParams": {
                "agent_name": {
                  "type": "string",
                  "description": "same as body.agent_name, for GET callers"
                },
                "public_key": {
                  "type": "string",
                  "description": "same as body.public_key"
                },
                "claims": {
                  "type": "string",
                  "description": "same as body.claims, as JSON object text"
                },
                "ttl_seconds": {
                  "type": "string",
                  "description": "same as body.ttl_seconds"
                },
                "anchor_chain": {
                  "type": "string",
                  "description": "true|1 to anchor to the observed chain head"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "certificate {type, subject {agent_name, public_key, public_key_alg, public_key_alg_checked, public_key_fingerprint, public_key_fingerprint_derivation, binding}, subject_id, claims_self_asserted, claims_asserting_assurance_vocabulary, key_possession_proven, key_proof, assurance {level:none, is_kyc:false, statement, does_not_establish}, not_before, not_after, chain_anchor, issued_at} (the exact signed statement), envelope {canonical_form, signature, public_key, key_id, ...} (self-contained, publishable), binding, key_possession_proven, not_kyc:true, assurance_level:none, establishes, does_not_establish, validity, subject_id, verify {endpoint, url, price}, issuer_key_endpoint, verification, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "pq_identity",
        "name": "Post-quantum agent identity certificate (ML-DSA-65) — NOT KYC",
        "description": "NOT KYC — CRYPTOGRAPHIC IDENTITY ONLY. This gateway verifies NO real-world identity, runs NO KYC/KYB/AML/sanctions/background check, and endorses nothing you claim; anyone can buy a certificate naming anything, and that disclaimer is inside the signature so it cannot be stripped. What it does prove is cryptographic: Animica signed these exact bytes at this time, and (when key_possession_proven is true) the requester held the secret half of the named key. Get a post-quantum ML-DSA-65 certificate (FIPS 204, scheme 4099 — the same scheme the Animica L1 admits transactions with) binding a self-declared agent name, an optional public key and optional self-declared claims to a signed timestamp and validity window. Buy this when two agents that have never met need a durable, publishable handle for each other: a counterparty id for an escrow row, a stable subject for a reputation record, or a signed statement of what an agent claimed about itself at the moment a deal was struck — evidence that still checks out years later, when a bearer token has expired and an ECDSA signature has become retrospectively forgeable. Send a key_proof (an envelope you self-signed with the key you are naming) and the certificate additionally states you PROVED possession of that key; omit it and the certificate says plainly that the key was only presented. Verification is FREE (POST /x402/pq/identity/verify) and the issuer public key is FREE (GET /x402/pq/identity/key), so any third party can check a certificate offline without paying us. If the signer is unreachable you get a 503 with the reason and are NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-pq_identity"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/distribution",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/distribution",
          "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "window size in blocks, 20..500 (default 200). Smaller windows are refused because concentration over a handful of blocks is noise."
                },
                "compare": {
                  "type": "boolean",
                  "required": false,
                  "description": "also sweep the contiguous window of the same size immediately below this one and report the change (default true). false halves the node work and omits every delta."
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many producer rows to return, 1..200 (default 25). Producers beyond it are aggregated, never dropped silently."
                },
                "margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the head to stop, 0..1000 (default: the gateway's reorg margin). Raise it to measure a window that is already settled."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the response with this gateway's ML-DSA-65 (FIPS 204, scheme 4099) key so a third party can verify the measurement offline (default false). Refuses and charges nothing if the signer is unavailable."
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "compare": {
                  "type": "boolean",
                  "description": "same as body.compare"
                },
                "top": {
                  "type": "integer",
                  "description": "same as body.top"
                },
                "margin": {
                  "type": "integer",
                  "description": "same as body.margin"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "window {blocks_requested, blocks_in_range, blocks_attempted, blocks_not_attempted, from_height, to_height, attempted_through_height, head_margin}, concentration {at_height, attributed_blocks, unattributed_blocks, distinct_producers, top_producer, top_producer_share, hhi, effective_producers, gini, nakamoto_coefficient[{threshold, producers, combined_share}], window_truncated, truncation_reason}, producers[{rank, account_digest, blocks, share, prior_blocks, prior_share, share_delta, status}] (the last four only when a comparison was made), producers_listed, producers_omitted {count, blocks, share, note}, comparison {available, reason, prior_window, prior, delta, churn{entered[], exited[], entered_count, exited_count}, alignment{contiguous, realigned_by_blocks, measured_ranges_abut}, denominators}, reference_thresholds[], method, caveats, not_measured, attestation (signed:false unless attest:true, else an ML-DSA-65 envelope with subject_keys naming exactly which body keys the digest covers), as_of {head_height, head_hash, observed_at}, provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/distribution",
          "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "window size in blocks, 20..500 (default 200). Smaller windows are refused because concentration over a handful of blocks is noise."
                },
                "compare": {
                  "type": "boolean",
                  "required": false,
                  "description": "also sweep the contiguous window of the same size immediately below this one and report the change (default true). false halves the node work and omits every delta."
                },
                "top": {
                  "type": "integer",
                  "required": false,
                  "description": "how many producer rows to return, 1..200 (default 25). Producers beyond it are aggregated, never dropped silently."
                },
                "margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the head to stop, 0..1000 (default: the gateway's reorg margin). Raise it to measure a window that is already settled."
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "sign the response with this gateway's ML-DSA-65 (FIPS 204, scheme 4099) key so a third party can verify the measurement offline (default false). Refuses and charges nothing if the signer is unavailable."
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "compare": {
                  "type": "boolean",
                  "description": "same as body.compare"
                },
                "top": {
                  "type": "integer",
                  "description": "same as body.top"
                },
                "margin": {
                  "type": "integer",
                  "description": "same as body.margin"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "window {blocks_requested, blocks_in_range, blocks_attempted, blocks_not_attempted, from_height, to_height, attempted_through_height, head_margin}, concentration {at_height, attributed_blocks, unattributed_blocks, distinct_producers, top_producer, top_producer_share, hhi, effective_producers, gini, nakamoto_coefficient[{threshold, producers, combined_share}], window_truncated, truncation_reason}, producers[{rank, account_digest, blocks, share, prior_blocks, prior_share, share_delta, status}] (the last four only when a comparison was made), producers_listed, producers_omitted {count, blocks, share, note}, comparison {available, reason, prior_window, prior, delta, churn{entered[], exited[], entered_count, exited_count}, alignment{contiguous, realigned_by_blocks, measured_ranges_abut}, denominators}, reference_thresholds[], method, caveats, not_measured, attestation (signed:false unless attest:true, else an ML-DSA-65 envelope with subject_keys naming exactly which body keys the digest covers), as_of {head_height, head_hash, observed_at}, provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_distribution",
        "name": "Animica miner distribution",
        "description": "Block-production concentration on the Animica L1 over the last N blocks: every producer with its block count and share, HHI, Gini, effective producers, top-producer share and Nakamoto coefficient at 33/50/66%, plus the same over the contiguous prior window and the delta. Deterministic, no model; every figure pinned to the block range and head it was computed at. Buy before trusting this chain's finality, or to watch concentration move. Charges nothing when producer data cannot be read.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_distribution"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/anomalies",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/anomalies",
          "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many recent blocks to analyse, 12..240 (default 120). Every block is really read. Budget about 200ms of node time per block with producer analysis on and about 100ms with it off — those are PADDED planning figures (the 2026-08-22 walk measured ~160ms and ~80ms, and node load has moved the real cost by ~1.5x), so a 240-block window takes tens of seconds. window.node_read_ms reports what this call actually cost."
                },
                "producers": {
                  "type": "boolean",
                  "required": false,
                  "description": "analyse block-production concentration and its shift across the window (default true). Set false to roughly halve the node work and the latency when you only care about intervals, empty blocks and the mempool."
                },
                "head_margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the tip the window stops, 0..100. Defaults to the gateway setting; the tip is excluded because a shallow reorg can still replace it."
                },
                "long_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or above this multiple of the window median, > 1 (default 6)"
                },
                "short_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or below the window median divided by this, > 1 (default 8)"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "flag a run of this many consecutive transaction-free blocks, >= 2 (default 20)"
                },
                "theta_jump_ratio": {
                  "type": "number",
                  "required": false,
                  "description": "flag a difficulty (thetaMicro) step of this factor or more between consecutive blocks, > 1 (default 1.5)"
                },
                "concentration_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag when one payout address produced at least this share of the recent half, 0..1 (default 0.5)"
                },
                "hhi_shift": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the Herfindahl index moves by at least this much between the two halves, 0..1 (default 0.15)"
                },
                "share_shift": {
                  "type": "number",
                  "required": false,
                  "description": "treat an address as a mover when its share changes by at least this much between halves, 0..1 (default 0.25)"
                },
                "producer_exit_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag an address that held at least this share in one half and produced nothing in the other, 0..1 (default 0.2)"
                },
                "mempool_age_intervals": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the oldest pending transaction has waited this many median block intervals, > 0 (default 3)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this report to the chain height (default false)"
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "producers": {
                  "type": "boolean",
                  "description": "same as body.producers"
                },
                "long_median_factor": {
                  "type": "number",
                  "description": "same as body.long_median_factor"
                },
                "short_median_factor": {
                  "type": "number",
                  "description": "same as body.short_median_factor"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "description": "same as body.empty_run_blocks"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "analysed {blocks_examined, intervals_examined, coverage, findings, empty_findings_meaning, detectors_not_run[] (which detector groups could not look, and why — an empty findings list plus a non-empty detectors_not_run is NOT a clean bill of health)}, window {blocks_requested, blocks_in_range, blocks_examined, from_height, to_height, head_margin, coverage, minimum_coverage_required, missing_blocks, missing_sample, node_read_ms (measured to the last node read), node_read_ms_estimate + node_read_ms_estimate_basis (a planning constant, NOT a measurement of this call), max_blocks}, findings[] {kind, height|from_height/to_height, observed, rule, threshold {name, value, unit}, basis, source} across kinds long_block_interval, short_block_interval, non_monotonic_timestamp, difficulty_step, empty_block_run, production_concentration, production_concentration_shift, producer_disappeared, producer_appeared, mempool_backlog_age, mempool_not_draining, mempool_feed_disagreement; finding_counts{}, findings_truncated, intervals {samples, min_seconds, p10_seconds, median_seconds, p90_seconds, max_seconds, mean_seconds, mad_seconds, robust_sigma_seconds, long_cut_seconds, short_cut_seconds, calibration {long_observed, long_expected_memoryless, long_observed_over_expected, short_observed, short_expected_memoryless, short_observed_over_expected, reading}}, producers {available, half_that_failed?, windows {earlier, recent (each with blocks_requested/blocks_attempted/blocks_not_attempted/attributed_blocks/window_truncated), equal_length, unequal_length_reason, gap_blocks, overlap_blocks, disjoint}, earlier, recent, combined, shift} — combined and shift each carry their own {available} and are withheld with a reason when the two halves overlap (a head that moved backward between sweeps, or both windows clamping at genesis), because summing overlapping halves would double-count the shared blocks; mempool {available, count, total_bytes, oldest_age_seconds, oldest_age_is_stale, backlog_median_intervals, backlog_finding_suppressed_reason, feeds {getstats_count, getpending_listed, getmininginfo_pooledtx, disagreement, compared, not_read[], *_read_error}, limits} — a feed the node did not answer is null and listed in feeds.not_read, never 0; chain {height, hash, theta_micro + theta_micro_source, difficulty + difficulty_unknown_reason, consensus, peers + peers_unavailable_reason, node_warnings[] (NULL, never [], when the telemetry read failed) + node_warnings_unavailable_reason, telemetry_error}, thresholds{}, method{}, limits{}, inference {used:false, role:\"none\", upstream:null, animica_compute:false}, attestation — always present: an ML-DSA-65 envelope with subject_keys + a verbatim offline verification recipe in `covers` when attest:true, otherwise {signed:false, reason:\"not_requested\"}; as_of {head_height, head_hash, observed_at}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/anomalies",
          "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many recent blocks to analyse, 12..240 (default 120). Every block is really read. Budget about 200ms of node time per block with producer analysis on and about 100ms with it off — those are PADDED planning figures (the 2026-08-22 walk measured ~160ms and ~80ms, and node load has moved the real cost by ~1.5x), so a 240-block window takes tens of seconds. window.node_read_ms reports what this call actually cost."
                },
                "producers": {
                  "type": "boolean",
                  "required": false,
                  "description": "analyse block-production concentration and its shift across the window (default true). Set false to roughly halve the node work and the latency when you only care about intervals, empty blocks and the mempool."
                },
                "head_margin": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks below the tip the window stops, 0..100. Defaults to the gateway setting; the tip is excluded because a shallow reorg can still replace it."
                },
                "long_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or above this multiple of the window median, > 1 (default 6)"
                },
                "short_median_factor": {
                  "type": "number",
                  "required": false,
                  "description": "flag an interval at or below the window median divided by this, > 1 (default 8)"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "flag a run of this many consecutive transaction-free blocks, >= 2 (default 20)"
                },
                "theta_jump_ratio": {
                  "type": "number",
                  "required": false,
                  "description": "flag a difficulty (thetaMicro) step of this factor or more between consecutive blocks, > 1 (default 1.5)"
                },
                "concentration_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag when one payout address produced at least this share of the recent half, 0..1 (default 0.5)"
                },
                "hhi_shift": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the Herfindahl index moves by at least this much between the two halves, 0..1 (default 0.15)"
                },
                "share_shift": {
                  "type": "number",
                  "required": false,
                  "description": "treat an address as a mover when its share changes by at least this much between halves, 0..1 (default 0.25)"
                },
                "producer_exit_share": {
                  "type": "number",
                  "required": false,
                  "description": "flag an address that held at least this share in one half and produced nothing in the other, 0..1 (default 0.2)"
                },
                "mempool_age_intervals": {
                  "type": "number",
                  "required": false,
                  "description": "flag when the oldest pending transaction has waited this many median block intervals, > 0 (default 3)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding this report to the chain height (default false)"
                }
              },
              "queryParams": {
                "blocks": {
                  "type": "integer",
                  "description": "same as body.blocks, for GET callers"
                },
                "producers": {
                  "type": "boolean",
                  "description": "same as body.producers"
                },
                "long_median_factor": {
                  "type": "number",
                  "description": "same as body.long_median_factor"
                },
                "short_median_factor": {
                  "type": "number",
                  "description": "same as body.short_median_factor"
                },
                "empty_run_blocks": {
                  "type": "integer",
                  "description": "same as body.empty_run_blocks"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "analysed {blocks_examined, intervals_examined, coverage, findings, empty_findings_meaning, detectors_not_run[] (which detector groups could not look, and why — an empty findings list plus a non-empty detectors_not_run is NOT a clean bill of health)}, window {blocks_requested, blocks_in_range, blocks_examined, from_height, to_height, head_margin, coverage, minimum_coverage_required, missing_blocks, missing_sample, node_read_ms (measured to the last node read), node_read_ms_estimate + node_read_ms_estimate_basis (a planning constant, NOT a measurement of this call), max_blocks}, findings[] {kind, height|from_height/to_height, observed, rule, threshold {name, value, unit}, basis, source} across kinds long_block_interval, short_block_interval, non_monotonic_timestamp, difficulty_step, empty_block_run, production_concentration, production_concentration_shift, producer_disappeared, producer_appeared, mempool_backlog_age, mempool_not_draining, mempool_feed_disagreement; finding_counts{}, findings_truncated, intervals {samples, min_seconds, p10_seconds, median_seconds, p90_seconds, max_seconds, mean_seconds, mad_seconds, robust_sigma_seconds, long_cut_seconds, short_cut_seconds, calibration {long_observed, long_expected_memoryless, long_observed_over_expected, short_observed, short_expected_memoryless, short_observed_over_expected, reading}}, producers {available, half_that_failed?, windows {earlier, recent (each with blocks_requested/blocks_attempted/blocks_not_attempted/attributed_blocks/window_truncated), equal_length, unequal_length_reason, gap_blocks, overlap_blocks, disjoint}, earlier, recent, combined, shift} — combined and shift each carry their own {available} and are withheld with a reason when the two halves overlap (a head that moved backward between sweeps, or both windows clamping at genesis), because summing overlapping halves would double-count the shared blocks; mempool {available, count, total_bytes, oldest_age_seconds, oldest_age_is_stale, backlog_median_intervals, backlog_finding_suppressed_reason, feeds {getstats_count, getpending_listed, getmininginfo_pooledtx, disagreement, compared, not_read[], *_read_error}, limits} — a feed the node did not answer is null and listed in feeds.not_read, never 0; chain {height, hash, theta_micro + theta_micro_source, difficulty + difficulty_unknown_reason, consensus, peers + peers_unavailable_reason, node_warnings[] (NULL, never [], when the telemetry read failed) + node_warnings_unavailable_reason, telemetry_error}, thresholds{}, method{}, limits{}, inference {used:false, role:\"none\", upstream:null, animica_compute:false}, attestation — always present: an ML-DSA-65 envelope with subject_keys + a verbatim offline verification recipe in `covers` when attest:true, otherwise {signed:false, reason:\"not_requested\"}; as_of {head_height, head_hash, observed_at}, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_anomalies",
        "name": "Animica chain anomaly detector",
        "description": "Buy when something on Animica looks wrong and you need to know if it really is: an unconfirmed payment, a pool that stopped finding blocks, a bridge deciding to pause. Over recent blocks: interval outliers against the window MEDIAN, each with the count a memoryless chain produces anyway so you can tell noise from signal; producer-concentration SHIFT between halves; mempool backlog vs the chain's own cadence; empty-block runs. No model. Optional ML-DSA-65 attestation. Unreadable node: no charge.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_anomalies"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/economy",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "8000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/economy",
          "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "exclude_addresses": {
                  "type": "array",
                  "required": false,
                  "description": "up to 10 anim1… addresses (or 32-byte hex digests) whose balances are read from state and SUBTRACTED from the state total to give a circulating figure. Each deduction is itemised with the balance that was read. Omit it and circulating equals the state total, with basis:\"state_total\" and nothing deducted — this product will not guess which accounts are treasury or locked."
                }
              },
              "queryParams": {
                "exclude_addresses": {
                  "type": "string",
                  "description": "same as body.exclude_addresses for GET callers, comma-separated, up to 10 entries"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; supply {state_total_nanm, state_total_anm, accounts_with_balance, excluded[], circulating_nanm, circulating_anm, circulating_basis}; emission {miner_reward_per_block_anm, published_subsidy_per_block_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, miner_emission_anm_day, total_emission_anm_day, as_pct_of_circulating_supply {miner_per_day_pct, total_per_day_pct, total_annualised_simple_pct}}; block_production {mean_block_interval_seconds, blocks_per_day_observed, target_block_interval_seconds, blocks_per_day_at_target, interval_window}; hashrate {node_estimate, theta_micro, expected_trials_per_block, network_trials_per_second}; price {available, usd_per_anm, side, source, observed_at, age_seconds}; mining_revenue {available, network_miner_revenue_usd_day, network_total_emission_usd_day, circulating_supply_usd_at_bid}; fixed_pot {usd_per_trial_per_second_day, if_network_hashrate_doubles, statement}; halving {next_halving_height, blocks_to_next_halving, days_to_next_halving_at_observed_rate, published_subsidy_after_next_halving_anm}; issuance_reconciliation; method; caveats; inference {used:false}; provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "95693779904",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/economy",
          "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "exclude_addresses": {
                  "type": "array",
                  "required": false,
                  "description": "up to 10 anim1… addresses (or 32-byte hex digests) whose balances are read from state and SUBTRACTED from the state total to give a circulating figure. Each deduction is itemised with the balance that was read. Omit it and circulating equals the state total, with basis:\"state_total\" and nothing deducted — this product will not guess which accounts are treasury or locked."
                }
              },
              "queryParams": {
                "exclude_addresses": {
                  "type": "string",
                  "description": "same as body.exclude_addresses for GET callers, comma-separated, up to 10 entries"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_height, chain_head_hash, chain_id, template_height, computed_at}; supply {state_total_nanm, state_total_anm, accounts_with_balance, excluded[], circulating_nanm, circulating_anm, circulating_basis}; emission {miner_reward_per_block_anm, published_subsidy_per_block_anm, miner_share_of_subsidy_pct, published_subsidy_split_pct, miner_emission_anm_day, total_emission_anm_day, as_pct_of_circulating_supply {miner_per_day_pct, total_per_day_pct, total_annualised_simple_pct}}; block_production {mean_block_interval_seconds, blocks_per_day_observed, target_block_interval_seconds, blocks_per_day_at_target, interval_window}; hashrate {node_estimate, theta_micro, expected_trials_per_block, network_trials_per_second}; price {available, usd_per_anm, side, source, observed_at, age_seconds}; mining_revenue {available, network_miner_revenue_usd_day, network_total_emission_usd_day, circulating_supply_usd_at_bid}; fixed_pot {usd_per_trial_per_second_day, if_network_hashrate_doubles, statement}; halving {next_halving_height, blocks_to_next_halving, days_to_next_halving_at_observed_rate, published_subsidy_after_next_halving_anm}; issuance_reconciliation; method; caveats; inference {used:false}; provenance."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "95.693779904 ANM",
            "usd_equivalent": "0.006000",
            "usd_list_price": "0.008000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_economy",
        "name": "Animica ANM economy analyzer",
        "description": "Live ANM monetary state from the Animica L1 itself: supply and account count, the block reward the node will actually credit (not the published split, which is wrong by 2x), measured blocks per day, daily emission in ANM and as a percent of supply, network hashrate, and — when the ANM book is fresh — total network-wide mining revenue in USD per day. Buy before holding, quoting or mining ANM. Deterministic, no model. Charges nothing when the chain cannot be read.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_economy"
      }
    },
    {
      "resource": "https://animica.dev/x402/market/gaps",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/gaps",
          "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "area": {
                  "type": "string",
                  "required": true,
                  "description": "the subject area to map, as free text — \"geocoding\", \"options market data\", \"pdf extraction\". A SUBJECT domain, not a hostname. Matching is lexical over merchant prose, so use the words a merchant would use."
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "capability rows to return, 1..12 (default 6)"
                },
                "min_services": {
                  "type": "integer",
                  "required": false,
                  "description": "how many services in the area sample must use a term before it counts as a capability, 1..10 (default 2). At 1 you will get one merchant's private vocabulary and its brand names."
                },
                "max_operators": {
                  "type": "integer",
                  "required": false,
                  "description": "a capability served by more than this many distinct operators IN THE AREA SAMPLE is not thin — excluded and counted, 1..25 (default 3)"
                },
                "max_suppliers": {
                  "type": "integer",
                  "required": false,
                  "description": "the real thinness test: a capability matched by more than this many services ACROSS THE WHOLE INDEX is well supplied and is excluded, 1..1000 (default 40). Raise it to see near-misses."
                }
              },
              "queryParams": {
                "area": {
                  "type": "string",
                  "description": "same as body.area, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for area"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "min_services": {
                  "type": "integer",
                  "description": "same as body.min_services"
                },
                "max_operators": {
                  "type": "integer",
                  "description": "same as body.max_operators"
                },
                "max_suppliers": {
                  "type": "integer",
                  "description": "same as body.max_suppliers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "area; gaps[] {rank, capability, gap_type (\"demand_observed\"|\"supply_side_only\"), demand_observed, why_this_is_a_gap, supply {services_across_index (a full match count over the PRICED DIRECTORY HALF only, never an all-index total), services_across_index_population, services_in_area_sample_carrying_term, undercount_warning, operators_observed, operators_inspected, operators_is_lower_bound, threshold_max_suppliers, verdict}, in_area {services, distinct_operators, callable_services, services_with_a_usable_price, prices_usd[], example_services[] {resource, host, price_usd, price_source, callable, demand_observed}, counts_are_lower_bounds}, demand {observed, calls_30d, unique_payers_30d_summed (summed per-service counts, NOT de-duplicated between them), payer_diversity, operators_with_demand_data, demand_per_operator, score, score_note, concentration_warning, attribution, source} or {observed:false, reason, means}, network_demand {same shape, over the whole index}, price_band {available, n, min, median, p90, enough_comparables, minimum_required, excluded{}, reason, matched_services, spread, basis, listings[] {resource, price_usd, price_source, demand_observed}}}; count; candidates_considered; network_probe_budget {examined, budget, exhausted, note}; excluded {area_query_terms[], below_min_services, above_max_operators, above_max_suppliers[], not_in_directory_half[] {capability, services_in_area_sample}, stop_or_numeric}; supply_sample {services_inspected, services_matched_in_area, is_sample, cap, counts_are_lower_bounds}; demand_coverage; thresholds; ranking[]; derivation {source_field, source_field_match_basis, lexical, stop_terms[]}; what_this_cannot_see; prices_are_asks; matching; sources {directory, fts}; inference {used:false, role:\"none\", upstream:null, animica_compute:false}; took_ms; generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/gaps",
          "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "area": {
                  "type": "string",
                  "required": true,
                  "description": "the subject area to map, as free text — \"geocoding\", \"options market data\", \"pdf extraction\". A SUBJECT domain, not a hostname. Matching is lexical over merchant prose, so use the words a merchant would use."
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "capability rows to return, 1..12 (default 6)"
                },
                "min_services": {
                  "type": "integer",
                  "required": false,
                  "description": "how many services in the area sample must use a term before it counts as a capability, 1..10 (default 2). At 1 you will get one merchant's private vocabulary and its brand names."
                },
                "max_operators": {
                  "type": "integer",
                  "required": false,
                  "description": "a capability served by more than this many distinct operators IN THE AREA SAMPLE is not thin — excluded and counted, 1..25 (default 3)"
                },
                "max_suppliers": {
                  "type": "integer",
                  "required": false,
                  "description": "the real thinness test: a capability matched by more than this many services ACROSS THE WHOLE INDEX is well supplied and is excluded, 1..1000 (default 40). Raise it to see near-misses."
                }
              },
              "queryParams": {
                "area": {
                  "type": "string",
                  "description": "same as body.area, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for area"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "min_services": {
                  "type": "integer",
                  "description": "same as body.min_services"
                },
                "max_operators": {
                  "type": "integer",
                  "description": "same as body.max_operators"
                },
                "max_suppliers": {
                  "type": "integer",
                  "description": "same as body.max_suppliers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "area; gaps[] {rank, capability, gap_type (\"demand_observed\"|\"supply_side_only\"), demand_observed, why_this_is_a_gap, supply {services_across_index (a full match count over the PRICED DIRECTORY HALF only, never an all-index total), services_across_index_population, services_in_area_sample_carrying_term, undercount_warning, operators_observed, operators_inspected, operators_is_lower_bound, threshold_max_suppliers, verdict}, in_area {services, distinct_operators, callable_services, services_with_a_usable_price, prices_usd[], example_services[] {resource, host, price_usd, price_source, callable, demand_observed}, counts_are_lower_bounds}, demand {observed, calls_30d, unique_payers_30d_summed (summed per-service counts, NOT de-duplicated between them), payer_diversity, operators_with_demand_data, demand_per_operator, score, score_note, concentration_warning, attribution, source} or {observed:false, reason, means}, network_demand {same shape, over the whole index}, price_band {available, n, min, median, p90, enough_comparables, minimum_required, excluded{}, reason, matched_services, spread, basis, listings[] {resource, price_usd, price_source, demand_observed}}}; count; candidates_considered; network_probe_budget {examined, budget, exhausted, note}; excluded {area_query_terms[], below_min_services, above_max_operators, above_max_suppliers[], not_in_directory_half[] {capability, services_in_area_sample}, stop_or_numeric}; supply_sample {services_inspected, services_matched_in_area, is_sample, cap, counts_are_lower_bounds}; demand_coverage; thresholds; ranking[]; derivation {source_field, source_field_match_basis, lexical, stop_terms[]}; what_this_cannot_see; prices_are_asks; matching; sources {directory, fts}; inference {used:false, role:\"none\", upstream:null, animica_compute:false}; took_ms; generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "market_gaps",
        "name": "x402 opportunity finder (thin supply, with real demand evidence)",
        "description": "Buy before building or pricing an x402 service. Send an area (\"geocoding\", \"options data\"); get the capabilities inside it that few operators serve anywhere in our 18k-service index, each with its listings and, where at least 8 of them publish a usable price, a min/median/p90 band over those advertised prices. Demand appears ONLY where 30-day call and payer counts were observed; every other row is labelled supply-side only, because thin supply is not evidence of demand. Nothing matched: NOT charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-market_gaps"
      }
    },
    {
      "resource": "https://animica.dev/x402/market/competitors",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/competitors",
          "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": false,
                  "description": "the http(s) URL of the x402 resource to find competitors for; its own published description supplies the query, so no capability is guessed from the path. Supply this OR capability, not both"
                },
                "capability": {
                  "type": "string",
                  "required": false,
                  "description": "free-text capability to compare the market for, e.g. \"web search\" or \"ethereum block by number\". Supply this OR resource, not both"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "competitors to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only compare services at or under this price in USD; unpriced listings are kept and counted, because we do not know that they breach it"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only compare services that publish a call spec an agent could use unattended"
                },
                "include_mirrors": {
                  "type": "boolean",
                  "required": false,
                  "description": "resource mode only: also list same-description same-price duplicates, which are one operator listed twice (default true)"
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for capability"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "max_price": {
                  "type": "number",
                  "description": "same as body.max_price"
                },
                "callable_only": {
                  "type": "boolean",
                  "description": "same as body.callable_only"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "mode (resource|capability), subject {resource, host, description, price, call_spec, demand, payment, observation} in resource mode, competitors[] {rank, resource, host, description, price {usd, source, note}, call_spec {published, method, fields[], source}, demand {observed, calls_30d, unique_payers_30d, concentration}, payment {network, asset, pay_to}, observation {observed, checkable, outcome, http_status, latency_ms, probed_at, price_observed_usd}}, count, total_competitors, distinct_operators with distinct_operators_scope (the whole peer set in resource mode, the returned page in capability mode — read the scope before dividing one by the other), price_band {n, min, median, p90, spread, enough_comparables, minimum_required, excluded, reason, matched_services, computed_over, listings[] when below the comparables floor}, subject_position {percentile, cheaper_than_n_competitors, vs_median_usd} in resource mode, mirrors[], comparison {services_compared, publish_a_call_spec, demand_observed, probed_by_us, never_probed, networks[]}, filters, matching {query_terms[], coverage_floor_used, widened}, corpus {directory, full_text}, how_to_read, provenance, generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/competitors",
          "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": false,
                  "description": "the http(s) URL of the x402 resource to find competitors for; its own published description supplies the query, so no capability is guessed from the path. Supply this OR capability, not both"
                },
                "capability": {
                  "type": "string",
                  "required": false,
                  "description": "free-text capability to compare the market for, e.g. \"web search\" or \"ethereum block by number\". Supply this OR resource, not both"
                },
                "limit": {
                  "type": "integer",
                  "required": false,
                  "description": "competitors to return, 1..25 (default 10)"
                },
                "max_price": {
                  "type": "number",
                  "required": false,
                  "description": "only compare services at or under this price in USD; unpriced listings are kept and counted, because we do not know that they breach it"
                },
                "callable_only": {
                  "type": "boolean",
                  "required": false,
                  "description": "only compare services that publish a call spec an agent could use unattended"
                },
                "include_mirrors": {
                  "type": "boolean",
                  "required": false,
                  "description": "resource mode only: also list same-description same-price duplicates, which are one operator listed twice (default true)"
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias for capability"
                },
                "limit": {
                  "type": "integer",
                  "description": "same as body.limit"
                },
                "max_price": {
                  "type": "number",
                  "description": "same as body.max_price"
                },
                "callable_only": {
                  "type": "boolean",
                  "description": "same as body.callable_only"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "mode (resource|capability), subject {resource, host, description, price, call_spec, demand, payment, observation} in resource mode, competitors[] {rank, resource, host, description, price {usd, source, note}, call_spec {published, method, fields[], source}, demand {observed, calls_30d, unique_payers_30d, concentration}, payment {network, asset, pay_to}, observation {observed, checkable, outcome, http_status, latency_ms, probed_at, price_observed_usd}}, count, total_competitors, distinct_operators with distinct_operators_scope (the whole peer set in resource mode, the returned page in capability mode — read the scope before dividing one by the other), price_band {n, min, median, p90, spread, enough_comparables, minimum_required, excluded, reason, matched_services, computed_over, listings[] when below the comparables floor}, subject_position {percentile, cheaper_than_n_competitors, vs_median_usd} in resource mode, mirrors[], comparison {services_compared, publish_a_call_spec, demand_observed, probed_by_us, never_probed, networks[]}, filters, matching {query_terms[], coverage_floor_used, widened}, corpus {directory, full_text}, how_to_read, provenance, generated_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "market_competitors",
        "name": "x402 competitor set and price band",
        "description": "Competitors for one x402 resource or capability, over our ~18,000-service harvest of the x402 directories plus our own unpaid 402 probes. Returns the price band (min/median/p90/n) over real listings only, price provenance per rival, whether it publishes a spec an agent can call unattended, observed 30-day demand and settlement network. Never probed reads observed:false, never a guess. Buy before pricing or listing a service, or choosing an endpoint. Charges nothing when nothing matches.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-market_competitors"
      }
    },
    {
      "resource": "https://animica.dev/x402/market/pricing",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/pricing",
          "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "capability": {
                  "type": "string",
                  "required": true,
                  "description": "what the endpoint does, in the words a merchant would use — the comparable set is matched from this text. 1..600 chars."
                },
                "strategy": {
                  "type": "string",
                  "required": false,
                  "description": "where to sit in the observed distribution: undercut | match | premium (default match = the median ask)"
                },
                "target_percentile": {
                  "type": "integer",
                  "required": false,
                  "description": "exact percentile of the ask distribution to target, 1..99. Overrides strategy."
                },
                "current_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "what you charge today, if anything. Returns your exact rank in the comparable set and the delta to the recommendation. Max 100."
                },
                "cost_usd": {
                  "type": "number",
                  "required": false,
                  "description": "your marginal cost per call. Acts as a hard floor on the recommendation and reports the margin at the recommended price; a market that prices below your cost is itself the finding."
                },
                "comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparable listings to return, 1..25 (default 10)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding the recommendation to the index snapshot it was computed from (default false)"
                }
              },
              "queryParams": {
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias of capability"
                },
                "strategy": {
                  "type": "string",
                  "description": "same as body.strategy"
                },
                "target_percentile": {
                  "type": "integer",
                  "description": "same as body.target_percentile"
                },
                "current_price_usd": {
                  "type": "number",
                  "description": "same as body.current_price_usd"
                },
                "cost_usd": {
                  "type": "number",
                  "description": "same as body.cost_usd"
                },
                "comparables": {
                  "type": "integer",
                  "description": "same as body.comparables"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {price_usd, price_nanousd, strategy, target_percentile, anchor, anchor_is_exact, is_an_observed_ask, price_rounded_to_usd, floor_applied, confidence_interval_95 {low_usd, high_usd, low_rank, high_rank, width_ratio, method, caveat}, confidence_interval_is_for, derivation[]}; sample {priced_comparables, matched_services, sufficient, minimum_required, grade, grade_bands[], excluded{}}; distribution {min_usd, median_usd, p90_usd, spread_p90_over_min, rounding}; position {percentile_target, percentile_rank_of_recommendation, listings_cheaper, listings_at_this_price, listings_dearer, ties_note}; your_price {price_usd, percentile_rank, listings_cheaper, listings_dearer, delta_to_recommendation_usd, change_bps, verdict} | null; cost_floor {cost_usd, clears_recommendation, margin_usd, margin_bps_of_price, percentile_rank_of_cost, verdict} | null; comparables[] {rank, resource, host, price_usd, price_source, word_coverage, demand{}}; matching {query_terms, terms_used, coverage_floor_used, widened}; index {directory, full_text}; price_values_sorted (audit vector, or null above the cap); limits[]; prices_are_asks; inference {used:false}; attestation? (ML-DSA-65 envelope); took_ms; computed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/pricing",
          "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "capability": {
                  "type": "string",
                  "required": true,
                  "description": "what the endpoint does, in the words a merchant would use — the comparable set is matched from this text. 1..600 chars."
                },
                "strategy": {
                  "type": "string",
                  "required": false,
                  "description": "where to sit in the observed distribution: undercut | match | premium (default match = the median ask)"
                },
                "target_percentile": {
                  "type": "integer",
                  "required": false,
                  "description": "exact percentile of the ask distribution to target, 1..99. Overrides strategy."
                },
                "current_price_usd": {
                  "type": "number",
                  "required": false,
                  "description": "what you charge today, if anything. Returns your exact rank in the comparable set and the delta to the recommendation. Max 100."
                },
                "cost_usd": {
                  "type": "number",
                  "required": false,
                  "description": "your marginal cost per call. Acts as a hard floor on the recommendation and reports the margin at the recommended price; a market that prices below your cost is itself the finding."
                },
                "comparables": {
                  "type": "integer",
                  "required": false,
                  "description": "how many comparable listings to return, 1..25 (default 10)"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return an ML-DSA-65 attestation binding the recommendation to the index snapshot it was computed from (default false)"
                }
              },
              "queryParams": {
                "capability": {
                  "type": "string",
                  "description": "same as body.capability, for GET callers"
                },
                "q": {
                  "type": "string",
                  "description": "alias of capability"
                },
                "strategy": {
                  "type": "string",
                  "description": "same as body.strategy"
                },
                "target_percentile": {
                  "type": "integer",
                  "description": "same as body.target_percentile"
                },
                "current_price_usd": {
                  "type": "number",
                  "description": "same as body.current_price_usd"
                },
                "cost_usd": {
                  "type": "number",
                  "description": "same as body.cost_usd"
                },
                "comparables": {
                  "type": "integer",
                  "description": "same as body.comparables"
                },
                "attest": {
                  "type": "boolean",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "recommendation {price_usd, price_nanousd, strategy, target_percentile, anchor, anchor_is_exact, is_an_observed_ask, price_rounded_to_usd, floor_applied, confidence_interval_95 {low_usd, high_usd, low_rank, high_rank, width_ratio, method, caveat}, confidence_interval_is_for, derivation[]}; sample {priced_comparables, matched_services, sufficient, minimum_required, grade, grade_bands[], excluded{}}; distribution {min_usd, median_usd, p90_usd, spread_p90_over_min, rounding}; position {percentile_target, percentile_rank_of_recommendation, listings_cheaper, listings_at_this_price, listings_dearer, ties_note}; your_price {price_usd, percentile_rank, listings_cheaper, listings_dearer, delta_to_recommendation_usd, change_bps, verdict} | null; cost_floor {cost_usd, clears_recommendation, margin_usd, margin_bps_of_price, percentile_rank_of_cost, verdict} | null; comparables[] {rank, resource, host, price_usd, price_source, word_coverage, demand{}}; matching {query_terms, terms_used, coverage_floor_used, widened}; index {directory, full_text}; price_values_sorted (audit vector, or null above the cap); limits[]; prices_are_asks; inference {used:false}; attestation? (ML-DSA-65 envelope); took_ms; computed_at"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "market_pricing",
        "name": "x402 price optimizer (Animica index)",
        "description": "Buy this before you set or change the price of an x402 endpoint. Send a capability description; get min/median/p90 of what comparable listings in our own ~18,000-service index actually charge, a recommended price that is itself an observed ask, an exact 95% confidence interval for it from the order statistics, and the sample size it rests on. Below 8 priced comparables it refuses and charges nothing. Deterministic arithmetic over real listings — no model.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-market_pricing"
      }
    },
    {
      "resource": "https://animica.dev/x402/market/reliability",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/market/reliability",
          "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of the x402 endpoint to report on, e.g. https://api.example.com/x402/thing"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return the observation inside an ML-DSA-65 signed envelope (scheme 4099) bound to an Animica chain height, verifiable offline (default false). If it cannot be produced, the call fails and you are not charged."
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "url": {
                  "type": "string",
                  "description": "alias of resource"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "resource, key (the canonical form we index on), observed, observation {outcome, verdict, serves_x402, means, buyer_action, http_status, method, latency_ms, error, probed_at, age_seconds, fresh, stale_after_seconds, probes_recorded}, payment_terms {price_published_in_challenge, price_observed_usd, note}, uptime {available:false, success_rate:null, why_not_estimated}, call_spec {known, published, source, method, has_input_schema, spec}, directory {listed (null when the harvest was unreadable), listed_unknown_reason, lookup_available, price_usd, price_source, network, asset, pay_to, demand, reported_by_directory}, coverage {directory_services, harvest_age_seconds}, inference {used:false}, chain_anchor? (attest only), attestation? (ML-DSA-65 envelope), generated_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/market/reliability",
          "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "resource": {
                  "type": "string",
                  "required": true,
                  "description": "the absolute http(s) URL of the x402 endpoint to report on, e.g. https://api.example.com/x402/thing"
                },
                "attest": {
                  "type": "boolean",
                  "required": false,
                  "description": "return the observation inside an ML-DSA-65 signed envelope (scheme 4099) bound to an Animica chain height, verifiable offline (default false). If it cannot be produced, the call fails and you are not charged."
                }
              },
              "queryParams": {
                "resource": {
                  "type": "string",
                  "description": "same as body.resource, for GET callers"
                },
                "url": {
                  "type": "string",
                  "description": "alias of resource"
                },
                "attest": {
                  "type": "string",
                  "description": "same as body.attest — pass attest=1"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "resource, key (the canonical form we index on), observed, observation {outcome, verdict, serves_x402, means, buyer_action, http_status, method, latency_ms, error, probed_at, age_seconds, fresh, stale_after_seconds, probes_recorded}, payment_terms {price_published_in_challenge, price_observed_usd, note}, uptime {available:false, success_rate:null, why_not_estimated}, call_spec {known, published, source, method, has_input_schema, spec}, directory {listed (null when the harvest was unreadable), listed_unknown_reason, lookup_available, price_usd, price_source, network, asset, pay_to, demand, reported_by_directory}, coverage {directory_services, harvest_age_seconds}, inference {used:false}, chain_anchor? (attest only), attestation? (ML-DSA-65 envelope), generated_at, took_ms"
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "market_reliability",
        "name": "x402 endpoint reliability — what we observed",
        "description": "Before you pay an x402 endpoint you have never called, buy what we observed when WE called it: the outcome of our own unpaid probe, when we ran it, whether it answered a correct 402 with readable payment terms, and whether it publishes a call spec you can build a request from. Never probed returns observed:false — an honest unknown, never an invented uptime figure. Optional ML-DSA-65 attestation. If we hold no record of the URL at all, you are not charged.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-market_reliability"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/signing-policy",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/signing-policy",
          "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "include_disabled": {
                  "type": "boolean",
                  "required": false,
                  "description": "include schemes the chain reports as disabled (default false). Useful when auditing why a historical transaction verifies but a new one is refused."
                }
              },
              "queryParams": {
                "include_disabled": {
                  "type": "string",
                  "description": "same as body.include_disabled for GET callers (\"1\"/\"true\" to include)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_id, read_at, policy_hash, policy_source}; recommended {name, consensus_scheme_id, pq_algorithm_id, pq_algorithm_id_hex, why}; schemes[] {name, consensus_scheme_id, enabled_on_chain, enabled_by_code, enabled_by_policy, reason_if_disabled, pubkey_lengths_bytes, signature_lengths_bytes, pq_algorithm_id, pq_algorithm_id_hex, usable_for_new_keys, verdict, detail, annotated}; warnings[]; id_spaces; what_is_measured; annotation_source; how_to_verify; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/signing-policy",
          "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "include_disabled": {
                  "type": "boolean",
                  "required": false,
                  "description": "include schemes the chain reports as disabled (default false). Useful when auditing why a historical transaction verifies but a new one is refused."
                }
              },
              "queryParams": {
                "include_disabled": {
                  "type": "string",
                  "description": "same as body.include_disabled for GET callers (\"1\"/\"true\" to include)"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {chain_id, read_at, policy_hash, policy_source}; recommended {name, consensus_scheme_id, pq_algorithm_id, pq_algorithm_id_hex, why}; schemes[] {name, consensus_scheme_id, enabled_on_chain, enabled_by_code, enabled_by_policy, reason_if_disabled, pubkey_lengths_bytes, signature_lengths_bytes, pq_algorithm_id, pq_algorithm_id_hex, usable_for_new_keys, verdict, detail, annotated}; warnings[]; id_spaces; what_is_measured; annotation_source; how_to_verify; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_signing_policy",
        "name": "Animica signature-scheme advisory",
        "description": "Which Animica signature scheme you can actually build on. The chain reports three schemes enabled, but two are deprecated commitment stubs the node refuses to make keys for — and 4098 wallets are already stranded on one. Returns the live scheme list plus both id spaces (consensus schemeId and PQ algorithm id 0x1003), key and signature byte sizes, and a usable/not verdict per scheme with its evidence. Buy before generating a key or writing a signer. No model. Free when the chain cannot be read.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_signing_policy"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/identity",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/identity",
          "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "expect_chain_id": {
                  "type": "integer",
                  "required": false,
                  "description": "the chain id you BELIEVE you are talking to. When given, the response carries an explicit matches_native / matches_evm_facade verdict instead of leaving you to compare two numbers yourself — which is the comparison people get wrong."
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "required": false,
                  "description": "the genesis hash you have pinned (0x… 32 bytes). Compared byte-for-byte; a mismatch is reported as a hard failure, since it means this is not the chain you think it is."
                }
              },
              "queryParams": {
                "expect_chain_id": {
                  "type": "string",
                  "description": "same as body.expect_chain_id for GET callers"
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "description": "same as body.expect_genesis_hash for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at, head_height, head_hash}; native {chain_id, genesis_hash, genesis_header_hash, fork_id, policy_hash}; evm_facade {eth_chain_id, eth_chain_id_decimal, net_version, agrees_with_native, why_it_matters}; checkpoints {source, count, entries[] {height, hash}}; expectation {checked, chain_id {expected, matches_native, matches_evm_facade}, genesis_hash {expected, matches}}; warnings[]; read_errors; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/identity",
          "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "expect_chain_id": {
                  "type": "integer",
                  "required": false,
                  "description": "the chain id you BELIEVE you are talking to. When given, the response carries an explicit matches_native / matches_evm_facade verdict instead of leaving you to compare two numbers yourself — which is the comparison people get wrong."
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "required": false,
                  "description": "the genesis hash you have pinned (0x… 32 bytes). Compared byte-for-byte; a mismatch is reported as a hard failure, since it means this is not the chain you think it is."
                }
              },
              "queryParams": {
                "expect_chain_id": {
                  "type": "string",
                  "description": "same as body.expect_chain_id for GET callers"
                },
                "expect_genesis_hash": {
                  "type": "string",
                  "description": "same as body.expect_genesis_hash for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at, head_height, head_hash}; native {chain_id, genesis_hash, genesis_header_hash, fork_id, policy_hash}; evm_facade {eth_chain_id, eth_chain_id_decimal, net_version, agrees_with_native, why_it_matters}; checkpoints {source, count, entries[] {height, hash}}; expectation {checked, chain_id {expected, matches_native, matches_evm_facade}, genesis_hash {expected, matches}}; warnings[]; read_errors; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_identity",
        "name": "Animica chain identity and replay-protection check",
        "description": "Verify you are on real Animica mainnet, and which chain id to sign with. Animica answers that question with TWO numbers: the native chain is id 1, while the EVM compatibility facade reports 149 (eth_chainId 0x95, net_version \"149\"). A wallet porting Ethereum tooling signs with the wrong one. Returns both, the disagreement named, plus genesis hash, fork id, policy hash and the built-in consensus checkpoints a light client pins against. All read live. No model.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_identity"
      }
    },
    {
      "resource": "https://animica.dev/x402/chain/health",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/chain/health",
          "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "max_sync_lag_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks of headers-ahead-of-blocks you are willing to tolerate (default 3). The response carries an explicit healthy true/false against YOUR threshold rather than leaving you to pick one from raw numbers."
                }
              },
              "queryParams": {
                "max_sync_lag_blocks": {
                  "type": "string",
                  "description": "same as body.max_sync_lag_blocks for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; head {height, hash, canonical_height}; sync {blocks, headers, lag_blocks, syncing, verification_progress, within_threshold, threshold_blocks}; difficulty {difficulty, theta_micro}; hashrate {value, unit, window_blocks, window_seconds, height_start, height_end, estimator, caveat}; mempool {size, bytes, max_bytes}; peers {range {min, max}, agree, observations, note}; verdict {transactable, reasons[]}; warnings[]; read_errors; not_published; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "83732057416",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/chain/health",
          "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "max_sync_lag_blocks": {
                  "type": "integer",
                  "required": false,
                  "description": "how many blocks of headers-ahead-of-blocks you are willing to tolerate (default 3). The response carries an explicit healthy true/false against YOUR threshold rather than leaving you to pick one from raw numbers."
                }
              },
              "queryParams": {
                "max_sync_lag_blocks": {
                  "type": "string",
                  "description": "same as body.max_sync_lag_blocks for GET callers"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; head {height, hash, canonical_height}; sync {blocks, headers, lag_blocks, syncing, verification_progress, within_threshold, threshold_blocks}; difficulty {difficulty, theta_micro}; hashrate {value, unit, window_blocks, window_seconds, height_start, height_end, estimator, caveat}; mempool {size, bytes, max_bytes}; peers {range {min, max}, agree, observations, note}; verdict {transactable, reasons[]}; warnings[]; read_errors; not_published; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "83.732057416 ANM",
            "usd_equivalent": "0.005250",
            "usd_list_price": "0.007000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "chain_health",
        "name": "Animica chain health, without the peer list",
        "description": "Whether the Animica L1 is healthy enough to transact on right now: head height and hash, sync lag (blocks vs headers), difficulty and PoIES theta, measured network hashrate with its window and estimator named, mempool depth, and peer count as a RANGE across every source — because four sources on this node disagree at the same instant. Publishes NO peer IP, peer id or relay attribution. Read live, no model, free when the chain cannot be read.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-chain_health"
      }
    },
    {
      "resource": "https://animica.dev/x402/tx/preflight",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "6000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/tx/preflight",
          "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "raw_tx": {
                  "type": "string",
                  "required": true,
                  "description": "the transaction as hex, 0x-prefixed or not. Animica expects canonical CBOR of {body, sigs} with strictly-increasing map keys — non-canonical key order is the most common first failure and the decoder names it explicitly."
                },
                "skip_admission": {
                  "type": "boolean",
                  "required": false,
                  "description": "decode only, skipping the admission dry-run (default false). Useful when you are iterating on encoding and do not yet have signatures attached."
                }
              },
              "queryParams": {
                "raw_tx": {
                  "type": "string",
                  "description": "same as body.raw_tx for GET callers"
                },
                "skip_admission": {
                  "type": "string",
                  "description": "same as body.skip_admission (\"1\"/\"true\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; input {bytes, hex_chars}; decode {ok, canonical_hash, type, decoded_length, transaction, error {message, code, kind, cause, hint}}; admission {checked, allowed, txid, wtxid, reject_reason, error, note}; next_step; what_we_have_observed; broadcast {performed:false, how_to}; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "71770334928",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/tx/preflight",
          "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "raw_tx": {
                  "type": "string",
                  "required": true,
                  "description": "the transaction as hex, 0x-prefixed or not. Animica expects canonical CBOR of {body, sigs} with strictly-increasing map keys — non-canonical key order is the most common first failure and the decoder names it explicitly."
                },
                "skip_admission": {
                  "type": "boolean",
                  "required": false,
                  "description": "decode only, skipping the admission dry-run (default false). Useful when you are iterating on encoding and do not yet have signatures attached."
                }
              },
              "queryParams": {
                "raw_tx": {
                  "type": "string",
                  "description": "same as body.raw_tx for GET callers"
                },
                "skip_admission": {
                  "type": "string",
                  "description": "same as body.skip_admission (\"1\"/\"true\")"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "as_of {read_at}; input {bytes, hex_chars}; decode {ok, canonical_hash, type, decoded_length, transaction, error {message, code, kind, cause, hint}}; admission {checked, allowed, txid, wtxid, reject_reason, error, note}; next_step; what_we_have_observed; broadcast {performed:false, how_to}; inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "71.770334928 ANM",
            "usd_equivalent": "0.004500",
            "usd_list_price": "0.006000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "tx_preflight",
        "name": "Animica transaction preflight — decode and admission dry-run",
        "description": "Find out why an Animica transaction would be rejected BEFORE you broadcast it. Decodes your canonical CBOR {body, sigs} envelope, returns the normalised fields and the CANONICAL HASH you are about to sign, then asks the node whether it would admit the transaction and why not. Both calls are read-only: nothing is inserted into the mempool and nothing is broadcast. Built for people writing Animica signers, where the alternative feedback loop is broadcast-and-see. No model.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-tx_preflight"
      }
    },
    {
      "resource": "https://animica.dev/x402/alpha/risk",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "20000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/alpha/risk",
          "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "positions": {
                  "type": "object",
                  "required": true,
                  "description": "up to 64 positions keyed by name: {\"BTC\": {\"weight\": 0.6, \"returns\": [...]}}. Supply either returns[] (simple, oldest first) or prices[] and we derive them. At least 20 observations per position, and every series must cover the SAME periods — misaligned series make every correlation meaningless. Negative weight is a short."
                },
                "confidence": {
                  "type": "number",
                  "required": false,
                  "description": "VaR/ES confidence level in (0,1), default 0.95. 0.99 needs a longer series to mean anything."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "periods per year for annualisation (252 daily, 8760 hourly, 52 weekly). Omit it and nothing is annualised — we do not guess the frequency of a series we did not collect, because a daily series annualised as hourly is wrong by about 5x and looks plausible."
                },
                "portfolio_value_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total book value; when given, VaR and expected shortfall are also returned in dollars."
                },
                "data_timestamp": {
                  "type": "string",
                  "required": false,
                  "description": "ISO timestamp of the most recent observation. Carried through to provenance so an agent can judge how old the analysis is."
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, product, request_id, generated_at, basis:\"calculation\", result {portfolio {volatility, value_at_risk, expected_shortfall, max_drawdown, equity_curve_final}, positions[] {name, weight, weight_share, volatility, contribution_share}, concentration {hhi, effective_positions, largest_weight}, correlation {names, matrix}, dollar_risk?}, methodology, provenance {inputs_digest, age_seconds, methodology_version}, warnings[], inference {used:false}, confidence_note."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "239234449760",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/alpha/risk",
          "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "positions": {
                  "type": "object",
                  "required": true,
                  "description": "up to 64 positions keyed by name: {\"BTC\": {\"weight\": 0.6, \"returns\": [...]}}. Supply either returns[] (simple, oldest first) or prices[] and we derive them. At least 20 observations per position, and every series must cover the SAME periods — misaligned series make every correlation meaningless. Negative weight is a short."
                },
                "confidence": {
                  "type": "number",
                  "required": false,
                  "description": "VaR/ES confidence level in (0,1), default 0.95. 0.99 needs a longer series to mean anything."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "periods per year for annualisation (252 daily, 8760 hourly, 52 weekly). Omit it and nothing is annualised — we do not guess the frequency of a series we did not collect, because a daily series annualised as hourly is wrong by about 5x and looks plausible."
                },
                "portfolio_value_usd": {
                  "type": "number",
                  "required": false,
                  "description": "total book value; when given, VaR and expected shortfall are also returned in dollars."
                },
                "data_timestamp": {
                  "type": "string",
                  "required": false,
                  "description": "ISO timestamp of the most recent observation. Carried through to provenance so an agent can judge how old the analysis is."
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, product, request_id, generated_at, basis:\"calculation\", result {portfolio {volatility, value_at_risk, expected_shortfall, max_drawdown, equity_curve_final}, positions[] {name, weight, weight_share, volatility, contribution_share}, concentration {hhi, effective_positions, largest_weight}, correlation {names, matrix}, dollar_risk?}, methodology, provenance {inputs_digest, age_seconds, methodology_version}, warnings[], inference {used:false}, confidence_note."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "239.234449760 ANM",
            "usd_equivalent": "0.015000",
            "usd_list_price": "0.020000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "alpha_risk",
        "name": "Portfolio risk engine — deterministic, bring your own data",
        "description": "Value at Risk, expected shortfall, drawdown, correlation matrix, concentration and RISK CONTRIBUTION for a portfolio you supply as weights plus return series. Every figure is deterministic arithmetic, reproducible byte-for-byte, with no model involved and no confidence score invented. Risk contribution is the one that changes decisions: a 60/40 book is often a 50/50 risk book. Your positions are never stored and no keys or venue credentials are ever required.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-alpha_risk"
      }
    },
    {
      "resource": "https://animica.dev/x402/alpha/backtest",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "30000",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x5D17c40FD6b119dc6006C4Ab3C20a917FCaB2aCD",
          "resource": "https://animica.dev/x402/alpha/backtest",
          "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "bars": {
                  "type": "array",
                  "required": true,
                  "description": "price bars oldest first, up to 20000: [{\"t\": 1700000000, \"close\": 100.5}]. `t` is optional but when present must be strictly increasing — out-of-order or duplicated bars are refused rather than sorted, because sorting hides that your data source is wrong."
                },
                "strategy": {
                  "type": "object",
                  "required": true,
                  "description": "a strategy from the closed vocabulary, e.g. {\"kind\":\"sma_cross\",\"params\":{\"fast\":10,\"slow\":30}}. GET /x402/alpha/strategies lists every kind and its parameter ranges, free."
                },
                "costs": {
                  "type": "object",
                  "required": false,
                  "description": "per-side costs in basis points: {\"fee_bps\":10,\"spread_bps\":5,\"slippage_bps\":5}. Defaults are deliberately unflattering. Setting them all to zero is allowed and warned about."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "for annualising Sharpe/Sortino/CAGR (252 daily, 8760 hourly). Omit and nothing is annualised."
                },
                "allow_short": {
                  "type": "boolean",
                  "required": false,
                  "description": "permit negative positions (default false)"
                },
                "stop_loss_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when the position is down this fraction from entry, e.g. 0.05"
                },
                "take_profit_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when up this fraction from entry"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, basis:\"calculation\", result {lookahead_guarantee, performance {total_return, cagr, volatility, sharpe, sortino, max_drawdown, win_rate, profit_factor, trade_count, turnover, total_cost_fraction}, benchmark {name, total_return, excess_return}, costs_applied, equity_curve[], trades[]}, methodology, provenance, warnings[], inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "name": "USD Coin",
            "version": "2",
            "decimals": 6
          }
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "358851674641",
          "asset": "ANM",
          "payTo": "anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga",
          "resource": "https://animica.dev/x402/alpha/backtest",
          "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
          "mimeType": "application/json",
          "outputSchema": {
            "input": {
              "type": "http",
              "method": "POST",
              "bodyType": "json",
              "bodyFields": {
                "bars": {
                  "type": "array",
                  "required": true,
                  "description": "price bars oldest first, up to 20000: [{\"t\": 1700000000, \"close\": 100.5}]. `t` is optional but when present must be strictly increasing — out-of-order or duplicated bars are refused rather than sorted, because sorting hides that your data source is wrong."
                },
                "strategy": {
                  "type": "object",
                  "required": true,
                  "description": "a strategy from the closed vocabulary, e.g. {\"kind\":\"sma_cross\",\"params\":{\"fast\":10,\"slow\":30}}. GET /x402/alpha/strategies lists every kind and its parameter ranges, free."
                },
                "costs": {
                  "type": "object",
                  "required": false,
                  "description": "per-side costs in basis points: {\"fee_bps\":10,\"spread_bps\":5,\"slippage_bps\":5}. Defaults are deliberately unflattering. Setting them all to zero is allowed and warned about."
                },
                "periods_per_year": {
                  "type": "integer",
                  "required": false,
                  "description": "for annualising Sharpe/Sortino/CAGR (252 daily, 8760 hourly). Omit and nothing is annualised."
                },
                "allow_short": {
                  "type": "boolean",
                  "required": false,
                  "description": "permit negative positions (default false)"
                },
                "stop_loss_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when the position is down this fraction from entry, e.g. 0.05"
                },
                "take_profit_pct": {
                  "type": "number",
                  "required": false,
                  "description": "exit when up this fraction from entry"
                }
              }
            },
            "output": {
              "type": "json",
              "description": "schema_version, basis:\"calculation\", result {lookahead_guarantee, performance {total_return, cagr, volatility, sharpe, sortino, max_drawdown, win_rate, profit_factor, trade_count, turnover, total_cost_fraction}, benchmark {name, total_return, excess_return}, costs_applied, equity_curve[], trades[]}, methodology, provenance, warnings[], inference {used:false}."
            }
          },
          "maxTimeoutSeconds": 60,
          "extra": {
            "native": true,
            "decimals": 9,
            "unit": "nANM",
            "chain_id": 1,
            "genesis_hash": "0xa0892158cf997c56e91d0aa12e60c36037dae34800a2b54111a8fa17ec88b7de",
            "discount_percent": 25,
            "price_display": "358.851674641 ANM",
            "usd_equivalent": "0.022500",
            "usd_list_price": "0.030000",
            "rate_usd_per_anm": "0.0000627",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-23T05:53:05.000Z",
            "rate_side": "bid",
            "how_to_pay": "Sign a TRANSFER of at least `amount` nANM to payTo on Animica (chainId 1) and send the signed raw transaction as payload.rawTransaction. You pay the chain fee; we submit it. Because we sponsor no gas on this lane, it is priced 25% below the USDC price."
          }
        }
      ],
      "lastUpdated": 1787464418,
      "metadata": {
        "id": "alpha_backtest",
        "name": "Deterministic backtest with a structural look-ahead guarantee",
        "description": "Backtest a strategy against a price series you supply, with costs, a buy-and-hold benchmark, and a look-ahead guarantee that is structural rather than promised: the strategy is handed a truncated copy of the series and fills at the NEXT bar, so it cannot read the future. Strategies come from a closed vocabulary interpreted by our code — no generated code is ever executed. Returns equity curve, Sharpe, Sortino, max drawdown, profit factor, turnover and costs.",
        "method": "POST",
        "mimeType": "application/json",
        "available": true,
        "documentation": "https://animica.dev/x402#product-alpha_backtest"
      }
    }
  ],
  "updated_at": "2026-08-23T05:53:36.425Z"
}