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
| Endpoint | Price per call |
|---|---|
POST /v1/india-id/validateValidate and decode one Indian identifier | $0.005 |
POST /v1/india-id/validate-batchValidate up to 50 Indian identifiers | $0.02 |
GET /v1/geo/auditAI visibility (GEO) audit for one URL | $0.02 |
GET /v1/geo/ai-crawlersAI crawler access matrix from robots.txt | $0.01 |
GET /v1/llms-txt/checkllms.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
value(required): The identifier, e.g. 27AAPFU0939F1ZV. An optional "type:" prefix such as "pan:" is accepted; a PIN code may also be sent as a JSON number. Blank values are rejected (400, not charged).type: Force a type instead of auto-detection (default auto). Case-insensitive; one of: auto, gstin, pan, tan, cin, llpin, ifsc, pincode, upi, vehicle.
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
items(required): Identifiers as strings or {"value","type"} objects (PIN codes may be JSON numbers). Blank items are skipped; a batch where every item is blank is rejected (400, not charged).type: Default type for all items. Force a type instead of auto-detection (default auto). Case-insensitive; one of: auto, gstin, pan, tan, cin, llpin, ifsc, pincode, upi, vehicle.
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
url(required): Page URL or bare domain to audit, e.g. https://example.com/pricing
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
domain(required): Domain or URL, e.g. example.compaths: Optional comma-separated extra paths to test, e.g. /blog/,/docs/
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
domain(required): Domain or URL, e.g. example.com
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
- Request body: at most 65536 bytes (64 KB), counted on the bytes received, with or without a Content-Length header. Larger bodies get HTTP 413.
- Identifier values: 1 to 256 characters and not blank. Spaces, dashes, invisible characters (zero-width space, BOM), full-width and Devanagari digits are cleaned first;
typeis case-insensitive. - Batch: 1 to 50 items per call at one flat price. Blank items are skipped; a batch where every item is blank is refused (400).
- GEO tools fetch public internet sites only: http or https on ports 80 and 443. Private, loopback, link-local, carrier-grade NAT, multicast, documentation and other reserved addresses are refused (400), including hostnames whose DNS records point at them; every hostname, also on redirects, is checked with DNS-over-HTTPS before it is fetched.
- Each outbound request times out after 8 s. Response bodies are read up to 128 KB (robots.txt), 128 KB (llms.txt), 64 KB (sitemap) and 192 KB (page) on this deployment's Workers plan.
- Per call: at most 36 outbound requests and 4 distinct hostnames for an audit, 10/3 for the crawler matrix and 20/3 for the llms.txt check; the crawler matrix tests at most 5 extra paths (extra ones are listed in
warnings). - Never charged with x402: any error status (RapidAPI may still count error responses against a plan quota). That covers invalid input (400), unsupported method (405), oversized body (413), Aadhaar-like values (422), a site, page or robots.txt that could not be read (502), a DNS check that could not run (503) and rejected payments (402, or 429 after 10 failed payment verifications from one client within 10 minutes).
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
- Results are automated checks provided as-is, without warranty. Identifier endpoints check format and check digits only; they do not confirm that an identifier was issued or belongs to anyone, and they do not query any government database.
- Only submit data you are entitled to process. Inputs are processed in memory to produce the response and are not stored or logged by this service. Cloudflare, which hosts it, keeps standard request metadata.
- Payments are final once settled on-chain; failed calls are never settled. Fair use: automated abuse may be blocked.