openapi: 3.0.3
info:
  title: INDstocks API Suite
  description: |
    The INDstocks API Suite v1 — trading, market data, portfolio, and Smart Order (GTT)
    endpoints for the INDstocks (INDmoney) broker platform.

    ## Base URL
    Production: `https://api.indstocks.com`

    ## Authentication
    Every protected endpoint requires an `access_token` sent as a raw value (no `Bearer` prefix)
    in the `Authorization` header: `Authorization: <access_token>`. See
    [Getting Your Access Token](https://api-docs.indstocks.com/Users/#getting-your-access-token).

    ## Rate Limiting
    See the authoritative table at
    [API Conventions](https://api-docs.indstocks.com/conventions/#rate-limiting) — limits vary by
    endpoint category (Order / Data & Quote / Non-Trading) and are not a single flat number.

    ## Errors
    See the [Error Bucket](https://api-docs.indstocks.com/errors/) for the full list of
    `error_type` values, HTTP statuses, and RMS order-rejection messages.
  version: "1.0.0"
  contact:
    name: INDstocks API Support
    email: api-support@indstocks.com
    url: https://api-docs.indstocks.com
  license:
    name: INDstocks API License
    url: https://indstocks.com/api-license
  termsOfService: https://indstocks.com/terms-of-service

servers:
  - url: https://api.indstocks.com
    description: Production server

security:
  - AccessTokenAuth: []

tags:
  - name: User & Account
    description: Profile, funds, and access-token generation
  - name: Instruments
    description: Instrument master (scrip) CSV download
  - name: Market Data
    description: Real-time quotes, market depth, and historical candles
  - name: Orders
    description: Standard order placement, modification, cancellation, and history
  - name: Smart Orders
    description: Multi-leg GTT orders with stop-loss and target legs
  - name: Portfolio
    description: Holdings and open positions
  - name: Margin
    description: Pre-trade margin and charges calculation
  - name: Utility
    description: Option chain and Greeks — not yet live

paths:
  /user/profile:
    get:
      tags: [User & Account]
      summary: Get user profile
      description: Returns the authenticated user's profile. Useful to verify a token is valid.
      responses:
        '200':
          description: Profile retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProfileResponse'
        '401':
          description: Token invalid/expired (see error shape caveat in the Error Bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /funds:
    get:
      tags: [User & Account]
      summary: Get funds
      description: Available and utilized funds, balances, and P&L.
      responses:
        '200':
          description: Funds retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FundsResponse'

  /generate/token:
    post:
      tags: [User & Account]
      summary: Generate access token via TOTP (provisional)
      description: |
        **Provisional — not yet confirmed against a live deployment.** Generates an
        `access_token` using an account MPIN plus a TOTP code, as an alternative to the
        dashboard token-generation flow. Uses a distinct auth model: `x-api-key` header instead
        of `Authorization`. See
        [Getting Your Access Token — Method 2](https://api-docs.indstocks.com/Users/#method-2-totp-based-token-generation)
        for the current caveats — success/error response shapes are not yet confirmed.

        ## Limits

        - **1 token per 60 seconds.** Call this once per session and cache the result; do not
          call it before each request.
        - **Only the newest token is valid.** Each success invalidates the token from the
          previous call, so two processes generating independently will keep killing each
          other's token. Have one process generate and share it.
        - **Lockout:** 5 wrong `totp` codes in a rolling 15 minutes locks generation for 15
          minutes; 3 lockouts within an hour locks it for 1 hour. A lockout blocks new tokens
          only — an already-issued token keeps working until its 24-hour expiry.
        - TOTP enrolment, reset, and disable are **web-only**; there is no API for them.

        See
        [TOTP limits and lockouts](https://api-docs.indstocks.com/Users/#totp-limits-and-lockouts).
      security:
        - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [mpin, totp]
              properties:
                mpin:
                  type: string
                  description: Account MPIN
                  example: "9828"
                totp:
                  type: string
                  description: Current 6-digit TOTP code
                  example: "610446"
      responses:
        '200':
          description: "Token generated (response shape not yet confirmed)"

  /market/instruments:
    get:
      tags: [Instruments]
      summary: Get instrument list (CSV)
      description: Downloads the scrip/instrument master as a CSV file for a market segment.
      parameters:
        - in: query
          name: source
          required: true
          schema:
            type: string
            enum: [equity, fno, index]
          example: fno
      responses:
        '200':
          description: CSV file of instruments
          content:
            text/csv:
              schema:
                type: string
        '400':
          description: Source not present or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /market/quotes/full:
    get:
      tags: [Market Data]
      summary: Get full market quotes
      description: Full snapshot (OHLC, day change, volume, circuit limits, market depth) for up to 1000 instruments.
      parameters:
        - $ref: '#/components/parameters/ScripCodes'
      responses:
        '200':
          description: Quotes retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FullQuoteResponse'

  /market/quotes/ltp:
    get:
      tags: [Market Data]
      summary: Get LTP quote
      description: Lightweight endpoint returning only the Last Traded Price per instrument.
      parameters:
        - $ref: '#/components/parameters/ScripCodes'
      responses:
        '200':
          description: LTP retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LtpQuoteResponse'

  /market/quotes/mkt:
    get:
      tags: [Market Data]
      summary: Get market depth
      description: 5-level bid/ask ladder (market depth) for one or more instruments.
      parameters:
        - $ref: '#/components/parameters/ScripCodes'
      responses:
        '200':
          description: Market depth retrieved

  /market/historical/{interval}:
    get:
      tags: [Market Data]
      summary: Get historical OHLCV data
      description: |
        Response uses a `success` boolean (not `status`) and `data` keyed per scrip code, with
        each candle as an object `{ts, o, h, l, c, v}` — not a positional array.
      parameters:
        - in: path
          name: interval
          required: true
          schema:
            type: string
            enum: [1minute, 2minute, 3minute, 4minute, 5minute, 10minute, 15minute, 30minute, 60minute, 120minute, 180minute, 240minute, 1day, 1week, 1month]
        - in: query
          name: scrip-codes
          required: true
          schema:
            type: string
          example: NSE_3045
        - in: query
          name: start_time
          required: true
          schema:
            type: integer
            format: int64
          description: Unix epoch milliseconds (IST), inclusive
        - in: query
          name: end_time
          required: true
          schema:
            type: integer
            format: int64
          description: Unix epoch milliseconds (IST), exclusive
      responses:
        '200':
          description: Historical data retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HistoricalDataResponse'

  /order:
    post:
      tags: [Orders]
      summary: Place order
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '200':
          description: Order placed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderActionResponse'
        '400':
          description: Validation or RMS rejection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    get:
      tags: [Orders]
      summary: Get order details
      description: Sends `order_id`/`segment` as a JSON body on a GET request.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [order_id, segment]
              properties:
                order_id:
                  type: string
                segment:
                  type: string
                  enum: [EQUITY, DERIVATIVE]
      responses:
        '200':
          description: Order details retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderDetails'

  /order/modify:
    post:
      tags: [Orders]
      summary: Modify pending order
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderModifyRequest'
      responses:
        '200':
          description: Order modified
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderActionResponse'

  /order/cancel:
    post:
      tags: [Orders]
      summary: Cancel pending order
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [order_id, segment]
              properties:
                order_id:
                  type: string
                segment:
                  type: string
                  enum: [EQUITY, DERIVATIVE]
      responses:
        '200':
          description: Order cancelled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderActionResponse'

  /order-book:
    get:
      tags: [Orders]
      summary: Get order book
      description: All orders placed during the current trading day.
      responses:
        '200':
          description: Order book retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderBookResponse'

  /order/trades:
    get:
      tags: [Orders]
      summary: Get trades for an order
      description: |
        Sends `order_id`/`segment` as a JSON body on a GET request. Response uses the same
        shape as [Get Trade Book](#/Orders/get_trade_book) scoped to a single order.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [order_id, segment]
              properties:
                order_id:
                  type: string
                segment:
                  type: string
                  enum: [EQUITY, DERIVATIVE]
      responses:
        '200':
          description: Trades retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeListResponse'

  /trade-book:
    get:
      operationId: get_trade_book
      tags: [Orders]
      summary: Get trade book
      description: All executed trades (fills) for a segment during the current trading day.
      parameters:
        - in: query
          name: segment
          required: true
          schema:
            type: string
            enum: [EQUITY, DERIVATIVE]
      responses:
        '200':
          description: Trade book retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeListResponse'

  /smart/order:
    post:
      tags: [Smart Orders]
      summary: Place smart order (GTT)
      description: Places a multi-leg GTT order. Creates a parent order plus a linked child `GTT-` order for the stop-loss/target legs.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SmartOrderRequest'
      responses:
        '200':
          description: Smart order placed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SmartOrderActionResponse'

  /smart/order/modify:
    post:
      tags: [Smart Orders]
      summary: Modify smart order
      description: Modify one leg (parent or child) of a pending smart order by its own `order_id`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SmartOrderModifyRequest'
      responses:
        '200':
          description: Smart order modified
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderActionResponse'

  /smart/order/cancel:
    post:
      tags: [Smart Orders]
      summary: Cancel smart order
      description: Cancel one leg (parent or child) of a pending smart order by its own `order_id`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [order_id, segment]
              properties:
                order_id:
                  type: string
                segment:
                  type: string
                  enum: [EQUITY, DERIVATIVE]
      responses:
        '200':
          description: Smart order cancelled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderActionResponse'

  /portfolio/holdings:
    get:
      tags: [Portfolio]
      summary: Get holdings
      description: Equity holdings (Demat account). No live valuation/P&L fields — combine with Market Quotes for that.
      responses:
        '200':
          description: Holdings retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HoldingsResponse'

  /portfolio/positions:
    get:
      tags: [Portfolio]
      summary: Get positions
      description: |
        Flat array of open positions (not a `net_positions`/`day_positions` wrapper). Note:
        `segment`/`product` query values here are **lowercase**, unlike the uppercase values
        used by Orders/Margin.
      parameters:
        - in: query
          name: segment
          required: true
          schema:
            type: string
            enum: [equity, derivative]
        - in: query
          name: product
          required: true
          schema:
            type: string
            enum: [cnc, intraday, margin]
      responses:
        '200':
          description: Positions retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PositionsResponse'

  /margin:
    get:
      tags: [Margin]
      summary: Calculate margin
      description: Sends the request as a JSON body on a GET request. Calculates margin requirement and charges breakdown before placing an order.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MarginRequest'
      responses:
        '200':
          description: Margin calculated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarginResponse'

  /option-chain:
    get:
      tags: [Utility]
      summary: "Get option chain (coming soon)"
      description: "Not yet live — see https://api-docs.indstocks.com/utility/"
      responses:
        '200':
          description: Coming soon

  /option-chain-symbols:
    get:
      tags: [Utility]
      summary: "Get available expiries (coming soon)"
      description: "Not yet live — see https://api-docs.indstocks.com/utility/"
      responses:
        '200':
          description: Coming soon

  /greeks:
    post:
      tags: [Utility]
      summary: "Get option Greeks (coming soon)"
      description: "Not yet live — see https://api-docs.indstocks.com/utility/"
      responses:
        '200':
          description: Coming soon

components:
  parameters:
    ScripCodes:
      in: query
      name: scrip-codes
      required: true
      schema:
        type: string
      description: Comma-separated `SEGMENT_TOKEN` instrument identifiers, e.g. `NSE_3045,NFO_51011`
      example: NSE_3045

  securitySchemes:
    AccessTokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: Raw access token — no `Bearer` prefix. Example header value is the token itself.
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: Used only by `/generate/token` (provisional) — distinct from AccessTokenAuth.

  schemas:
    UserProfileResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            user_id: { type: string }
            email: { type: string }
            first_name: { type: string }
            last_name: { type: string }
            demat_id: { type: string }
            is_nse_onboarded: { type: boolean }
            is_bse_onboarded: { type: boolean }
            is_nse_fno_onboarded: { type: boolean }
            is_bse_fno_onboarded: { type: boolean }
            ucc: { type: string }
            is_ddpi_active: { type: boolean }

    FundsResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            sod_balance: { type: number }
            pledge_received: { type: number }
            pledge_remained: { type: number }
            detailed_avl_balance:
              type: object
              properties:
                option_sell: { type: number }
                future: { type: number }
                option_buy: { type: number }
                comm_option_buy: { type: number }
                eq_mis: { type: number }
                eq_cnc: { type: number }
                eq_mtf: { type: number }
            withdrawal_balance: { type: number }
            funds_added: { type: number }
            funds_withdrawn: { type: number }
            realized_pnl: { type: number }
            unrealized_pnl: { type: number }
            brokerage: { type: number }
            eq_charges: { type: number }
            fno_charges: { type: number }

    FullQuoteResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          additionalProperties:
            type: object
            properties:
              live_price: { type: number }
              day_change: { type: number }
              day_change_percentage: { type: number }
              day_low: { type: number }
              day_high: { type: number }
              day_open: { type: number }
              prev_close: { type: number }
              52week_high: { type: number }
              52week_low: { type: number }
              upper_circuit: { type: number }
              lower_circuit: { type: number }
              volume: { type: integer }
              market_depth: { type: object }

    LtpQuoteResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          additionalProperties:
            type: object
            properties:
              live_price: { type: number }

    HistoricalDataResponse:
      type: object
      properties:
        success: { type: boolean, example: true }
        data:
          type: object
          additionalProperties:
            type: object
            properties:
              candles:
                type: array
                items:
                  type: object
                  properties:
                    ts: { type: integer, description: "Unix epoch seconds" }
                    o: { type: number }
                    h: { type: number }
                    l: { type: number }
                    c: { type: number }
                    v: { type: integer }

    OrderRequest:
      type: object
      required: [txn_type, exchange, segment, product, order_type, validity, security_id, qty, algo_id]
      properties:
        txn_type: { type: string, enum: [BUY, SELL] }
        exchange: { type: string, enum: [NSE, BSE] }
        segment: { type: string, enum: [EQUITY, DERIVATIVE] }
        product: { type: string, enum: [CNC, INTRADAY, MARGIN] }
        order_type:
          type: string
          enum: [LIMIT, MARKET]
          description: "MARKET is auto-converted to LIMIT at the live price before reaching the exchange."
        validity: { type: string, enum: [DAY, IOC] }
        security_id: { type: string }
        qty: { type: integer, minimum: 1 }
        algo_id:
          type: string
          description: '"99999" for NSE, "9999999999999999" for BSE'
        limit_price: { type: number, description: "Required if order_type is LIMIT" }
        is_amo: { type: boolean, default: false }

    OrderModifyRequest:
      type: object
      required: [order_id, segment, qty, limit_price]
      properties:
        order_id: { type: string }
        segment: { type: string, enum: [EQUITY, DERIVATIVE] }
        qty: { type: integer, minimum: 1 }
        limit_price: { type: number }

    OrderActionResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            order_id: { type: string, example: "EQ-93586788" }
            order_status:
              type: string
              enum: [QUEUED, O-PENDING, SL-PENDING, PROCESSING, ABORTED, INITIATED, SUCCESS, CANCELLED, MODIFIED, PENDING, EXPIRED, FAILED, "PARTIALLY FILLED", "PARTIALLY FILLED - CANCELLED", "PARTIALLY FILLED - EXPIRED"]

    OrderDetails:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            created_at: { type: string, format: date-time }
            updated_at: { type: string, format: date-time }
            user_id: { type: string }
            security_id: { type: string }
            isin: { type: string }
            name: { type: string }
            id: { type: string }
            exch_order_id: { type: string }
            txn_type: { type: string }
            exchange: { type: string }
            segment: { type: string }
            product: { type: string }
            order_type: { type: string }
            validity: { type: string }
            traded_qty: { type: integer }
            requested_qty: { type: integer }
            requested_price: { type: string }
            traded_price: { type: string }
            sl_trigger_price: { type: string }
            sl_limit_price: { type: string }
            tgt_trigger_price: { type: string }
            tgt_limit_price: { type: string }
            status: { type: string }
            extra_info: { type: string }

    OrderBookResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: array
          items:
            $ref: '#/components/schemas/OrderDetails/properties/data'

    TradeListResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: array
          items:
            type: object
            properties:
              fill_id: { type: integer }
              exch_order_id: { type: string }
              quantity: { type: integer }
              price: { type: number }
              trade_date: { type: string, format: date-time }

    SmartOrderRequest:
      type: object
      required: [txn_type, exchange, segment, product, order_type, validity, security_id, qty, algo_id]
      properties:
        txn_type: { type: string, enum: [BUY, SELL] }
        exchange: { type: string, enum: [NSE] }
        segment: { type: string, enum: [EQUITY, DERIVATIVE] }
        product: { type: string, enum: [CNC, INTRADAY, MARGIN] }
        order_type: { type: string, enum: [LIMIT, MARKET, TRIGGER] }
        validity: { type: string, enum: [DAY] }
        security_id: { type: string }
        qty: { type: integer, minimum: 1 }
        algo_id: { type: string }
        limit_price: { type: number, description: "Required if order_type is LIMIT" }
        trigger_price: { type: number, description: "Required if order_type is TRIGGER" }
        trigger_limit_price: { type: number }
        sl_trigger_price: { type: number, description: "Requires sl_limit_price" }
        sl_limit_price: { type: number }
        tgt_trigger_price: { type: number, description: "Requires tgt_limit_price" }
        tgt_limit_price: { type: number }

    SmartOrderModifyRequest:
      type: object
      required: [order_id, segment, algo_id]
      properties:
        order_id: { type: string }
        segment: { type: string, enum: [EQUITY, DERIVATIVE] }
        algo_id: { type: string }
        order_type:
          type: string
          enum: [LIMIT, MARKET, TRIGGER]
          description: Must match the existing order's type
        qty: { type: integer }
        limit_price: { type: number }
        trigger_price: { type: number }
        trigger_limit_price: { type: number }
        sl_trigger_price: { type: number }
        sl_limit_price: { type: number }
        tgt_trigger_price: { type: number }
        tgt_limit_price: { type: number }

    SmartOrderActionResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            order_data:
              type: array
              items:
                type: object
                properties:
                  order_id: { type: string }
                  order_status: { type: string }
                  child_order_details:
                    type: object
                    properties:
                      order_id: { type: string }
                      order_status: { type: string }

    HoldingsResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: array
          items:
            type: object
            properties:
              security_id: { type: string }
              symbol: { type: string }
              isin: { type: string }
              total_qty: { type: number }
              used_qty: { type: number }
              avg_price: { type: number }
              t1_qty: { type: number }
              t1_avg_price: { type: number }
              dp_qty: { type: number }
              dp_avg_price: { type: number }

    PositionsResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: array
          items:
            type: object
            properties:
              position_id: { type: string }
              security_id: { type: string }
              symbol: { type: string }
              segment: { type: string }
              product: { type: string }
              exchange: { type: string }
              isin: { type: string }
              drv_instrument: { type: string }
              drv_expiry_date: { type: string }
              drv_option_type: { type: string }
              drv_strike_price: { type: number }
              net_qty: { type: number }
              avg_price: { type: number }
              buy_qty: { type: number }
              buy_avg: { type: number }
              sell_qty: { type: number }
              sell_avg: { type: number }
              realized_profit: { type: number }
              day_buy_qty: { type: number, nullable: true }
              day_buy_val: { type: number, nullable: true }
              day_sell_qty: { type: number, nullable: true }
              day_sell_val: { type: number, nullable: true }
              cf_buy_qty: { type: number, nullable: true }
              cf_buy_val: { type: number, nullable: true }
              cf_sell_qty: { type: number, nullable: true }
              cf_sell_val: { type: number, nullable: true }

    MarginRequest:
      type: object
      required: [segment, exchange, securityID, txnType, quantity, price, product]
      properties:
        segment: { type: string, enum: [EQUITY, DERIVATIVE] }
        exchange: { type: string, enum: [NSE, BSE] }
        securityID: { type: string }
        txnType: { type: string, enum: [BUY, SELL] }
        quantity: { type: string }
        price: { type: string }
        product: { type: string, enum: [MARGIN, INTRADAY, CNC] }

    MarginResponse:
      type: object
      properties:
        status: { type: string, example: success }
        data:
          type: object
          properties:
            total_margin: { type: number }
            span_margin: { type: number }
            hedge_benefit: { type: number }
            exposure_margin: { type: number }
            available_balance: { type: number }
            var_margin: { type: number }
            insufficient_balance: { type: number }
            delivery_margin: { type: number }
            brokerage: { type: number }
            charges:
              type: object
              properties:
                stt: { type: number }
                exchange_charges: { type: number }
                stamp_duty: { type: number }
                sebi_turn_over_charges: { type: number }
                brokerage: { type: number }
                gst: { type: number }
                IPFTCharges: { type: number }
                total_charges: { type: number }

    ErrorResponse:
      type: object
      description: |
        Primary error shape. A second, undocumented-by-design shape also occurs on some
        endpoints: `{"message": "...", "success": false}` with no `status`/`error_type` — see
        the Error Bucket for details.
      properties:
        status: { type: string, example: error }
        message: { type: string }
        error_type:
          type: string
          enum: [InputException, TokenException, UserException, NotFoundException, MethodNotAllowedException, DataException, NetworkException, GeneralException, ServiceUnavailableException, GatewayTimeoutException, OrderException]

externalDocs:
  description: Complete INDstocks API Documentation
  url: https://api-docs.indstocks.com
