Hifi Token Swap API

Token Swap endpoints

OpenAPI Specification

hifi-token-swap-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Hifi Account Token Swap API
  version: 2.0.0
  description: API documentation for Hifi
servers:
- url: https://production.hifibridge.com
  description: Production server
- url: https://sandbox.hifibridge.com
  description: Sandbox server
security:
- bearerAuth: []
tags:
- name: Token Swap
  description: Token Swap endpoints
paths:
  /v2/wallets/swaps:
    post:
      summary: Create a swap
      description: 'Create a swap request to exchange one cryptocurrency for another within the same chain.

        '
      tags:
      - Token Swap
      requestBody:
        $ref: '#/components/requestBodies/CreateWalletSwapBody'
      responses:
        '200':
          $ref: '#/components/responses/WalletSwapResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '404':
          $ref: '#/components/responses/NotFoundResponse'
        '500':
          $ref: '#/components/responses/InternalServerErrorResponse'
    get:
      summary: List all swaps
      description: 'Returns a list of swaps associated with a user under your organization. The swaps are returned sorted by creation date, with the most recent swaps appearing first.

        '
      tags:
      - Token Swap
      parameters:
      - $ref: '#/components/parameters/UserIdOptionalParameter'
      - $ref: '#/components/parameters/LimitParameter'
      - $ref: '#/components/parameters/CreatedBeforeParameter'
      - $ref: '#/components/parameters/CreatedAfterParameter'
      responses:
        '200':
          $ref: '#/components/responses/WalletSwapAllRecordsResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '404':
          $ref: '#/components/responses/NotFoundResponse'
        '500':
          $ref: '#/components/responses/InternalServerErrorResponse'
  /v2/wallets/swaps/{swapId}:
    get:
      summary: Retrieve a swap
      description: 'Retrieve details of a specific swap by its ID.

        '
      tags:
      - Token Swap
      parameters:
      - $ref: '#/components/parameters/SwapTransferIDPathParameter'
      responses:
        '200':
          $ref: '#/components/responses/WalletSwapResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '404':
          $ref: '#/components/responses/NotFoundResponse'
        '500':
          $ref: '#/components/responses/InternalServerErrorResponse'
  /v2/wallets/swaps/{swapId}/accept:
    post:
      summary: Accept a swap
      description: 'Accept a swap request to execute the cryptocurrency exchange.

        '
      tags:
      - Token Swap
      parameters:
      - $ref: '#/components/parameters/SwapTransferIDPathParameter'
      responses:
        '200':
          $ref: '#/components/responses/WalletSwapResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedResponse'
        '404':
          $ref: '#/components/responses/NotFoundResponse'
        '500':
          $ref: '#/components/responses/InternalServerErrorResponse'
components:
  schemas:
    WalletSwapDetailsObject:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: dc923cc1-d74b-58f6-9fe4-9e9c6eb8dc37
        requestId:
          type: string
          format: uuid
          example: 1ab3e6e0-4839-4dbe-89c3-b06d9645ae86
        status:
          type: string
          enum:
          - PENDING
          - COMPLETED
          - FAILED
          - CANCELLED
          example: COMPLETED
        createdAt:
          type: string
          format: date-time
          example: '2025-08-20T03:55:29.437108+00:00'
        updatedAt:
          type: string
          format: date-time
          example: '2025-08-20T04:08:10.837+00:00'
        source:
          $ref: '#/components/schemas/WalletSwapSourceObject'
        destination:
          $ref: '#/components/schemas/WalletSwapDestinationObject'
        error:
          type: string
          nullable: true
          example: null
        errorDetails:
          type: string
          nullable: true
          example: null
        quoteInformation:
          $ref: '#/components/schemas/WalletSwapQuoteInformationObject'
        billingInformation:
          $ref: '#/components/schemas/WalletSwapBillingInformationObject'
    WalletSwapAmountObject:
      type: object
      properties:
        amount:
          type: string
          example: '10'
        currency:
          type: string
          example: usdc
    WalletSwapFeeObject:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 2ca381ec-9498-52f5-9a27-d0e392b2626b
        amount:
          type: number
          example: 0.01
        currency:
          type: string
          example: USD
        type:
          type: string
          enum:
          - EXCHANGE_FEE
          - GAS_FEE
          example: EXCHANGE_FEE
        timing:
          type: string
          enum:
          - ON_INVOICE
          - ON_TRANSACTION
          example: ON_INVOICE
    WalletSwapDestinationObject:
      type: object
      properties:
        currency:
          type: string
          example: usdt
        userId:
          type: string
          format: uuid
          example: 05179f69-1988-4b46-a847-dd4eea0984d6
        externalWalletId:
          type: string
          format: uuid
          nullable: true
          example: null
        amount:
          type: number
          nullable: true
          example: null
        chain:
          type: string
          example: POLYGON
        walletAddress:
          type: string
          pattern: ^0x[a-fA-F0-9]{40}$
          example: '0xe5727a4B1d93A26D6A7Adfaae145EFa41ED7f204'
    InternalServerError:
      type: object
      properties:
        error:
          type: string
          example: Unexpected error happened
    WalletSwapBillingInformationObject:
      type: object
      properties:
        fees:
          type: array
          items:
            $ref: '#/components/schemas/WalletSwapFeeObject'
    WalletSwapQuoteInformationObject:
      type: object
      properties:
        sendGross:
          $ref: '#/components/schemas/WalletSwapAmountObject'
        sendNet:
          $ref: '#/components/schemas/WalletSwapAmountObject'
        receiveGross:
          $ref: '#/components/schemas/WalletSwapAmountObject'
        receiveNet:
          $ref: '#/components/schemas/WalletSwapAmountObject'
        rate:
          type: string
          example: '1'
        expiresAt:
          type: string
          format: date-time
          example: '2025-08-20T03:55:59.539+00:00'
    WalletSwapAllRecordsObject:
      type: object
      properties:
        count:
          type: integer
          example: 1
        data:
          type: array
          items:
            $ref: '#/components/schemas/WalletSwapObject'
        nextCursor:
          type: string
          format: date-time
          example: '2025-08-20T04:08:10.837+00:00'
    WalletSwapObject:
      type: object
      properties:
        transferType:
          type: string
          example: WALLET.SWAP
        transferDetails:
          $ref: '#/components/schemas/WalletSwapDetailsObject'
    Unauthorized:
      type: object
      properties:
        error:
          type: string
          example: Not authorized
    CreateWalletSwap:
      type: object
      required:
      - requestId
      - source
      - destination
      properties:
        requestId:
          type: string
          format: uuid
          description: Unique identifier for the swap request (recommend using uuid v4)
          example: 1ab3e6e0-4839-4dbe-89c3-b06d9645ae86
        source:
          type: object
          description: Source wallet information for the swap
          required:
          - userId
          - chain
          - currency
          properties:
            userId:
              type: string
              format: uuid
              description: User ID of the source wallet owner
              example: 05179f69-1988-4b46-a847-dd4eea0984d6
            chain:
              type: string
              enum:
              - POLYGON
              - ETHEREUM
              - SOLANA
              description: Blockchain network for the source wallet
              example: POLYGON
            currency:
              type: string
              enum:
              - usdc
              - usdt
              description: Source cryptocurrency to swap from
              example: usdt
            amount:
              type: string
              description: Amount to swap (either source.amount or destination.amount must be provided)
              example: '10000'
        destination:
          type: object
          description: Destination wallet information for the swap
          required:
          - chain
          - currency
          properties:
            userId:
              type: string
              format: uuid
              description: User ID of the destination wallet owner
              example: 05179f69-1988-4b46-a847-dd4eea0984d6
            externalWalletId:
              type: string
              format: uuid
              description: External wallet ID (Exclude with userId)
              example: 64fc4e9d-4839-4384-b4a0-0376af2c9b2e
            walletAddress:
              type: string
              pattern: ^0x[a-fA-F0-9]{40}$
              description: Wallet address (Exclude with userId)
              example: '0xE9cfBf1D690565579D823264170eE357f80e9A34'
            chain:
              type: string
              enum:
              - POLYGON
              - ETHEREUM
              - SOLANA
              description: Blockchain network for the destination wallet
              example: POLYGON
            currency:
              type: string
              enum:
              - usdc
              - usdt
              - usdg
              description: Destination cryptocurrency to swap to
              example: usdc
            amount:
              type: string
              description: Amount to receive (either source.amount or destination.amount must be provided)
              example: '10000'
    WalletSwapSourceObject:
      type: object
      properties:
        currency:
          type: string
          example: usdc
        amount:
          type: number
          example: 10
        chain:
          type: string
          example: POLYGON
        userId:
          type: string
          format: uuid
          example: 05179f69-1988-4b46-a847-dd4eea0984d6
  parameters:
    LimitParameter:
      name: limit
      in: query
      schema:
        type: string
        minimum: 1
        maximum: 100
      description: default to 10, maximum to 100
      required: false
    SwapTransferIDPathParameter:
      name: swapId
      in: path
      schema:
        type: string
      description: Swap transfer record ID.
      required: true
    UserIdOptionalParameter:
      name: userId
      in: query
      schema:
        type: string
      description: The user ID.
      required: false
    CreatedBeforeParameter:
      name: createdBefore
      in: query
      schema:
        type: string
        format: date
      description: 'ISO format: YYYY-MM-DD'
      required: false
    CreatedAfterParameter:
      name: createdAfter
      in: query
      schema:
        type: string
        format: date
      description: 'ISO format: YYYY-MM-DD'
      required: false
  responses:
    WalletSwapResponse:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WalletSwapObject'
    InternalServerErrorResponse:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/InternalServerError'
    NotFoundResponse:
      description: Resource not found
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: string
                enum:
                - error
              error:
                type: object
                properties:
                  code:
                    type: string
                  message:
                    type: string
    UnauthorizedResponse:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Unauthorized'
    WalletSwapAllRecordsResponse:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WalletSwapAllRecordsObject'
  requestBodies:
    CreateWalletSwapBody:
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/CreateWalletSwap'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT