Setu.Anantasutra: Agent Tools API

Version 1.0.0+ae0ae6d9 ยท x402 payments enabled on Base mainnet via the PayAI facilitator.

Small, deterministic JSON tools for AI agents and developers. No sign-up and no API key: an unpaid call returns HTTP 402 with x402 payment requirements, and any x402 client pays in USDC and retries automatically. Calls that fail are not charged.

Endpoints

EndpointPrice per call
POST /v1/india-id/validate
Validate and decode one Indian identifier
$0.005
POST /v1/india-id/validate-batch
Validate up to 50 Indian identifiers
$0.02
GET /v1/geo/audit
AI visibility (GEO) audit for one URL
$0.02
GET /v1/geo/ai-crawlers
AI crawler access matrix from robots.txt
$0.01
GET /v1/llms-txt/check
llms.txt presence and structure check
$0.005

Machine-readable: OpenAPI 3.1 (3.0 variant), llms.txt, x402 manifest.

Paying with x402

Network eip155:8453, scheme exact, asset USDC. Example with the official fetch wrapper:

import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
// signer: a viem account of the wallet that pays (holds USDC on Base)
const client = new x402Client();
client.register("eip155:*", new ExactEvmScheme(signer));
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const res = await fetchWithPayment("https://setu.xyz23110928.workers.dev/v1/llms-txt/check?domain=example.com");

MCP

Remote MCP endpoint: https://setu.xyz23110928.workers.dev/mcp (Streamable HTTP, stateless; protocol 2026-07-28 and the earlier initialize-based versions). tools/list is free. Tool calls are paid with x402: an unpaid tools/call returns the payment requirements as an error result, and x402-aware MCP clients retry with _meta["x402/payment"].

POST /v1/india-id/validate $0.005

Validates and decodes one Indian business or payment identifier offline: GSTIN, PAN, TAN, CIN, LLPIN, IFSC, PIN code, UPI ID and vehicle registration numbers. Detects the type automatically, normalises copy-paste noise, verifies check digits where the algorithm is public (GSTIN), and decodes embedded fields such as state, PAN holder type or company type. Aadhaar numbers are refused. Use it to clean or pre-check form and invoice data.

JSON body

curl -i -X POST "https://setu.xyz23110928.workers.dev/v1/india-id/validate" \
  -H "Content-Type: application/json" \
  -d '{"value":"27AAPFU0939F1ZV"}'
Example response
{
  "input": "27AAPFU0939F1ZV",
  "detectedType": "gstin",
  "valid": true,
  "normalized": "27AAPFU0939F1ZV",
  "decoded": {
    "stateCode": "27",
    "state": "Maharashtra",
    "pan": "AAPFU0939F",
    "panHolderType": "Firm / Limited Liability Partnership",
    "checksumValid": true
  },
  "errors": [],
  "warnings": []
}

POST /v1/india-id/validate-batch $0.02

Batch version of the Indian identifier validator: up to 50 values per call (GSTIN, PAN, TAN, CIN, LLPIN, IFSC, PIN code, UPI ID and vehicle registration numbers), mixed types allowed, one flat price. Returns one decoded result per item plus counts by type and validity. Use it for cleaning vendor lists, invoices or onboarding data. Batches containing Aadhaar-like numbers are rejected without charge.

JSON body

curl -i -X POST "https://setu.xyz23110928.workers.dev/v1/india-id/validate-batch" \
  -H "Content-Type: application/json" \
  -d '{"items":["27AAPFU0939F1ZV","AAPFU0939F","SBIN0000300","560001"]}'
Example response
{
  "summary": {
    "total": 4,
    "valid": 4,
    "invalid": 0,
    "refusedAadhaar": 0,
    "blank": 0,
    "byType": {
      "gstin": {
        "total": 1,
        "valid": 1
      },
      "pan": {
        "total": 1,
        "valid": 1
      },
      "ifsc": {
        "total": 1,
        "valid": 1
      },
      "pincode": {
        "total": 1,
        "valid": 1
      }
    }
  },
  "results": [
    {
      "index": 0,
      "input": "27AAPFU0939F1ZV",
      "detectedType": "gstin",
      "valid": true,
      "normalized": "27AAPFU0939F1ZV",
      "decoded": {
        "state": "Maharashtra"
      },
      "errors": [],
      "warnings": []
    }
  ]
}

GET /v1/geo/audit $0.02

Audits how visible one web page is to AI search engines and AI assistants: which of the major AI crawlers robots.txt allows or blocks, llms.txt and llms-full.txt presence, sitemap, and on-page signals (title, meta, canonical, structured data, headings, content readable without JavaScript). Returns a 0-100 score, grade and prioritised recommendations. Use it to check or monitor a site for generative-engine optimisation.

Query parameters

curl -i "https://setu.xyz23110928.workers.dev/v1/geo/audit?url=https%3A%2F%2Fexample.com%2F"
Example response
{
  "url": "https://example.com/",
  "status": "ok",
  "score": 72,
  "grade": "C",
  "summary": "AI visibility score 72/100 (C). AI search crawlers allowed: 9/9; user-triggered agents allowed: 8/8; training crawlers blocked: 0/12. llms.txt: missing. Main content without JavaScript: yes.",
  "llmsTxtStatus": "missing",
  "blockedAiCrawlers": [],
  "topRecommendation": "Publish an llms.txt file",
  "recommendations": [
    {
      "priority": "medium",
      "title": "Publish an llms.txt file"
    }
  ]
}

GET /v1/geo/ai-crawlers $0.01

Reads a domain's robots.txt (RFC 9309 matching) and reports, for each known AI crawler and AI agent (OpenAI, Anthropic, Google, Perplexity, Apple, Meta, Amazon, Common Crawl and others), whether it may fetch the site root and up to five extra paths, with the deciding rule and any Content-Signal preferences. Use it to see whether a site is open to AI search but closed to AI training.

Query parameters

curl -i "https://setu.xyz23110928.workers.dev/v1/geo/ai-crawlers?domain=example.com&paths=%2Fblog%2F"
Example response
{
  "origin": "https://example.com",
  "robotsTxt": {
    "httpStatus": 200,
    "state": "ok"
  },
  "pathsChecked": [
    "/",
    "/blog/"
  ],
  "summary": {
    "searchCrawlersAllowed": {
      "allowed": 9,
      "total": 9
    },
    "trainingCrawlersAllowed": {
      "allowed": 0,
      "total": 12
    },
    "blocked": [
      "GPTBot",
      "CCBot"
    ]
  },
  "crawlers": [
    {
      "bot": "GPTBot",
      "operator": "OpenAI",
      "category": "training",
      "allowedRoot": false,
      "decidingRule": "Disallow: /"
    }
  ]
}

GET /v1/llms-txt/check $0.005

Checks whether a domain publishes /llms.txt and /llms-full.txt and validates llms.txt against the llmstxt.org structure: single H1 title, blockquote summary, H2 sections with markdown link lists, soft-404 detection and size. Respects robots.txt. Use it before or after publishing an llms.txt file.

Query parameters

curl -i "https://setu.xyz23110928.workers.dev/v1/llms-txt/check?domain=example.com"
Example response
{
  "origin": "https://example.com",
  "status": "invalid",
  "llmsTxt": {
    "present": true,
    "valid": false,
    "title": null,
    "sections": [],
    "linkCount": 0,
    "issues": [
      "first line is not an H1 (\"# Name\"), which the spec requires"
    ]
  },
  "llmsFullTxt": {
    "present": false
  }
}

Limits, and what is never charged

About the crawler

The audit endpoints fetch public pages only when a caller asks for that site. Requests identify as AIVisibilityAudit/1.0, obey robots.txt for that token (and *), never send cookies, read at most a few hundred kilobytes per resource and make a handful of requests per call. To opt out, add User-agent: AIVisibilityAudit / Disallow: / to robots.txt.

Terms and privacy