{
  "components": {
    "responses": {
      "Error": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error"
      }
    },
    "schemas": {
      "Envelope": {
        "properties": {
          "data": {
            "description": "The result: an object, or an array for list endpoints."
          },
          "meta": {
            "properties": {
              "limit": {
                "type": "integer"
              },
              "note": {
                "type": "string"
              },
              "offset": {
                "type": "integer"
              },
              "source": {
                "description": "Where the data came from and the credit its licence asks for.",
                "properties": {
                  "attribution": {
                    "type": "string"
                  },
                  "licence": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "retrieved": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  },
                  "version": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "total": {
                "type": "integer"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "data",
          "meta"
        ],
        "type": "object"
      },
      "Error": {
        "properties": {
          "error": {
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            },
            "type": "object"
          }
        },
        "type": "object"
      }
    }
  },
  "externalDocs": {
    "description": "Documentation, guides and AI setup",
    "url": "https://api.dharun.dev/docs"
  },
  "info": {
    "contact": {
      "email": "me@dharun.dev",
      "name": "Dharun Ashokkumar",
      "url": "https://github.com/dharunashokkumar/api.dharun.dev/issues"
    },
    "description": "Free JSON APIs for Indian data: pincodes, IFSC and banks, GSTIN and PAN checks, holidays and working days, RTO codes, company logos, UPI QR codes, number to words in lakh and crore, and more. No API key, no sign-up, open CORS, an MCP server for AI assistants. Open source under AGPL-3.0.",
    "license": {
      "identifier": "AGPL-3.0-only",
      "name": "AGPL-3.0 (server code); data under each source's licence, named in meta.source"
    },
    "title": "India API: Free, open source APIs for Indian data",
    "version": "1.1.17"
  },
  "openapi": "3.1.0",
  "paths": {
    "/v1/airports": {
      "get": {
        "description": "By name, city or code; airports with scheduled flights and larger airports first.",
        "operationId": "airports",
        "parameters": [
          {
            "description": "Name, city or code, 2 or more characters.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Two-letter ISO country code, such as IN.",
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Kind of airfield.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "enum": [
                "large_airport",
                "medium_airport",
                "small_airport",
                "heliport",
                "seaplane_base"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search airports",
        "tags": [
          "Airports"
        ]
      }
    },
    "/v1/airports/{code}": {
      "get": {
        "description": "",
        "operationId": "airports_by_code",
        "parameters": [
          {
            "description": "IATA code (MAA) or ICAO code (VOMM).",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Airport for a code",
        "tags": [
          "Airports"
        ]
      }
    },
    "/v1/banks": {
      "get": {
        "description": "Finds banks by name or code, largest branch network first.",
        "operationId": "banks",
        "parameters": [
          {
            "description": "Text to find in the bank name or code.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search banks",
        "tags": [
          "IFSC and banks"
        ]
      }
    },
    "/v1/banks/{code}": {
      "get": {
        "description": "",
        "operationId": "banks_by_code",
        "parameters": [
          {
            "description": "Four-letter bank code.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Bank for a four-letter code",
        "tags": [
          "IFSC and banks"
        ]
      }
    },
    "/v1/barcode/{type}": {
      "get": {
        "description": "Linear barcodes (code128, code39, code93, ean13, ean8, itf, codabar) and 2D codes (datamatrix, pdf417, aztec). Linear codes are sized with scale and height, 2D codes with size. No human-readable text is printed under the bars.",
        "operationId": "barcode_by_type",
        "parameters": [
          {
            "description": "Kind of barcode.",
            "in": "path",
            "name": "type",
            "required": true,
            "schema": {
              "enum": [
                "code128",
                "code39",
                "code93",
                "ean13",
                "ean8",
                "itf",
                "codabar",
                "datamatrix",
                "pdf417",
                "aztec"
              ],
              "type": "string"
            }
          },
          {
            "description": "Text to encode (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Linear codes: pixels per bar module, 1 to 10. Default 2.",
            "in": "query",
            "name": "scale",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Linear codes: bar height in pixels, 10 to 600. Default 80.",
            "in": "query",
            "name": "height",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "2D codes: width in pixels to stay within, 32 to 2048. Default 256.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Light border, in modules, 0 to 16. The default depends on the code.",
            "in": "query",
            "name": "margin",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Dark colour, hex such as 000000. Default black.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Light colour, hex, or transparent. Default white.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Barcode",
        "tags": [
          "QR codes and barcodes"
        ]
      },
      "post": {
        "description": "Linear barcodes (code128, code39, code93, ean13, ean8, itf, codabar) and 2D codes (datamatrix, pdf417, aztec). Linear codes are sized with scale and height, 2D codes with size. No human-readable text is printed under the bars.",
        "operationId": "barcode_by_type_post",
        "parameters": [
          {
            "description": "Kind of barcode.",
            "in": "path",
            "name": "type",
            "required": true,
            "schema": {
              "enum": [
                "code128",
                "code39",
                "code93",
                "ean13",
                "ean8",
                "itf",
                "codabar",
                "datamatrix",
                "pdf417",
                "aztec"
              ],
              "type": "string"
            }
          },
          {
            "description": "Text to encode (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Linear codes: pixels per bar module, 1 to 10. Default 2.",
            "in": "query",
            "name": "scale",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Linear codes: bar height in pixels, 10 to 600. Default 80.",
            "in": "query",
            "name": "height",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "2D codes: width in pixels to stay within, 32 to 2048. Default 256.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Light border, in modules, 0 to 16. The default depends on the code.",
            "in": "query",
            "name": "margin",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Dark colour, hex such as 000000. Default black.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Light colour, hex, or transparent. Default white.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text to encode.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Barcode",
        "tags": [
          "QR codes and barcodes"
        ]
      }
    },
    "/v1/code-image": {
      "get": {
        "description": "A code snippet as a window with syntax colouring. Up to 150 lines of 140 characters. PNGs are drawn at twice the pixel density for sharp text (very large ones at single). The language is guessed from the title's file extension or the code when not given, and reported in the X-Code-Language header.",
        "operationId": "code-image",
        "parameters": [
          {
            "description": "The code (or POST it).",
            "in": "query",
            "name": "code",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Language name or file extension, such as go, python, js, sql.",
            "in": "query",
            "name": "language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "File name shown in the title bar.",
            "in": "query",
            "name": "title",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Default dark.",
            "in": "query",
            "name": "theme",
            "required": false,
            "schema": {
              "enum": [
                "dark",
                "light"
              ],
              "type": "string"
            }
          },
          {
            "description": "Show line numbers.",
            "in": "query",
            "name": "lineNumbers",
            "required": false,
            "schema": {
              "enum": [
                "true"
              ],
              "type": "string"
            }
          },
          {
            "description": "Default png.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "png",
                "svg"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Code as an image",
        "tags": [
          "Generated images"
        ]
      },
      "post": {
        "description": "A code snippet as a window with syntax colouring. Up to 150 lines of 140 characters. PNGs are drawn at twice the pixel density for sharp text (very large ones at single). The language is guessed from the title's file extension or the code when not given, and reported in the X-Code-Language header.",
        "operationId": "code-image_post",
        "parameters": [
          {
            "description": "The code (or POST it).",
            "in": "query",
            "name": "code",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Language name or file extension, such as go, python, js, sql.",
            "in": "query",
            "name": "language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "File name shown in the title bar.",
            "in": "query",
            "name": "title",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Default dark.",
            "in": "query",
            "name": "theme",
            "required": false,
            "schema": {
              "enum": [
                "dark",
                "light"
              ],
              "type": "string"
            }
          },
          {
            "description": "Show line numbers.",
            "in": "query",
            "name": "lineNumbers",
            "required": false,
            "schema": {
              "enum": [
                "true"
              ],
              "type": "string"
            }
          },
          {
            "description": "Default png.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "png",
                "svg"
              ],
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The code.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Code as an image",
        "tags": [
          "Generated images"
        ]
      }
    },
    "/v1/companies": {
      "get": {
        "description": "Searches ticker, company name, sector, industry, ISIN and index names. Best match first.",
        "operationId": "companies",
        "parameters": [
          {
            "description": "Search text.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Limit to one exchange.",
            "in": "query",
            "name": "exchange",
            "required": false,
            "schema": {
              "enum": [
                "nse",
                "bse"
              ],
              "type": "string"
            }
          },
          {
            "description": "Exact sector name.",
            "in": "query",
            "name": "sector",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Index name, for example Nifty 50.",
            "in": "query",
            "name": "index",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search listed companies",
        "tags": [
          "Company logos"
        ]
      }
    },
    "/v1/companies/{symbol}": {
      "get": {
        "description": "Name, sector, industry, ISIN, market capitalisation, index memberships and logo URLs.",
        "operationId": "companies_by_symbol",
        "parameters": [
          {
            "description": "Ticker, exchange-qualified ticker, Yahoo symbol or ISIN.",
            "in": "path",
            "name": "symbol",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Force an exchange.",
            "in": "query",
            "name": "exchange",
            "required": false,
            "schema": {
              "enum": [
                "nse",
                "bse"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Details of a listed company",
        "tags": [
          "Company logos"
        ]
      }
    },
    "/v1/constituency": {
      "get": {
        "description": "",
        "operationId": "constituency",
        "parameters": [
          {
            "description": "Indian pincode (the average position of its post offices).",
            "in": "query",
            "name": "pincode",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Latitude, if no pincode.",
            "in": "query",
            "name": "lat",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Longitude, if no pincode.",
            "in": "query",
            "name": "lng",
            "required": false,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Constituencies of a place",
        "tags": [
          "Constituencies"
        ]
      }
    },
    "/v1/dns/{name}": {
      "get": {
        "description": "",
        "operationId": "dns_by_name",
        "parameters": [
          {
            "description": "Domain name (Indian-script names are accepted), or an IP address for PTR.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Record type. Default A.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "enum": [
                "A",
                "AAAA",
                "CNAME",
                "MX",
                "NS",
                "TXT",
                "CAA",
                "SOA",
                "SRV",
                "PTR"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Look up DNS records",
        "tags": [
          "DNS check"
        ]
      }
    },
    "/v1/email/{address}": {
      "get": {
        "description": "",
        "operationId": "email_by_address",
        "parameters": [
          {
            "description": "The email address.",
            "in": "path",
            "name": "address",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Check an email address",
        "tags": [
          "Email checks"
        ]
      }
    },
    "/v1/fake/{kind}": {
      "get": {
        "description": "people have a name, gender, birth date, email (on example domains), phone, PAN and address; companies a name, PAN, GSTIN, email, phone and address.",
        "operationId": "fake_by_kind",
        "parameters": [
          {
            "description": "What to generate.",
            "in": "path",
            "name": "kind",
            "required": true,
            "schema": {
              "enum": [
                "people",
                "companies",
                "addresses"
              ],
              "type": "string"
            }
          },
          {
            "description": "How many, 1 to 100. Default 10.",
            "in": "query",
            "name": "count",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The same seed gives the same records. Without one, each request differs.",
            "in": "query",
            "name": "seed",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Generate fake records",
        "tags": [
          "Fake test data"
        ]
      }
    },
    "/v1/holidays/{year}": {
      "get": {
        "description": "",
        "operationId": "holidays_by_year",
        "parameters": [
          {
            "description": "Four-digit year.",
            "in": "path",
            "name": "year",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Kind of holiday. clearing days are ones on which the market trades but nothing settles.",
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "enum": [
                "bank",
                "central_gazetted",
                "central_restricted",
                "market",
                "clearing"
              ],
              "type": "string"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Month number, 1 to 12.",
            "in": "query",
            "name": "month",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Holidays in a year",
        "tags": [
          "Holidays"
        ]
      }
    },
    "/v1/hsn": {
      "get": {
        "description": "Every word of q must appear in the description; digits search by code prefix. Broader codes come first.",
        "operationId": "hsn",
        "parameters": [
          {
            "description": "Words of the description, or the start of a code.",
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "hsn for goods, sac for services.",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "enum": [
                "hsn",
                "sac"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search codes",
        "tags": [
          "HSN and SAC codes"
        ]
      }
    },
    "/v1/hsn/{code}": {
      "get": {
        "description": "",
        "operationId": "hsn_by_code",
        "parameters": [
          {
            "description": "2 to 8 digits; spaces and dots are ignored. SAC codes start with 99.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "A code, its parents and children",
        "tags": [
          "HSN and SAC codes"
        ]
      }
    },
    "/v1/ifsc": {
      "get": {
        "description": "Lists branches of one bank, filtered by state, city or text in the branch name or address.",
        "operationId": "ifsc",
        "parameters": [
          {
            "description": "Four-letter bank code, for example SBIN.",
            "in": "query",
            "name": "bank",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Text to find in the branch name, address or city.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Exact city name.",
            "in": "query",
            "name": "city",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search a bank's branches",
        "tags": [
          "IFSC and banks"
        ]
      }
    },
    "/v1/ifsc/{code}": {
      "get": {
        "description": "",
        "operationId": "ifsc_by_code",
        "parameters": [
          {
            "description": "11-character IFSC.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Branch for an IFSC",
        "tags": [
          "IFSC and banks"
        ]
      }
    },
    "/v1/ip": {
      "get": {
        "description": "",
        "operationId": "ip",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Location of your own address",
        "tags": [
          "IP address location"
        ]
      }
    },
    "/v1/ip/{address}": {
      "get": {
        "description": "",
        "operationId": "ip_by_address",
        "parameters": [
          {
            "description": "IPv4 or IPv6 address.",
            "in": "path",
            "name": "address",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Location of an IP address",
        "tags": [
          "IP address location"
        ]
      }
    },
    "/v1/logos/{symbol}": {
      "get": {
        "description": "Returns the image itself, ready for an \u003cimg\u003e tag. Unknown symbols return 404 unless fallback=monogram is set.",
        "operationId": "logos_by_symbol",
        "parameters": [
          {
            "description": "Ticker, exchange-qualified ticker, Yahoo symbol or ISIN. A .svg or .png suffix selects the format.",
            "in": "path",
            "name": "symbol",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "PNG width and height in pixels, 16 to 512. Default 128.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Return an initials tile instead of 404 for unknown symbols.",
            "in": "query",
            "name": "fallback",
            "required": false,
            "schema": {
              "enum": [
                "monogram"
              ],
              "type": "string"
            }
          },
          {
            "description": "Force an exchange.",
            "in": "query",
            "name": "exchange",
            "required": false,
            "schema": {
              "enum": [
                "nse",
                "bse"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Logo image for a listed company",
        "tags": [
          "Company logos"
        ]
      }
    },
    "/v1/market/status": {
      "get": {
        "description": "NSE equities session at a moment: pre_open, open, closing or closed, the reason it is closed, and when it next opens. Without at, the current moment.",
        "operationId": "market_status",
        "parameters": [
          {
            "description": "Moment with its offset, RFC 3339, for example 2026-10-13T10:30:00+05:30.",
            "in": "query",
            "name": "at",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Is the stock market open",
        "tags": [
          "Working days"
        ]
      }
    },
    "/v1/mtr/{host}": {
      "get": {
        "description": "Lists hops up to the one where the host answered, or one past the last router that answered. A hop with 100% loss is common: many routers forward traffic without answering probes. otherAddresses lists further routers seen at the same hop, where traffic is balanced over several paths.",
        "operationId": "mtr_by_host",
        "parameters": [
          {
            "description": "Domain name or public IP address.",
            "in": "path",
            "name": "host",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Probes per hop, 1 to 10. Default 5; a trace takes about a second per round.",
            "in": "query",
            "name": "rounds",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "IP version for a domain name. Default 4.",
            "in": "query",
            "name": "v",
            "required": false,
            "schema": {
              "enum": [
                "4",
                "6"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Trace the route to a host",
        "tags": [
          "Traceroute from India"
        ]
      }
    },
    "/v1/mutual-funds": {
      "get": {
        "description": "Every word of q must appear in the scheme name, in any order. Only active schemes unless all=true.",
        "operationId": "mutual-funds",
        "parameters": [
          {
            "description": "Words of the scheme name.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Part of the fund house name, such as hdfc.",
            "in": "query",
            "name": "fundHouse",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Part of the SEBI category, such as Small Cap.",
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Plan.",
            "in": "query",
            "name": "plan",
            "required": false,
            "schema": {
              "enum": [
                "direct",
                "regular"
              ],
              "type": "string"
            }
          },
          {
            "description": "Option.",
            "in": "query",
            "name": "option",
            "required": false,
            "schema": {
              "enum": [
                "growth",
                "idcw",
                "bonus"
              ],
              "type": "string"
            }
          },
          {
            "description": "Include wound-up and matured schemes.",
            "in": "query",
            "name": "all",
            "required": false,
            "schema": {
              "enum": [
                "true"
              ],
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search schemes",
        "tags": [
          "Mutual fund NAVs"
        ]
      }
    },
    "/v1/mutual-funds/fund-houses": {
      "get": {
        "description": "",
        "operationId": "mutual-funds_fund-houses",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Fund houses",
        "tags": [
          "Mutual fund NAVs"
        ]
      }
    },
    "/v1/mutual-funds/{code}": {
      "get": {
        "description": "",
        "operationId": "mutual-funds_by_code",
        "parameters": [
          {
            "description": "AMFI scheme code, or the scheme's growth or reinvestment ISIN.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "A scheme and its NAV",
        "tags": [
          "Mutual fund NAVs"
        ]
      }
    },
    "/v1/og-image": {
      "get": {
        "description": "A 1200 by 630 card for og:image and twitter:image: a title (set as large as fits in three lines, cut with an ellipsis beyond that), an optional subtitle of up to two lines, and a site name and tag along the bottom. The same URL always gives the same picture, so it can be used directly in a meta tag.",
        "operationId": "og-image",
        "parameters": [
          {
            "description": "Up to 200 characters, in any script.",
            "in": "query",
            "name": "title",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Up to 300 characters; two lines are shown.",
            "in": "query",
            "name": "subtitle",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Site name, bottom left.",
            "in": "query",
            "name": "site",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Short label, bottom right.",
            "in": "query",
            "name": "tag",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Default dark.",
            "in": "query",
            "name": "theme",
            "required": false,
            "schema": {
              "enum": [
                "dark",
                "light"
              ],
              "type": "string"
            }
          },
          {
            "description": "Background colour, hex.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Title colour, hex.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Accent colour, hex.",
            "in": "query",
            "name": "accent",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Default png.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "png",
                "svg"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Social preview image",
        "tags": [
          "Generated images"
        ]
      }
    },
    "/v1/panchang/{date}": {
      "get": {
        "description": "For a pincode, a latitude and longitude, or (by default) New Delhi. Times are in the time zone asked for.",
        "operationId": "panchang_by_date",
        "parameters": [
          {
            "description": "YYYY-MM-DD, 1900 to 2100, or today.",
            "in": "path",
            "name": "date",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Indian pincode of the place.",
            "in": "query",
            "name": "pincode",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Latitude, if no pincode.",
            "in": "query",
            "name": "lat",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Longitude, if no pincode.",
            "in": "query",
            "name": "lng",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "IANA time zone for the times. Default Asia/Kolkata.",
            "in": "query",
            "name": "tz",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Panchang for a date",
        "tags": [
          "Panchang"
        ]
      }
    },
    "/v1/phone/{number}": {
      "get": {
        "description": "",
        "operationId": "phone_by_number",
        "parameters": [
          {
            "description": "The number, with or without +91, 91 or 0; spaces and dashes are ignored.",
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Check a phone number",
        "tags": [
          "Phone numbers"
        ]
      }
    },
    "/v1/pincode": {
      "get": {
        "description": "Find post offices by the start of their name, by the start of a pincode, or list a district.",
        "operationId": "pincode",
        "parameters": [
          {
            "description": "Start of a post office name (2+ characters) or start of a pincode.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Exact district name.",
            "in": "query",
            "name": "district",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search post offices",
        "tags": [
          "Pincodes"
        ]
      }
    },
    "/v1/pincode/near": {
      "get": {
        "description": "Post offices within a radius of a latitude and longitude, nearest first, with the distance. Positions come from the Department of Posts and some are approximate.",
        "operationId": "pincode_near",
        "parameters": [
          {
            "description": "Latitude in decimal degrees.",
            "in": "query",
            "name": "lat",
            "required": true,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Longitude in decimal degrees.",
            "in": "query",
            "name": "lng",
            "required": true,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Kilometres, 1 to 50. Default 5.",
            "in": "query",
            "name": "radius",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results, 1 to 100. Default 10.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Post offices near a point",
        "tags": [
          "Pincodes"
        ]
      }
    },
    "/v1/pincode/{pincode}": {
      "get": {
        "description": "Returns the district and state of the pincode and every post office that uses it.",
        "operationId": "pincode_by_pincode",
        "parameters": [
          {
            "description": "Six-digit pincode.",
            "in": "path",
            "name": "pincode",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Post offices for a pincode",
        "tags": [
          "Pincodes"
        ]
      }
    },
    "/v1/propagation": {
      "get": {
        "description": "Rules behind the band ratings: 80m-40m: fair by day (D-layer absorption), good at night. 30m-20m: good by day; at night good from a solar flux of 120, fair from 80, else poor. 17m-15m: by day good from a solar flux of 110, fair from 80, else poor; at night fair from 150, else poor. 12m-10m: by day good from a solar flux of 150, fair from 110, else poor; at night fair from 200, else poor. A K-index of 4 lowers every night rating one step; 5 or more lowers every rating one step, and 7 or more two. An M-class X-ray flux lowers the day rating of 80m-40m and 30m-20m one step; X-class makes every day rating poor. Readings NOAA did not publish at the last fetch are null.",
        "operationId": "propagation",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Space weather and band conditions",
        "tags": [
          "HF propagation"
        ]
      }
    },
    "/v1/qr": {
      "get": {
        "description": "Returns the image itself. Text up to about 2,900 bytes at error correction L.",
        "operationId": "qr",
        "parameters": [
          {
            "description": "Text to encode (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Error correction: how much damage the code survives. Default M.",
            "in": "query",
            "name": "ecc",
            "required": false,
            "schema": {
              "enum": [
                "L",
                "M",
                "Q",
                "H"
              ],
              "type": "string"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "2D codes: width in pixels to stay within, 32 to 2048. Default 256.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Light border (quiet zone), in modules, 0 to 16. Default 4.",
            "in": "query",
            "name": "margin",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Dark colour, hex such as 000000. Default black.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Light colour, hex, or transparent. Default white.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "QR code for any text",
        "tags": [
          "QR codes and barcodes"
        ]
      },
      "post": {
        "description": "Returns the image itself. Text up to about 2,900 bytes at error correction L.",
        "operationId": "qr_post",
        "parameters": [
          {
            "description": "Text to encode (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Error correction: how much damage the code survives. Default M.",
            "in": "query",
            "name": "ecc",
            "required": false,
            "schema": {
              "enum": [
                "L",
                "M",
                "Q",
                "H"
              ],
              "type": "string"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "2D codes: width in pixels to stay within, 32 to 2048. Default 256.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Light border (quiet zone), in modules, 0 to 16. Default 4.",
            "in": "query",
            "name": "margin",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Dark colour, hex such as 000000. Default black.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Light colour, hex, or transparent. Default white.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text to encode.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "QR code for any text",
        "tags": [
          "QR codes and barcodes"
        ]
      }
    },
    "/v1/regex": {
      "get": {
        "description": "An invalid pattern answers 422 with code invalid_pattern and the engine's message; a JavaScript pattern that runs out of time answers 422 with code timeout. A group that took no part in a match has a null text, which is different from an empty one.",
        "operationId": "regex",
        "parameters": [
          {
            "description": "The regular expression, without slashes. Up to 4096 bytes.",
            "in": "query",
            "name": "pattern",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The text to test it on (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "js (default): JavaScript syntax, with lookaround and backreferences. re2: Go's syntax, linear time.",
            "in": "query",
            "name": "flavor",
            "required": false,
            "schema": {
              "enum": [
                "js",
                "re2"
              ],
              "type": "string"
            }
          },
          {
            "description": "Any of i (ignore case), m (^ and $ at line breaks), s (. matches line breaks). Every match is always listed, so g is not needed.",
            "in": "query",
            "name": "flags",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Replace every match with this: $1, $\u003cname\u003e, $\u0026 and $$ in js; ${1}, ${name} and $$ in re2.",
            "in": "query",
            "name": "replace",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Matches listed, 1 to 1000. Default 100; count goes on to the end of the text.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Test a regular expression",
        "tags": [
          "Regex tester"
        ]
      },
      "post": {
        "description": "An invalid pattern answers 422 with code invalid_pattern and the engine's message; a JavaScript pattern that runs out of time answers 422 with code timeout. A group that took no part in a match has a null text, which is different from an empty one.",
        "operationId": "regex_post",
        "parameters": [
          {
            "description": "The regular expression, without slashes. Up to 4096 bytes.",
            "in": "query",
            "name": "pattern",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The text to test it on (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "js (default): JavaScript syntax, with lookaround and backreferences. re2: Go's syntax, linear time.",
            "in": "query",
            "name": "flavor",
            "required": false,
            "schema": {
              "enum": [
                "js",
                "re2"
              ],
              "type": "string"
            }
          },
          {
            "description": "Any of i (ignore case), m (^ and $ at line breaks), s (. matches line breaks). Every match is always listed, so g is not needed.",
            "in": "query",
            "name": "flags",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Replace every match with this: $1, $\u003cname\u003e, $\u0026 and $$ in js; ${1}, ${name} and $$ in re2.",
            "in": "query",
            "name": "replace",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Matches listed, 1 to 1000. Default 100; count goes on to the end of the text.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text to test the pattern on (pattern and options in the query), or JSON {\"pattern\": ..., \"text\": ...} with the options beside them.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Test a regular expression",
        "tags": [
          "Regex tester"
        ]
      }
    },
    "/v1/rto": {
      "get": {
        "description": "",
        "operationId": "rto",
        "parameters": [
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Text to find in the office name or jurisdiction.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "List or search RTO codes",
        "tags": [
          "RTO codes"
        ]
      }
    },
    "/v1/rto/{code}": {
      "get": {
        "description": "",
        "operationId": "rto_by_code",
        "parameters": [
          {
            "description": "RTO code (TN-28, TN28) or a registration number (TN28AB1234).",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Office for an RTO code",
        "tags": [
          "RTO codes"
        ]
      }
    },
    "/v1/sat-pass": {
      "get": {
        "description": "Passes from now for the next days, soonest first. Directions are compass points and azimuths in degrees from true north; elevations are degrees above the horizon. A satellite can be named by catalogue number, by name, by the designation in its name's brackets (SO-50, AO-7), or as ISS, CSS or QO-100.",
        "operationId": "sat-pass",
        "parameters": [
          {
            "description": "Catalogue number or name. Default ISS (25544).",
            "in": "query",
            "name": "sat",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Indian pincode of the observer.",
            "in": "query",
            "name": "pincode",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Latitude, if no pincode. Default New Delhi.",
            "in": "query",
            "name": "lat",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Longitude, if no pincode.",
            "in": "query",
            "name": "lng",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "How far ahead, 1 to 10. Default 3.",
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Lowest peak elevation listed, in degrees. Default 10; 0 lists every pass.",
            "in": "query",
            "name": "minElevation",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "true lists only passes that can be seen with the eye.",
            "in": "query",
            "name": "visible",
            "required": false,
            "schema": {
              "enum": [
                "true",
                "false"
              ],
              "type": "string"
            }
          },
          {
            "description": "IANA time zone for the times. Default Asia/Kolkata.",
            "in": "query",
            "name": "tz",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Passes over a place",
        "tags": [
          "Satellite passes"
        ]
      }
    },
    "/v1/satellites": {
      "get": {
        "description": "Every tracked satellite with its catalogue number, groups, orbital period and inclination.",
        "operationId": "satellites",
        "parameters": [
          {
            "description": "Part of a name, or a catalogue number.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Limit to one group.",
            "in": "query",
            "name": "group",
            "required": false,
            "schema": {
              "enum": [
                "stations",
                "amateur"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Tracked satellites",
        "tags": [
          "Satellite passes"
        ]
      }
    },
    "/v1/satellites/{id}": {
      "get": {
        "description": "The point on Earth below the satellite at the moment of the request, its altitude and speed, whether it is in sunlight, and how old its orbit elements are.",
        "operationId": "satellites_by_id",
        "parameters": [
          {
            "description": "Catalogue number or name.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Where a satellite is now",
        "tags": [
          "Satellite passes"
        ]
      }
    },
    "/v1/states": {
      "get": {
        "description": "",
        "operationId": "states",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "All states and union territories",
        "tags": [
          "States"
        ]
      }
    },
    "/v1/states/{code}": {
      "get": {
        "description": "",
        "operationId": "states_by_code",
        "parameters": [
          {
            "description": "State code, vehicle prefix or name.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "One state",
        "tags": [
          "States"
        ]
      }
    },
    "/v1/stations": {
      "get": {
        "description": "By name (an exact code comes first, then names starting with the text), state or zone.",
        "operationId": "stations",
        "parameters": [
          {
            "description": "Part of a station name, or a code.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "State code or name, for example TN or Tamil Nadu.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Zone code, such as SR. See /v1/stations/zones.",
            "in": "query",
            "name": "zone",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search stations",
        "tags": [
          "Railway stations"
        ]
      }
    },
    "/v1/stations/zones": {
      "get": {
        "description": "",
        "operationId": "stations_zones",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Railway zones",
        "tags": [
          "Railway stations"
        ]
      }
    },
    "/v1/stations/{code}": {
      "get": {
        "description": "",
        "operationId": "stations_by_code",
        "parameters": [
          {
            "description": "Station code, such as MAS or NDLS.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Station for a code",
        "tags": [
          "Railway stations"
        ]
      }
    },
    "/v1/sun-moon/{date}": {
      "get": {
        "description": "For a pincode, a latitude and longitude, or (by default) New Delhi. A twilight time is null where the sun does not sink that far, and moonrise or moonset is null on the day each month the moon does not rise or set. The phase names a principal phase (new moon, first quarter, full moon, last quarter) for the whole date it falls on.",
        "operationId": "sun-moon_by_date",
        "parameters": [
          {
            "description": "YYYY-MM-DD, 1900 to 2100, or today.",
            "in": "path",
            "name": "date",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Indian pincode of the place.",
            "in": "query",
            "name": "pincode",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Latitude, -66 to 66, if no pincode.",
            "in": "query",
            "name": "lat",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "Longitude, if no pincode.",
            "in": "query",
            "name": "lng",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "description": "IANA time zone for the times. Default Asia/Kolkata.",
            "in": "query",
            "name": "tz",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Sun and moon for a date",
        "tags": [
          "Sun and moon"
        ]
      }
    },
    "/v1/tamil-font/convert": {
      "get": {
        "description": "Give the text as it looks without its font (the Windows-1252 characters), or POST the raw bytes as application/octet-stream. Converting to an 8-bit encoding answers with the same kind of text, and with the bytes in base64. Bytes the encoding does not assign are counted in undefined; characters it has no code for are listed in unmapped.",
        "operationId": "tamil-font_convert",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "What the text is in.",
            "in": "query",
            "name": "from",
            "required": true,
            "schema": {
              "enum": [
                "unicode",
                "tscii"
              ],
              "type": "string"
            }
          },
          {
            "description": "What to convert to. Default unicode; one of from and to must be unicode.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "enum": [
                "unicode",
                "tscii"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Convert Tamil text",
        "tags": [
          "Tamil legacy encodings"
        ]
      },
      "post": {
        "description": "Give the text as it looks without its font (the Windows-1252 characters), or POST the raw bytes as application/octet-stream. Converting to an 8-bit encoding answers with the same kind of text, and with the bytes in base64. Bytes the encoding does not assign are counted in undefined; characters it has no code for are listed in unmapped.",
        "operationId": "tamil-font_convert_post",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "What the text is in.",
            "in": "query",
            "name": "from",
            "required": true,
            "schema": {
              "enum": [
                "unicode",
                "tscii"
              ],
              "type": "string"
            }
          },
          {
            "description": "What to convert to. Default unicode; one of from and to must be unicode.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "enum": [
                "unicode",
                "tscii"
              ],
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text, or with Content-Type application/octet-stream the raw bytes.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Convert Tamil text",
        "tags": [
          "Tamil legacy encodings"
        ]
      }
    },
    "/v1/tamil-font/encodings": {
      "get": {
        "description": "The encodings that can be converted, with fonts that use each, to help recognise what a text is in.",
        "operationId": "tamil-font_encodings",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Encodings offered",
        "tags": [
          "Tamil legacy encodings"
        ]
      }
    },
    "/v1/text/chunk": {
      "get": {
        "description": "Splits at headings, paragraphs, sentences and words, in that order of preference, so chunks stay readable. Markdown chunks never cross a heading and carry their heading path. Each chunk is an exact slice of the input with its character offsets.",
        "operationId": "text_chunk",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Largest chunk in characters, overlap included, 100 to 20000. Default 1000.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Characters repeated from the previous chunk, up to half the size. Default a tenth of the size.",
            "in": "query",
            "name": "overlap",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Default auto: Markdown if the text has headings or code fences.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "auto",
                "markdown",
                "text"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Split a document into chunks",
        "tags": [
          "Text tools"
        ]
      },
      "post": {
        "description": "Splits at headings, paragraphs, sentences and words, in that order of preference, so chunks stay readable. Markdown chunks never cross a heading and carry their heading path. Each chunk is an exact slice of the input with its character offsets.",
        "operationId": "text_chunk_post",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Largest chunk in characters, overlap included, 100 to 20000. Default 1000.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Characters repeated from the previous chunk, up to half the size. Default a tenth of the size.",
            "in": "query",
            "name": "overlap",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Default auto: Markdown if the text has headings or code fences.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "auto",
                "markdown",
                "text"
              ],
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The document, plain text or Markdown.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Split a document into chunks",
        "tags": [
          "Text tools"
        ]
      }
    },
    "/v1/text/language": {
      "get": {
        "description": "Language and script, with a confidence. Covers about 80 languages including Hindi, Bengali, Marathi, Gujarati, Punjabi, Tamil, Telugu, Kannada, Malayalam, Odia and Urdu. Romanised Indian text (Hinglish, Tanglish) is flagged as such.",
        "operationId": "text_language",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Detect the language",
        "tags": [
          "Text tools"
        ]
      },
      "post": {
        "description": "Language and script, with a confidence. Covers about 80 languages including Hindi, Bengali, Marathi, Gujarati, Punjabi, Tamil, Telugu, Kannada, Malayalam, Odia and Urdu. Romanised Indian text (Hinglish, Tanglish) is flagged as such.",
        "operationId": "text_language_post",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Detect the language",
        "tags": [
          "Text tools"
        ]
      }
    },
    "/v1/text/redact": {
      "get": {
        "description": "Masks Aadhaar numbers (Verhoeff-checked), PAN, GSTIN (checksum-checked), card numbers (Luhn-checked), Indian mobile numbers, email addresses, UPI IDs, vehicle numbers, voter IDs, passport numbers and IP addresses. Returns where each was found, never the values. Names and addresses are not detected.",
        "operationId": "text_redact",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Comma-separated kinds to redact; default all. Kinds: email, upi, gstin, card, aadhaar, pan, phone, vehicle, voter_id, passport, ip.",
            "in": "query",
            "name": "types",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "label replaces with [PAN]; partial keeps the last digits, as on a bank statement. Default label.",
            "in": "query",
            "name": "style",
            "required": false,
            "schema": {
              "enum": [
                "label",
                "partial"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Redact Indian personal identifiers",
        "tags": [
          "Text tools"
        ]
      },
      "post": {
        "description": "Masks Aadhaar numbers (Verhoeff-checked), PAN, GSTIN (checksum-checked), card numbers (Luhn-checked), Indian mobile numbers, email addresses, UPI IDs, vehicle numbers, voter IDs, passport numbers and IP addresses. Returns where each was found, never the values. Names and addresses are not detected.",
        "operationId": "text_redact_post",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Comma-separated kinds to redact; default all. Kinds: email, upi, gstin, card, aadhaar, pan, phone, vehicle, voter_id, passport, ip.",
            "in": "query",
            "name": "types",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "label replaces with [PAN]; partial keeps the last digits, as on a bank statement. Default label.",
            "in": "query",
            "name": "style",
            "required": false,
            "schema": {
              "enum": [
                "label",
                "partial"
              ],
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text to redact.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Redact Indian personal identifiers",
        "tags": [
          "Text tools"
        ]
      }
    },
    "/v1/text/tokens": {
      "get": {
        "description": "Exact token counts with OpenAI tokenizers, by encoding or model name. Other vendors do not publish their tokenizers, so their counts are not offered.",
        "operationId": "text_tokens",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Model name, such as gpt-4o or gpt-4, or an encoding: o200k_base, cl100k_base, p50k_base. Default o200k_base.",
            "in": "query",
            "name": "model",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Count tokens",
        "tags": [
          "Text tools"
        ]
      },
      "post": {
        "description": "Exact token counts with OpenAI tokenizers, by encoding or model name. Other vendors do not publish their tokenizers, so their counts are not offered.",
        "operationId": "text_tokens_post",
        "parameters": [
          {
            "description": "The text (or POST it).",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Model name, such as gpt-4o or gpt-4, or an encoding: o200k_base, cl100k_base, p50k_base. Default o200k_base.",
            "in": "query",
            "name": "model",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text to count.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Count tokens",
        "tags": [
          "Text tools"
        ]
      }
    },
    "/v1/thirukkural": {
      "get": {
        "description": "Finds kurals containing the text, in Tamil, the transliteration or either translation; or lists a chapter or a paal.",
        "operationId": "thirukkural",
        "parameters": [
          {
            "description": "Text to find, 2 or more characters, Tamil or English.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Chapter (அதிகாரம்), 1 to 133.",
            "in": "query",
            "name": "chapter",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "1 virtue (அறத்துப்பால்), 2 wealth (பொருட்பால்), 3 love (காமத்துப்பால்).",
            "in": "query",
            "name": "paal",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results per page, 1 to 100.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Results to skip.",
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Search kurals",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/thirukkural/chapters": {
      "get": {
        "description": "",
        "operationId": "thirukkural_chapters",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "All 133 chapters",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/thirukkural/chapters/{number}": {
      "get": {
        "description": "",
        "operationId": "thirukkural_chapters_by_number",
        "parameters": [
          {
            "description": "1 to 133.",
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "One chapter",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/thirukkural/random": {
      "get": {
        "description": "",
        "operationId": "thirukkural_random",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "A random kural",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/thirukkural/today": {
      "get": {
        "description": "The same kural for everyone on a day in India, a different one the next day.",
        "operationId": "thirukkural_today",
        "parameters": [
          {
            "description": "A date, YYYY-MM-DD. Default today in India.",
            "in": "query",
            "name": "date",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Kural of the day",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/thirukkural/{number}": {
      "get": {
        "description": "",
        "operationId": "thirukkural_by_number",
        "parameters": [
          {
            "description": "1 to 1330.",
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "A kural by number",
        "tags": [
          "Thirukkural"
        ]
      }
    },
    "/v1/transliterate": {
      "get": {
        "description": "",
        "operationId": "transliterate",
        "parameters": [
          {
            "description": "The text (or POST it). Letters of other scripts pass through unchanged.",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A script (devanagari, bengali, gurmukhi, gujarati, odia, tamil, telugu, kannada, malayalam), a language code such as ta or hi, or iso15919, iast, ascii.",
            "in": "query",
            "name": "to",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "auto (default: the script of the text), a script, or iso15919 or iast for romanised input.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Transliterate text",
        "tags": [
          "Transliteration"
        ]
      },
      "post": {
        "description": "",
        "operationId": "transliterate_post",
        "parameters": [
          {
            "description": "The text (or POST it). Letters of other scripts pass through unchanged.",
            "in": "query",
            "name": "text",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A script (devanagari, bengali, gurmukhi, gujarati, odia, tamil, telugu, kannada, malayalam), a language code such as ta or hi, or iso15919, iast, ascii.",
            "in": "query",
            "name": "to",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "auto (default: the script of the text), a script, or iso15919 or iast for romanised input.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "text": {
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              }
            }
          },
          "description": "The text.",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Transliterate text",
        "tags": [
          "Transliteration"
        ]
      }
    },
    "/v1/upi-qr": {
      "get": {
        "description": "A QR code any UPI app can scan to pay, built to NPCI's upi://pay link format. format=json returns the link instead of the image. Nothing is checked with a bank.",
        "operationId": "upi-qr",
        "parameters": [
          {
            "description": "Payee UPI ID, such as shop@okaxis.",
            "in": "query",
            "name": "pa",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Payee name shown in the app.",
            "in": "query",
            "name": "pn",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Amount in rupees, up to two decimals. Leave out to let the payer type it.",
            "in": "query",
            "name": "am",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Note shown with the payment, up to 80 characters.",
            "in": "query",
            "name": "tn",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Your reference for the transaction.",
            "in": "query",
            "name": "tr",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Merchant category code, four digits.",
            "in": "query",
            "name": "mc",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Image format. Default svg.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "enum": [
                "svg",
                "png"
              ],
              "type": "string"
            }
          },
          {
            "description": "2D codes: width in pixels to stay within, 32 to 2048. Default 256.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Light border (quiet zone), in modules, 0 to 16. Default 4.",
            "in": "query",
            "name": "margin",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Dark colour, hex such as 000000. Default black.",
            "in": "query",
            "name": "fg",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Light colour, hex, or transparent. Default white.",
            "in": "query",
            "name": "bg",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {},
              "image/svg+xml": {}
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "UPI payment QR code",
        "tags": [
          "QR codes and barcodes"
        ]
      }
    },
    "/v1/validate/{kind}/{value}": {
      "get": {
        "description": "",
        "operationId": "validate_by_kind_by_value",
        "parameters": [
          {
            "description": "Which identifier.",
            "in": "path",
            "name": "kind",
            "required": true,
            "schema": {
              "enum": [
                "gstin",
                "pan",
                "ifsc"
              ],
              "type": "string"
            }
          },
          {
            "description": "The identifier to check.",
            "in": "path",
            "name": "value",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Check an identifier's format",
        "tags": [
          "Format checks"
        ]
      }
    },
    "/v1/words/{number}": {
      "get": {
        "description": "",
        "operationId": "words_by_number",
        "parameters": [
          {
            "description": "The number. Commas, spaces and underscores are ignored.",
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Language. Default en.",
            "in": "query",
            "name": "lang",
            "required": false,
            "schema": {
              "enum": [
                "en",
                "hi",
                "ta"
              ],
              "type": "string"
            }
          },
          {
            "description": "currency gives rupees and paise. Default number.",
            "in": "query",
            "name": "style",
            "required": false,
            "schema": {
              "enum": [
                "number",
                "currency"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Spell out a number",
        "tags": [
          "Number to words"
        ]
      }
    },
    "/v1/working-days": {
      "get": {
        "description": "Counts working days from one date to another, both included, and lists each day off with its reason. At most 366 days.",
        "operationId": "working-days",
        "parameters": [
          {
            "description": "First date, YYYY-MM-DD.",
            "in": "query",
            "name": "from",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Last date, YYYY-MM-DD.",
            "in": "query",
            "name": "to",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "bank (default; needs state), market (NSE trading), settlement (NSE clearing) or central (central government offices).",
            "in": "query",
            "name": "calendar",
            "required": false,
            "schema": {
              "enum": [
                "bank",
                "market",
                "settlement",
                "central"
              ],
              "type": "string"
            }
          },
          {
            "description": "State code or name. Required for the bank calendar.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Bank calendar only. One Reserve Bank office's list, such as Srinagar or Kochi, for a state with several offices (Maharashtra, Uttar Pradesh, Jammu and Kashmir, Kerala). Without it, a day off at any of the state's offices counts.",
            "in": "query",
            "name": "office",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Count working days between two dates",
        "tags": [
          "Working days"
        ]
      }
    },
    "/v1/working-days/{date}": {
      "get": {
        "description": "Whether the date is a working day and why not, the previous and next working days, and with add=N the date N working days later (negative for earlier). A T+1 settlement date is calendar=settlement\u0026add=1.",
        "operationId": "working-days_by_date",
        "parameters": [
          {
            "description": "Date, YYYY-MM-DD.",
            "in": "path",
            "name": "date",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "bank (default; needs state), market (NSE trading), settlement (NSE clearing) or central (central government offices).",
            "in": "query",
            "name": "calendar",
            "required": false,
            "schema": {
              "enum": [
                "bank",
                "market",
                "settlement",
                "central"
              ],
              "type": "string"
            }
          },
          {
            "description": "State code or name. Required for the bank calendar.",
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Bank calendar only. One Reserve Bank office's list, such as Srinagar or Kochi, for a state with several offices (Maharashtra, Uttar Pradesh, Jammu and Kashmir, Kerala). Without it, a day off at any of the state's offices counts.",
            "in": "query",
            "name": "office",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Working days to add, -366 to 366.",
            "in": "query",
            "name": "add",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            },
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        },
        "summary": "Is a date a working day",
        "tags": [
          "Working days"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://api.dharun.dev"
    }
  ]
}