{
  "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",
    "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": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
  "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.004590",
      "price_atomic": "4590",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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",
        "url": "https://animica.dev/x402/qrng/draw/trial",
        "price": "0",
        "limit_per_day": 3
      },
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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",
        "url": "https://animica.dev/x402/chain/export/trial",
        "price": "0",
        "limit_per_day": 5
      },
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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",
        "url": "https://animica.dev/x402/chain/address-history/trial",
        "price": "0",
        "limit_per_day": 5
      },
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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",
        "url": "https://animica.dev/x402/chain/balances/trial",
        "price": "0",
        "limit_per_day": 5
      },
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.007344",
      "price_atomic": "7344",
      "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",
        "url": "https://animica.dev/x402/v1/chat/completions/trial",
        "price": "0",
        "limit_per_day": 1
      },
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.002754",
      "price_atomic": "2754",
      "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",
        "url": "https://animica.dev/x402/v1/standard/chat/completions/trial",
        "price": "0",
        "limit_per_day": 1
      },
      "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": "2754",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "28279923308",
          "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": "28.279923308 ANM",
            "usd_equivalent": "0.002065",
            "usd_list_price": "0.002754",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "5135579293344",
          "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": "5135.579293344 ANM",
            "usd_equivalent": "0.375000",
            "usd_list_price": "0.50",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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",
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.007344",
      "price_atomic": "7344",
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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[]}, head {height, hash}, network {peers, hashrate}, observed_at"
        }
      },
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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[]}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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[]}, 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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.007344",
      "price_atomic": "7344",
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.007344",
      "price_atomic": "7344",
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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",
        "url": "https://animica.dev/x402/random/int/trial",
        "price": "0",
        "limit_per_day": 3
      },
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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",
        "url": "https://animica.dev/x402/random/shuffle/trial",
        "price": "0",
        "limit_per_day": 3
      },
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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",
        "url": "https://animica.dev/x402/random/pick/trial",
        "price": "0",
        "limit_per_day": 3
      },
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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",
        "url": "https://animica.dev/x402/qrng/bulk/trial",
        "price": "0",
        "limit_per_day": 3
      },
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.004590",
      "price_atomic": "4590",
      "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.7428,
        "observed_at": "2026-08-19T01:26:08.206Z",
        "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.005508",
      "price_atomic": "5508",
      "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",
        "url": "https://animica.dev/x402/media/image/trial",
        "price": "0",
        "limit_per_day": 1
      },
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.007344",
      "price_atomic": "7344",
      "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",
        "url": "https://animica.dev/x402/media/video/trial",
        "price": "0",
        "limit_per_day": 1
      },
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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.006426",
      "price_atomic": "6426",
      "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",
        "url": "https://animica.dev/x402/media/audio/trial",
        "price": "0",
        "limit_per_day": 1
      },
      "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": "6426",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "65995617639",
          "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": "65.995617639 ANM",
            "usd_equivalent": "0.004819",
            "usd_list_price": "0.006426",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "2754",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "28279923308",
          "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": "28.279923308 ANM",
            "usd_equivalent": "0.002065",
            "usd_list_price": "0.002754",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "5135579293344",
          "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": "5135.579293344 ANM",
            "usd_equivalent": "0.375000",
            "usd_list_price": "0.50",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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[]}, head {height, hash}, network {peers, hashrate}, observed_at"
            }
          },
          "maxTimeoutSeconds": 60
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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[]}, 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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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/forecast",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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/random/int",
      "type": "http",
      "x402Version": 2,
      "accepts": [
        {
          "scheme": "exact",
          "network": "base",
          "network_caip2": "eip155:8453",
          "maxAmountRequired": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "4590",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "47137770473",
          "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": "47.137770473 ANM",
            "usd_equivalent": "0.003442",
            "usd_list_price": "0.004590",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "5508",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "56573541495",
          "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": "56.573541495 ANM",
            "usd_equivalent": "0.004131",
            "usd_list_price": "0.005508",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "7344",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "75431388660",
          "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": "75.431388660 ANM",
            "usd_equivalent": "0.005508",
            "usd_list_price": "0.007344",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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": "6426",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0x20fEee2dC0d4b36f69ddca69d0cE32d7E80b27a6",
          "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
        },
        {
          "scheme": "exact",
          "network": "animica:1",
          "network_caip2": "animica:1",
          "maxAmountRequired": "65995617639",
          "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": "65.995617639 ANM",
            "usd_equivalent": "0.004819",
            "usd_list_price": "0.006426",
            "rate_usd_per_anm": "0.00007302",
            "rate_source": "nonkyc",
            "rate_observed_at": "2026-08-19T01:25:20.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": 1787102768,
      "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"
      }
    }
  ],
  "updated_at": "2026-08-19T01:26:08.080Z"
}