{"openapi":"3.0.3","info":{"title":"Setu.Anantasutra: Agent Tools API","version":"1.0.0+ae0ae6d9","description":"JSON APIs for AI agents and developers. Validate and decode one Indian identifier. Validate up to 50 Indian identifiers. AI visibility (GEO) audit for one URL. AI crawler access matrix from robots.txt. llms.txt presence and structure check. Pay per call with x402 (USDC on Base) or subscribe on RapidAPI.","x-guidance":"Each paid endpoint is a single JSON call. Without payment it answers HTTP 402 with x402 v2 payment requirements in the PAYMENT-REQUIRED header (exact scheme, USDC). Retry the same request with a PAYMENT-SIGNATURE header to receive the result; a rejected payment gets 402 with a JSON body that names the reason. Only HTTP 200 responses are charged; every error status is free. RapidAPI subscribers call the same paths through RapidAPI instead. GET endpoints take query parameters; POST endpoints take a JSON body (at most 65536 bytes).","termsOfService":"https://setu.xyz23110928.workers.dev/#terms"},"servers":[{"url":"https://setu.xyz23110928.workers.dev"}],"tags":[{"name":"india"},{"name":"ai-visibility"},{"name":"ai-crawlers"},{"name":"llms-txt"}],"paths":{"/health":{"get":{"operationId":"health","summary":"Service health and payment configuration","description":"Free. Liveness probe.","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/llms.txt":{"get":{"operationId":"llmsTxt","summary":"Machine-readable overview for LLM agents","description":"Free.","security":[],"responses":{"200":{"description":"OK","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/v1/india-id/validate":{"post":{"operationId":"indiaIdValidate","summary":"Validate and decode one Indian identifier","description":"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.\n\nPrice: $0.005 per successful call (x402, USDC) or included in a RapidAPI plan.","tags":["india"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"detectedType":{"type":"string"},"valid":{"type":"boolean"},"normalized":{"type":"string","nullable":true},"decoded":{"type":"object","nullable":true},"errors":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"scopeNote":{"type":"string"}},"required":["detectedType","valid","errors","warnings"]},"example":{"input":"27AAPFU0939F1ZV","detectedType":"gstin","valid":true,"normalized":"27AAPFU0939F1ZV","decoded":{"stateCode":"27","state":"Maharashtra","pan":"AAPFU0939F","panHolderType":"Firm / Limited Liability Partnership","checksumValid":true},"errors":[],"warnings":[]}}}},"400":{"description":"Invalid input or refused target, e.g. a blank identifier or a private address (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment Required. x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 PaymentRequired object","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"Wrong HTTP method for this path; the Allow header lists the right one (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body larger than 65536 bytes (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Aadhaar-like value refused (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many failed payment verifications from this client; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The target site, page or robots.txt could not be read, or an upstream service did not answer (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Payments or the DNS safety check temporarily unavailable; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":256,"description":"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":{"type":"string","enum":["auto","gstin","pan","tan","cin","llpin","ifsc","pincode","upi","vehicle"],"description":"Force a type instead of auto-detection (default auto). Case-insensitive; one of: auto, gstin, pan, tan, cin, llpin, ifsc, pincode, upi, vehicle."}},"required":["value"],"additionalProperties":false},"example":{"value":"27AAPFU0939F1ZV"}}}}}},"/v1/india-id/validate-batch":{"post":{"operationId":"indiaIdValidateBatch","summary":"Validate up to 50 Indian identifiers","description":"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.\n\nPrice: $0.02 per successful call (x402, USDC) or included in a RapidAPI plan.","tags":["india"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object"},"results":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"detectedType":{"type":"string"},"valid":{"type":"boolean"},"normalized":{"type":"string","nullable":true},"decoded":{"type":"object","nullable":true},"errors":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"scopeNote":{"type":"string"}},"required":["detectedType","valid","errors","warnings"]}}},"required":["summary","results"]},"example":{"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":[]}]}}}},"400":{"description":"Invalid input or refused target, e.g. a blank identifier or a private address (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment Required. x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 PaymentRequired object","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"Wrong HTTP method for this path; the Allow header lists the right one (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body larger than 65536 bytes (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Aadhaar-like value refused (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many failed payment verifications from this client; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The target site, page or robots.txt could not be read, or an upstream service did not answer (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Payments or the DNS safety check temporarily unavailable; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","minItems":1,"maxItems":50,"description":"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).","items":{"anyOf":[{"type":"string","maxLength":256},{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":256},"type":{"type":"string","enum":["auto","gstin","pan","tan","cin","llpin","ifsc","pincode","upi","vehicle"]}},"required":["value"]}]}},"type":{"type":"string","enum":["auto","gstin","pan","tan","cin","llpin","ifsc","pincode","upi","vehicle"],"description":"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."}},"required":["items"],"additionalProperties":false},"example":{"items":["27AAPFU0939F1ZV","AAPFU0939F","SBIN0000300","560001"]}}}}}},"/v1/geo/audit":{"get":{"operationId":"geoAudit","summary":"AI visibility (GEO) audit for one URL","description":"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.\n\nPrice: $0.02 per successful call (x402, USDC) or included in a RapidAPI plan.","tags":["ai-visibility"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"score":{"type":"integer","nullable":true},"grade":{"type":"string","nullable":true},"summary":{"type":"string"},"recommendations":{"type":"array","items":{"type":"object"}},"blockedAiCrawlers":{"type":"array","items":{"type":"string"}},"llmsTxtStatus":{"type":"string"}},"required":["url","score","summary"]},"example":{"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"}]}}}},"400":{"description":"Invalid input or refused target, e.g. a blank identifier or a private address (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment Required. x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 PaymentRequired object","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"Wrong HTTP method for this path; the Allow header lists the right one (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body larger than 65536 bytes (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many failed payment verifications from this client; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The target site, page or robots.txt could not be read, or an upstream service did not answer (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Payments or the DNS safety check temporarily unavailable; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"url","in":"query","required":true,"description":"Page URL or bare domain to audit, e.g. https://example.com/pricing","schema":{"type":"string","minLength":3,"maxLength":2048},"example":"https://example.com/"}]}},"/v1/geo/ai-crawlers":{"get":{"operationId":"aiCrawlers","summary":"AI crawler access matrix from robots.txt","description":"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.\n\nPrice: $0.01 per successful call (x402, USDC) or included in a RapidAPI plan.","tags":["ai-crawlers"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"origin":{"type":"string"},"summary":{"type":"object"},"crawlers":{"type":"array","items":{"type":"object","properties":{"bot":{"type":"string"},"operator":{"type":"string"},"category":{"type":"string","enum":["training","search","user","other"]},"allowedRoot":{"type":"boolean"},"decidingRule":{"type":"string","nullable":true}}}}},"required":["origin","summary","crawlers"]},"example":{"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: /"}]}}}},"400":{"description":"Invalid input or refused target, e.g. a blank identifier or a private address (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment Required. x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 PaymentRequired object","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"Wrong HTTP method for this path; the Allow header lists the right one (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body larger than 65536 bytes (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many failed payment verifications from this client; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The target site, page or robots.txt could not be read, or an upstream service did not answer (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Payments or the DNS safety check temporarily unavailable; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"domain","in":"query","required":true,"description":"Domain or URL, e.g. example.com","schema":{"type":"string","minLength":3,"maxLength":253},"example":"example.com"},{"name":"paths","in":"query","required":false,"description":"Optional comma-separated extra paths to test, e.g. /blog/,/docs/","schema":{"type":"string","maxLength":600},"example":"/blog/"}]}},"/v1/llms-txt/check":{"get":{"operationId":"llmsTxtCheck","summary":"llms.txt presence and structure check","description":"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.\n\nPrice: $0.005 per successful call (x402, USDC) or included in a RapidAPI plan.","tags":["llms-txt"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"origin":{"type":"string"},"status":{"type":"string","enum":["missing","valid","invalid"]},"llmsTxt":{"type":"object"},"llmsFullTxt":{"type":"object"}},"required":["origin","status","llmsTxt"]},"example":{"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}}}}},"400":{"description":"Invalid input or refused target, e.g. a blank identifier or a private address (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment Required. x402 v2 payment requirements are in the PAYMENT-REQUIRED header (base64 JSON).","headers":{"PAYMENT-REQUIRED":{"description":"Base64-encoded x402 PaymentRequired object","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"Wrong HTTP method for this path; the Allow header lists the right one (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body larger than 65536 bytes (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many failed payment verifications from this client; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The target site, page or robots.txt could not be read, or an upstream service did not answer (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Payments or the DNS safety check temporarily unavailable; see Retry-After (not charged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"domain","in":"query","required":true,"description":"Domain or URL, e.g. example.com","schema":{"type":"string","minLength":3,"maxLength":253},"example":"example.com"}]}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error"]}}}}