What is the difference between APIs that have /sapi/v1 to the corresponding ones with /api/v3

I see some API’s that point to both paths. Perhaps the parameters are slightly difference but I don’t understand the distinction and which one I should be using.

For example (From the swagger):

/sapi/v1/userDataStream:

and

/api/v3/userDataStream

/api/v3/userDataStream:
    post:
      summary: Create a ListenKey (USER_STREAM)
      description: |-
        Start a new user data stream.
        The stream will close after 60 minutes unless a keepalive is sent. If the account has an active `listenKey`, that `listenKey` will be returned and its validity will be extended for 60 minutes.

        Weight: 2
      tags:
        - Stream
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: Listen key
          content:
            application/json:
              schema:
                type: object
                properties:
                  listenKey:
                    type: string
                    example: "pqia91ma19a5s61cv6a81va65sdf19v8a65a1a5s61cv6a81va65sdf19v8a65a1"
                required:
                  - listenKey
    put:
      summary: Ping/Keep-alive a ListenKey (USER_STREAM)
      description: |-
        Keepalive a user data stream to prevent a time out. User data streams will close after 60 minutes. It's recommended to send a ping about every 30 minutes.

        Weight: 2
      tags:
        - Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
    delete:
      summary: Close a ListenKey (USER_STREAM)
      description: |-
        Close out a user data stream.

        Weight: 2
      tags:
        - Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
  /sapi/v1/userDataStream:
    post:
      summary: Create a ListenKey (USER_STREAM)
      description: |-
        Start a new user data stream.
        The stream will close after 60 minutes unless a keepalive is sent. If the account has an active `listenKey`, that `listenKey` will be returned and its validity will be extended for 60 minutes.

        Weight: 1
      tags:
        - Margin Stream
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: Margin listen key
          content:
            application/json:
              schema:
                type: object
                properties:
                  listenKey:
                    type: string
                    example: "pqia91ma19a5s61cv6a81va65sdf19v8a65a1a5s61cv6a81va65sdf19v8a65a1"
                required:
                  - listenKey
    put:
      summary: Ping/Keep-alive a ListenKey (USER_STREAM)
      description: |-
        Keepalive a user data stream to prevent a time out. User data streams will close after 60 minutes. It's recommended to send a ping about every 30 minutes.

        Weight: 1
      tags:
       - Margin Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
    delete:
      summary: Close a ListenKey (USER_STREAM)
      description: |-
        Close out a user data stream.

        Weight: 1
      tags:
        - Margin Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
/sapi/v1/userDataStream:
    post:
      summary: Create a ListenKey (USER_STREAM)
      description: |-
        Start a new user data stream.
        The stream will close after 60 minutes unless a keepalive is sent. If the account has an active `listenKey`, that `listenKey` will be returned and its validity will be extended for 60 minutes.

        Weight: 1
      tags:
        - Margin Stream
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: Margin listen key
          content:
            application/json:
              schema:
                type: object
                properties:
                  listenKey:
                    type: string
                    example: "pqia91ma19a5s61cv6a81va65sdf19v8a65a1a5s61cv6a81va65sdf19v8a65a1"
                required:
                  - listenKey
    put:
      summary: Ping/Keep-alive a ListenKey (USER_STREAM)
      description: |-
        Keepalive a user data stream to prevent a time out. User data streams will close after 60 minutes. It's recommended to send a ping about every 30 minutes.

        Weight: 1
      tags:
       - Margin Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
    delete:
      summary: Close a ListenKey (USER_STREAM)
      description: |-
        Close out a user data stream.

        Weight: 1
      tags:
        - Margin Stream
      parameters:
        - $ref: '#/components/parameters/listenKey'
      security:
        - ApiKeyAuth: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'

/sapi/v1/userDataStream is for Spot margin.

/api/v3/userDataStream is for Spot.

What is the convention here? Where is this documented? I didn’t see anything clear about those things.

Appreciate your help