{
  "name": "AgentStall ZA",
  "summary": "Pay-per-call South African data for AI agents: government tenders, SARS deadlines, public and school holidays, business days, SARB rates, ID, tax, company, bank and phone checks, and cyber security (POPIA and FSCA/PA breach-reporting obligations, official-domain and phishing checks, email-spoofing protection). No sign-up, no API key: pay each call with x402.",
  "payment": {
    "protocol": "x402 v2",
    "scheme": "exact",
    "network": "eip155:8453",
    "networkName": "Base mainnet",
    "asset": "USDC",
    "assetAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "payTo": "0xA5b46001f5fAAfA9d7bB4efeEA6C724d52567a02",
    "facilitator": "https://api.cdp.coinbase.com/platform/v2/x402"
  },
  "discovery": {
    "llms": "https://agentstall.nilesh-b54.workers.dev/llms.txt",
    "openapi": "https://agentstall.nilesh-b54.workers.dev/openapi.json",
    "mcp": "https://agentstall.nilesh-b54.workers.dev/mcp",
    "wellKnown": "https://agentstall.nilesh-b54.workers.dev/.well-known/x402"
  },
  "products": [
    {
      "id": "holidays",
      "group": "Calendar",
      "title": "South African public holidays for a year",
      "description": "All South African public holidays for a year, including Sunday-to-Monday observed days and specially proclaimed days (e.g. election days).",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/holidays",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/holidays?year=2026"
      },
      "mcpTool": "za_public_holidays",
      "priceUsd": "0.001",
      "priceAtomic": "1000",
      "params": [
        {
          "name": "year",
          "type": "integer",
          "description": "Calendar year, 1995-2100",
          "required": true,
          "example": "2026"
        }
      ],
      "exampleResult": {
        "year": 2026,
        "count": 14,
        "holidays": [
          {
            "date": "2026-11-04",
            "name": "Local Government Elections",
            "type": "special"
          }
        ]
      }
    },
    {
      "id": "business-day",
      "group": "Calendar",
      "title": "Is this date a South African business day?",
      "description": "Says whether a date is a South African business day (Mon-Fri, not a public holiday), why not, and the next and previous business days.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/business-day",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/business-day?date=2026-11-04"
      },
      "mcpTool": "za_is_business_day",
      "priceUsd": "0.001",
      "priceAtomic": "1000",
      "params": [
        {
          "name": "date",
          "type": "string",
          "description": "Date in YYYY-MM-DD",
          "required": true,
          "example": "2026-11-04"
        }
      ],
      "exampleResult": {
        "date": "2026-11-04",
        "weekday": "Wednesday",
        "isBusinessDay": false,
        "reason": "public holiday: Local Government Elections",
        "nextBusinessDay": "2026-11-05",
        "previousBusinessDay": "2026-11-03"
      }
    },
    {
      "id": "add-business-days",
      "group": "Calendar",
      "title": "Add South African business days to a date",
      "description": "Adds (or subtracts, if negative) N South African business days to a start date. Use for payment terms, notice periods, delivery and legal deadlines.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/add-business-days",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/add-business-days?start=2026-12-23&days=5"
      },
      "mcpTool": "za_add_business_days",
      "priceUsd": "0.002",
      "priceAtomic": "2000",
      "params": [
        {
          "name": "start",
          "type": "string",
          "description": "Start date, YYYY-MM-DD",
          "required": true,
          "example": "2026-12-23"
        },
        {
          "name": "days",
          "type": "integer",
          "description": "Business days to add, -1000 to 1000",
          "required": true,
          "example": "5"
        }
      ],
      "exampleResult": {
        "start": "2026-12-23",
        "businessDaysAdded": 5,
        "result": "2026-12-31",
        "resultWeekday": "Thursday",
        "holidaysSkipped": [
          {
            "date": "2026-12-25",
            "name": "Christmas Day"
          }
        ]
      }
    },
    {
      "id": "count-business-days",
      "group": "Calendar",
      "title": "Count South African business days between two dates",
      "description": "Counts South African business days between two dates (after 'from', up to and including 'to'), listing the weekday holidays excluded.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/count-business-days",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/count-business-days?from=2026-12-01&to=2026-12-31"
      },
      "mcpTool": "za_count_business_days",
      "priceUsd": "0.002",
      "priceAtomic": "2000",
      "params": [
        {
          "name": "from",
          "type": "string",
          "description": "Start date, YYYY-MM-DD (exclusive)",
          "required": true,
          "example": "2026-12-01"
        },
        {
          "name": "to",
          "type": "string",
          "description": "End date, YYYY-MM-DD (inclusive), within 5 years of 'from'",
          "required": true,
          "example": "2026-12-31"
        }
      ],
      "exampleResult": {
        "from": "2026-12-01",
        "to": "2026-12-31",
        "businessDays": 20,
        "calendarDays": 30
      }
    },
    {
      "id": "school-calendar",
      "group": "Calendar",
      "title": "South African public school terms and school days",
      "description": "Public school term dates for a year (Department of Basic Education), or whether a given date is a school day (in term, weekday, not a public or special school holiday).",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/school-calendar",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/school-calendar?date=2026-11-04&year=2026"
      },
      "mcpTool": "za_school_calendar",
      "priceUsd": "0.003",
      "priceAtomic": "3000",
      "params": [
        {
          "name": "date",
          "type": "string",
          "description": "Optional date (YYYY-MM-DD) to check whether it is a school day",
          "required": false,
          "example": "2026-11-04"
        },
        {
          "name": "year",
          "type": "integer",
          "description": "Optional year (2026-2027) to list the terms; defaults to the date's year or the current year",
          "required": false,
          "example": "2026"
        }
      ],
      "exampleResult": {
        "date": "2026-11-04",
        "isSchoolDay": false,
        "reason": "public holiday: Local Government Elections",
        "term": 4,
        "termEnds": "2026-12-09"
      }
    },
    {
      "id": "sars-deadlines",
      "group": "Compliance",
      "title": "SARS tax deadlines between two dates",
      "description": "SARS due dates in a date range: EMP201 (PAYE/UIF/SDL), VAT201 eFiling, provisional tax (IRP6), EMP501 reconciliations and announced filing-season deadlines, already moved to the previous business day where SARS rules require it.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/sars-deadlines",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/sars-deadlines?from=2026-10-22&to=2026-12-31"
      },
      "mcpTool": "za_sars_deadlines",
      "priceUsd": "0.005",
      "priceAtomic": "5000",
      "params": [
        {
          "name": "from",
          "type": "string",
          "description": "Start date YYYY-MM-DD (default: today)",
          "required": false,
          "example": "2026-10-22"
        },
        {
          "name": "to",
          "type": "string",
          "description": "End date YYYY-MM-DD, at most 400 days after 'from' (default: from + 90 days)",
          "required": false,
          "example": "2026-12-31"
        }
      ],
      "exampleResult": {
        "count": 9,
        "deadlines": [
          {
            "date": "2026-10-23",
            "obligation": "Deadline: income tax returns for non-provisional individuals not auto-assessed",
            "form": "ITR12"
          },
          {
            "date": "2026-11-06",
            "nominalDate": "2026-11-07",
            "form": "EMP201",
            "period": "October 2026"
          }
        ]
      }
    },
    {
      "id": "tenders",
      "group": "Government tenders",
      "title": "Search South African government tenders",
      "description": "Searches national, provincial, municipal and state-owned-entity tenders published on the National Treasury eTenders portal. Filter by keywords, open status, closing window, category and buyer. Returns closing dates and document links.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/tenders",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/tenders?q=cleaning+services&open=true&closing_within_days=14&category=services&buyer=Municipality&limit=10"
      },
      "mcpTool": "za_tender_search",
      "priceUsd": "0.005",
      "priceAtomic": "5000",
      "params": [
        {
          "name": "q",
          "type": "string",
          "description": "Keywords, e.g. 'security services' or 'laptops -lease'",
          "required": false,
          "example": "cleaning services"
        },
        {
          "name": "open",
          "type": "boolean",
          "description": "Only tenders still open (default true)",
          "required": false,
          "example": "true"
        },
        {
          "name": "closing_within_days",
          "type": "integer",
          "description": "Only tenders closing within N days (1-365)",
          "required": false,
          "example": "14"
        },
        {
          "name": "category",
          "type": "string",
          "description": "goods, services, works or consultingServices",
          "required": false,
          "example": "services"
        },
        {
          "name": "buyer",
          "type": "string",
          "description": "Part of the buyer's name, e.g. 'Municipality' or 'Transnet'",
          "required": false,
          "example": "Municipality"
        },
        {
          "name": "limit",
          "type": "integer",
          "description": "Maximum results, 1-50 (default 20)",
          "required": false,
          "example": "10"
        }
      ],
      "exampleResult": {
        "totalMatches": 12,
        "results": [
          {
            "tenderNumber": "aLim47/Historic-VAT/26/27/022",
            "description": "Provision of historic value added tax SARS dispute...",
            "buyer": "Makhuduthamaga Local Municipality",
            "closes": "2026-11-02T12:00:00Z"
          }
        ]
      }
    },
    {
      "id": "rates",
      "group": "Money",
      "title": "South African interest, inflation and exchange rates",
      "description": "Latest repo rate, prime lending rate, CPI and PPI inflation, and rand exchange rates (USD, GBP, EUR, JPY) as published by the South African Reserve Bank.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/rates",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/rates?"
      },
      "mcpTool": "za_sarb_rates",
      "priceUsd": "0.005",
      "priceAtomic": "5000",
      "params": [],
      "exampleResult": {
        "rates": {
          "repoRate": {
            "value": 7.25,
            "asOf": "2026-10-22"
          },
          "primeLendingRate": {
            "value": 10.75,
            "asOf": "2026-10-22"
          },
          "zarPerUsd": {
            "value": 16.4688,
            "asOf": "2026-10-22"
          }
        }
      }
    },
    {
      "id": "bank-branch-codes",
      "group": "Money",
      "title": "South African bank universal branch codes",
      "description": "Universal branch codes for South African banks (Absa, Capitec, FNB, Nedbank, Standard Bank, TymeBank, Discovery, Investec, African Bank, Bidvest). Optionally filter by bank name.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/bank-branch-codes",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/bank-branch-codes?bank=Capitec"
      },
      "mcpTool": "za_bank_branch_codes",
      "priceUsd": "0.001",
      "priceAtomic": "1000",
      "params": [
        {
          "name": "bank",
          "type": "string",
          "description": "Optional bank name or code to look up",
          "required": false,
          "example": "Capitec"
        }
      ],
      "exampleResult": {
        "matches": [
          {
            "bank": "Capitec Bank",
            "universalBranchCode": "470010"
          }
        ]
      }
    },
    {
      "id": "validate-id",
      "group": "Checks",
      "title": "Validate a South African ID number",
      "description": "Checks a 13-digit South African ID number's structure (date of birth, citizenship digit, Luhn checksum) and decodes date of birth, age, gender and citizenship. Structural only; nothing is stored.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/validate-id",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/validate-id?id=8001015009087"
      },
      "mcpTool": "za_validate_id_number",
      "priceUsd": "0.005",
      "priceAtomic": "5000",
      "params": [
        {
          "name": "id",
          "type": "string",
          "description": "13-digit SA ID number",
          "required": true,
          "example": "8001015009087"
        }
      ],
      "exampleResult": {
        "valid": true,
        "decoded": {
          "dateOfBirth": "1980-01-01",
          "ageYears": 46,
          "gender": "male",
          "citizenship": "SA citizen"
        }
      }
    },
    {
      "id": "validate-tax-number",
      "group": "Checks",
      "title": "Validate a South African VAT or income tax number",
      "description": "Checks a 10-digit SARS number: tells VAT registration numbers (start with 4) from income tax reference numbers (start with 0, 1, 2, 3 or 9) and verifies the modulus-10 check digit. Nothing is stored.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/validate-tax-number",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/validate-tax-number?number=0001339050"
      },
      "mcpTool": "za_validate_tax_number",
      "priceUsd": "0.002",
      "priceAtomic": "2000",
      "params": [
        {
          "name": "number",
          "type": "string",
          "description": "VAT or income tax number; spaces, dashes and slashes are ignored",
          "required": true,
          "example": "0001339050"
        }
      ],
      "exampleResult": {
        "valid": true,
        "type": "income tax reference number",
        "normalized": "0001339050"
      }
    },
    {
      "id": "validate-company-number",
      "group": "Checks",
      "title": "Validate a South African company registration number",
      "description": "Checks a CIPC registration number (YYYY/NNNNNN/NN) and decodes the registration year and entity type: (Pty) Ltd, Ltd, NPC, Inc, CC, co-operative, SOC, external company and more.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/validate-company-number",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/validate-company-number?number=2015%2F123456%2F07"
      },
      "mcpTool": "za_validate_company_number",
      "priceUsd": "0.002",
      "priceAtomic": "2000",
      "params": [
        {
          "name": "number",
          "type": "string",
          "description": "Registration number, e.g. 2015/123456/07",
          "required": true,
          "example": "2015/123456/07"
        }
      ],
      "exampleResult": {
        "valid": true,
        "formatted": "2015/123456/07",
        "registrationYear": 2015,
        "entityType": "Private company (Pty) Ltd"
      }
    },
    {
      "id": "normalize-phone",
      "group": "Checks",
      "title": "Clean up and classify a South African phone number",
      "description": "Converts a South African phone number to international (+27) and local formats and says whether it is mobile, landline (with area for major cities), toll-free, VoIP or premium-rate.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/normalize-phone",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/normalize-phone?number=082+123+4567"
      },
      "mcpTool": "za_normalize_phone",
      "priceUsd": "0.001",
      "priceAtomic": "1000",
      "params": [
        {
          "name": "number",
          "type": "string",
          "description": "Phone number in any common format, e.g. 082 123 4567 or +27 11 555 1234",
          "required": true,
          "example": "082 123 4567"
        }
      ],
      "exampleResult": {
        "valid": true,
        "e164": "+27821234567",
        "national": "082 123 4567",
        "type": "mobile"
      }
    },
    {
      "id": "incident-reporting",
      "group": "Cyber security",
      "title": "South African cyber incident and data breach reporting obligations",
      "description": "Who a South African organisation must notify after a cyber incident or data breach, by when, and how: POPIA section 21/22 (Information Regulator via eServices portal, data subjects), FSCA/PA Joint Standards (24-hour material incident notice, 14-day update), with computed deadlines, plus Cybercrimes Act section 54 status (not yet in force).",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/incident-reporting",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/incident-reporting?sector=bank&personal_info=true&role=responsible_party&material=true&aware_at=2026-10-22T08%3A15%2B02%3A00&classified_at=2026-10-22T11%3A00%2B02%3A00&jse_listed=false"
      },
      "mcpTool": "za_incident_reporting_obligations",
      "priceUsd": "0.01",
      "priceAtomic": "10000",
      "params": [
        {
          "name": "sector",
          "type": "string",
          "description": "Organisation type: general (any private business), bank, mutual_bank, insurer, financial_other (other FSCA-regulated institutions covered by Joint Standard 1 of 2023 or 2 of 2024, e.g. market infrastructures, certain FSPs, pension funds), public_body, ecsp (electronic communications service provider). Default general",
          "required": false,
          "example": "bank"
        },
        {
          "name": "personal_info",
          "type": "boolean",
          "description": "Was personal information accessed or acquired by an unauthorised person? Omit if unknown",
          "required": false,
          "example": "true"
        },
        {
          "name": "role",
          "type": "string",
          "description": "responsible_party (default) or operator (you process the data for someone else)",
          "required": false,
          "example": "responsible_party"
        },
        {
          "name": "material",
          "type": "boolean",
          "description": "Financial institutions: has the incident been classified as material? Omit if not yet assessed",
          "required": false,
          "example": "true"
        },
        {
          "name": "aware_at",
          "type": "string",
          "description": "When you discovered the compromise (ISO 8601; no offset = SA time)",
          "required": false,
          "example": "2026-10-22T08:15+02:00"
        },
        {
          "name": "classified_at",
          "type": "string",
          "description": "Financial institutions: when the incident was classified as material (ISO 8601)",
          "required": false,
          "example": "2026-10-22T11:00+02:00"
        },
        {
          "name": "jse_listed",
          "type": "boolean",
          "description": "Is the organisation listed on the JSE? Default false",
          "required": false,
          "example": "false"
        }
      ],
      "exampleResult": {
        "obligations": [
          {
            "notify": "Prudential Authority (PA)",
            "law": "FSCA/PA Joint Standard 2 of 2024",
            "deadline": "within 24 hours of classifying the incident as material",
            "dueAtSAST": "2026-10-23 11:00 SAST"
          },
          {
            "notify": "Information Regulator",
            "law": "POPIA section 22",
            "deadline": "as soon as reasonably possible"
          }
        ],
        "notYetInForce": [
          {
            "law": "Cybercrimes Act 19 of 2020, section 54"
          }
        ]
      }
    },
    {
      "id": "official-domain-check",
      "group": "Cyber security",
      "title": "Is this link really SARS, SASSA or my bank?",
      "description": "Checks a link or domain against the official domains of major South African institutions (SARS, SASSA, Home Affairs, UIF, NSFAS, banks, insurers, telecoms, regulators) and flags impersonation: brand names in unofficial domains, typosquats, look-alike characters, wrong domain endings and newly registered domains.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/official-domain-check",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/official-domain-check?url=https%3A%2F%2Fsars-efiling-refund.com%2Flogin"
      },
      "mcpTool": "za_official_domain_check",
      "priceUsd": "0.005",
      "priceAtomic": "5000",
      "params": [
        {
          "name": "url",
          "type": "string",
          "description": "A link or domain, e.g. https://sars-refund-portal.com/login or capitecbank.co.za",
          "required": true,
          "example": "https://sars-efiling-refund.com/login"
        }
      ],
      "exampleResult": {
        "verdict": "possible-impersonation",
        "risk": "high",
        "signals": [
          {
            "signal": "brand-name",
            "org": "South African Revenue Service (SARS)"
          }
        ],
        "possiblyImpersonating": [
          {
            "organisation": "South African Revenue Service (SARS)",
            "officialDomains": [
              "sars.gov.za",
              "sarsefiling.co.za"
            ]
          }
        ]
      }
    },
    {
      "id": "email-security",
      "group": "Cyber security",
      "title": "Email spoofing protection check, with a South African scorecard",
      "description": "Grades a domain's protection against email spoofing and interception from public DNS: DMARC policy, SPF, DNSSEC, MTA-STS and TLS-RPT, with a score, grade and findings. Or pass sector= for a ranked scorecard of South African banks and insurers, government departments, metros, regulators and state-owned companies, or telecoms.",
      "http": {
        "method": "GET",
        "url": "https://agentstall.nilesh-b54.workers.dev/v1/email-security",
        "exampleUrl": "https://agentstall.nilesh-b54.workers.dev/v1/email-security?domain=sars.gov.za&sector=banks_insurers"
      },
      "mcpTool": "za_email_security",
      "priceUsd": "0.003",
      "priceAtomic": "3000",
      "params": [
        {
          "name": "domain",
          "type": "string",
          "description": "Domain to check, e.g. example.co.za (use this or sector)",
          "required": false,
          "example": "sars.gov.za"
        },
        {
          "name": "sector",
          "type": "string",
          "description": "Scorecard instead of a single domain: banks_insurers, government, metros, regulators_soe, telecoms, all",
          "required": false,
          "example": "banks_insurers"
        }
      ],
      "exampleResult": {
        "domain": "example.co.za",
        "score": 75,
        "grade": "B",
        "spoofing": "harder (lands in spam)",
        "dmarc": {
          "policy": "quarantine"
        },
        "findings": [
          "no MTA-STS: incoming mail encryption can be downgraded"
        ]
      }
    }
  ],
  "guarantees": [
    "Paid requests with invalid input are rejected with HTTP 400 before the payment is verified, so nothing is charged.",
    "Payment is verified first and settled only after the result is computed.",
    "Request parameters (such as ID numbers) are never stored."
  ]
}