> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blend.money/llms.txt
> Use this file to discover all available pages before exploring further.

# Record transaction hashes and settle the session

> Accepts hashes for the quoted chains and moves a LOCKED session directly to SETTLED. The endpoint records submission but does not verify receipts. Repeating the same hash and chain pairs is idempotent.



## OpenAPI

````yaml /openapi/extern-fe.json post /extern/fe/intent/{intentId}/submit
openapi: 3.1.0
info:
  title: 'Blend business-api: extern fe'
  version: 1.0.0
  description: >-
    Frontend integration surface. Every request requires X-Publishable-Key.
    Challenge starts SIWE authentication and verify issues the session; sign-out
    and all other operations also require its bearer JWT.
servers:
  - url: https://{host}
    variables:
      host:
        default: api.portal.blend.money
security: []
paths:
  /extern/fe/intent/{intentId}/submit:
    post:
      tags:
        - fe
      summary: Record transaction hashes and settle the session
      description: >-
        Accepts hashes for the quoted chains and moves a LOCKED session directly
        to SETTLED. The endpoint records submission but does not verify
        receipts. Repeating the same hash and chain pairs is idempotent.
      operationId: fe_submitIntent
      parameters:
        - name: intentId
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/Uuid'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txHashes:
                  type: array
                  items:
                    type: object
                    properties:
                      hash:
                        $ref: '#/components/schemas/TransactionHash'
                      chainId:
                        $ref: '#/components/schemas/ChainIdInput'
                    required:
                      - hash
                      - chainId
                    additionalProperties: false
                  minItems: 1
                  maxItems: 20
              required:
                - txHashes
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    const: success
                  data:
                    $ref: '#/components/schemas/SessionResponse'
                required:
                  - status
                  - data
                additionalProperties: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '410':
          $ref: '#/components/responses/Gone'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/Unavailable'
      security:
        - PublishableKey: []
          SiweBearer: []
components:
  schemas:
    Uuid:
      type: string
      format: uuid
      description: RFC 4122 UUID
      examples:
        - 8e9f4d67-51ad-49aa-a502-2f569aaf7399
    TransactionHash:
      type: string
      pattern: ^0x[0-9a-fA-F]{64}$
      description: 32-byte transaction hash
    ChainIdInput:
      oneOf:
        - $ref: '#/components/schemas/EvmChainId'
        - type: string
          pattern: ^[1-9][0-9]*$
          description: EVM chain ID encoded as a decimal string
          examples:
            - '8453'
    SessionResponse:
      type: object
      properties:
        intentId:
          $ref: '#/components/schemas/Uuid'
        type:
          oneOf:
            - type: string
              enum:
                - DEPOSIT
                - WITHDRAW
            - type: 'null'
        status:
          $ref: '#/components/schemas/SessionStatus'
        expiresAt:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
        externalRef:
          oneOf:
            - type: string
              maxLength: 255
            - type: 'null'
        requestParams:
          oneOf:
            - $ref: '#/components/schemas/DepositRequestParams'
            - $ref: '#/components/schemas/WithdrawRequestParams'
            - type: 'null'
        quoteSummary:
          oneOf:
            - $ref: '#/components/schemas/DepositQuoteSummary'
            - $ref: '#/components/schemas/WithdrawQuoteSummary'
            - type: 'null'
        lockedAt:
          oneOf:
            - type: string
              format: date-time
            - type: 'null'
        lockedBy:
          oneOf:
            - $ref: '#/components/schemas/Address'
            - type: 'null'
        txHashes:
          type: array
          items:
            $ref: '#/components/schemas/TransactionHash'
        chainIds:
          type: array
          items:
            $ref: '#/components/schemas/EvmChainId'
        settledAt:
          oneOf:
            - type: string
              format: date-time
            - type: 'null'
        errorMessage:
          oneOf:
            - type: string
            - type: 'null'
        payload:
          oneOf:
            - $ref: '#/components/schemas/DepositQuotePayload'
            - $ref: '#/components/schemas/WithdrawPayload'
            - type: 'null'
      required:
        - intentId
        - type
        - status
        - expiresAt
        - createdAt
        - externalRef
        - requestParams
        - quoteSummary
        - lockedAt
        - lockedBy
        - txHashes
        - chainIds
        - settledAt
        - errorMessage
        - payload
      additionalProperties: false
    EvmChainId:
      type: integer
      minimum: 1
      description: EVM chain ID
      examples:
        - 8453
    SessionStatus:
      type: string
      enum:
        - OPEN
        - LOCKED
        - SUBMITTED
        - SETTLED
        - FAILED
        - CANCELLED
      description: >-
        New submissions move directly from LOCKED to SETTLED. SUBMITTED and
        FAILED remain for legacy sessions.
    DepositRequestParams:
      type: object
      properties:
        chainId:
          $ref: '#/components/schemas/EvmChainId'
        inputAssetAddress:
          $ref: '#/components/schemas/Address'
        eoa:
          $ref: '#/components/schemas/Address'
        amount:
          type: string
          pattern: ^(?:0|[1-9][0-9]*)$
      required:
        - chainId
        - inputAssetAddress
        - eoa
        - amount
      additionalProperties: false
    WithdrawRequestParams:
      type: object
      properties:
        destinationChainId:
          $ref: '#/components/schemas/EvmChainId'
        amount:
          type: string
          pattern: ^(?:0|[1-9][0-9]*)$
          description: Ignored when isMaxWithdraw is true.
        isMaxWithdraw:
          type: boolean
          description: >-
            Redeems every source-chain position. Cross-chain Relay calldata is
            embedded in the atomic withdrawal transaction.
      required:
        - destinationChainId
        - amount
        - isMaxWithdraw
      additionalProperties: false
    DepositQuoteSummary:
      type: object
      properties:
        originChainId:
          $ref: '#/components/schemas/EvmChainId'
        destinationChainId:
          $ref: '#/components/schemas/EvmChainId'
        inputSymbol:
          type: string
        inputAmount:
          type: string
        inputAmountUsd:
          type: string
        outputSymbol:
          type: string
        outputAmount:
          type: string
        outputAmountUsd:
          type: string
        feesUsd:
          type: string
      required:
        - originChainId
        - destinationChainId
        - inputSymbol
        - inputAmount
        - inputAmountUsd
        - outputSymbol
        - outputAmount
        - outputAmountUsd
        - feesUsd
      additionalProperties: false
    WithdrawQuoteSummary:
      type: object
      properties:
        safeAddress:
          $ref: '#/components/schemas/Address'
        destinationChainId:
          $ref: '#/components/schemas/EvmChainId'
        expectedChainIds:
          type: array
          items:
            $ref: '#/components/schemas/EvmChainId'
          minItems: 1
        totalAmount:
          type: string
        totalFeesUsd:
          type: string
        payloadCount:
          type: integer
          minimum: 0
      required:
        - safeAddress
        - destinationChainId
        - expectedChainIds
        - totalAmount
        - totalFeesUsd
        - payloadCount
      additionalProperties: false
    Address:
      type: string
      pattern: ^0x[a-fA-F0-9]{40}$
      description: EVM address. The server normalizes it to EIP-55 checksum case.
      examples:
        - '0x1234567890abcdef1234567890abcdef12345678'
    DepositQuotePayload:
      type: object
      properties:
        originChainId:
          $ref: '#/components/schemas/EvmChainId'
        destinationChainId:
          $ref: '#/components/schemas/EvmChainId'
        input:
          $ref: '#/components/schemas/QuoteCurrency'
        output:
          $ref: '#/components/schemas/QuoteCurrency'
        fees:
          $ref: '#/components/schemas/QuoteFees'
        timeEstimate:
          type: number
          minimum: 0
        steps:
          type: array
          items:
            $ref: '#/components/schemas/DepositStep'
      required:
        - originChainId
        - destinationChainId
        - input
        - output
        - fees
        - timeEstimate
        - steps
      additionalProperties: false
    WithdrawPayload:
      type: object
      properties:
        safeAddress:
          $ref: '#/components/schemas/Address'
        destinationChainId:
          $ref: '#/components/schemas/EvmChainId'
        totalAmount:
          type: string
        timeEstimate:
          type: number
          minimum: 0
        totalFeesUsd:
          type: string
        payloads:
          type: array
          items:
            $ref: '#/components/schemas/WithdrawChainPayload'
      required:
        - safeAddress
        - destinationChainId
        - totalAmount
        - timeEstimate
        - totalFeesUsd
        - payloads
      additionalProperties: false
    ErrorResponse:
      type: object
      properties:
        status:
          type: string
          const: error
        code:
          type: string
          description: Optional machine-readable error code
        message:
          type: string
      required:
        - status
        - message
      additionalProperties: false
      examples:
        - status: error
          code: INTENT_WRONG_STATUS
          message: Session must be in OPEN status for this action.
    QuoteCurrency:
      type: object
      properties:
        address:
          $ref: '#/components/schemas/Address'
        symbol:
          type: string
        amount:
          type: string
        amountFormatted:
          type: string
        amountUsd:
          type: string
      required:
        - address
        - symbol
        - amount
        - amountFormatted
        - amountUsd
      additionalProperties: false
    QuoteFees:
      type: object
      properties:
        gas:
          oneOf:
            - $ref: '#/components/schemas/QuoteFeeItem'
            - type: 'null'
        relay:
          oneOf:
            - $ref: '#/components/schemas/QuoteFeeItem'
            - type: 'null'
        totalUsd:
          type: string
      required:
        - gas
        - relay
        - totalUsd
      additionalProperties: false
    DepositStep:
      type: object
      properties:
        kind:
          type: string
          enum:
            - approve
            - deposit
        description:
          type: string
        to:
          $ref: '#/components/schemas/Address'
        data:
          type: string
          pattern: ^0x[0-9a-fA-F]*$
        value:
          type: string
          pattern: ^[0-9]+$
        chainId:
          $ref: '#/components/schemas/EvmChainId'
      required:
        - kind
        - description
        - to
        - data
        - value
        - chainId
      additionalProperties: false
    WithdrawChainPayload:
      type: object
      properties:
        chainId:
          $ref: '#/components/schemas/EvmChainId'
        vaultAddress:
          $ref: '#/components/schemas/Address'
        amount:
          type: string
        timeEstimate:
          type: number
          minimum: 0
        fees:
          oneOf:
            - $ref: '#/components/schemas/QuoteFees'
            - type: 'null'
        steps:
          type: array
          items:
            $ref: '#/components/schemas/WithdrawStep'
          description: >-
            Ordered execution steps. Current atomic withdrawals can embed
            cross-chain bridge calldata in liquidityReset.
      required:
        - chainId
        - vaultAddress
        - amount
        - timeEstimate
        - fees
        - steps
      additionalProperties: false
    QuoteFeeItem:
      type: object
      properties:
        amountUsd:
          type: string
      required:
        - amountUsd
      additionalProperties: false
    WithdrawStep:
      oneOf:
        - type: object
          properties:
            kind:
              type: string
              const: forceDeallocate
            description:
              type: string
            to:
              $ref: '#/components/schemas/Address'
            data:
              type: string
              pattern: ^0x[0-9a-fA-F]*$
          required:
            - kind
            - description
            - to
            - data
          additionalProperties: false
        - type: object
          properties:
            kind:
              type: string
              const: liquidityReset
            description:
              type: string
              description: >-
                Atomic withdrawal. For a cross-chain source, its calldata can
                include the Relay bridge even when no separate bridge step
                appears.
            to:
              $ref: '#/components/schemas/Address'
            data:
              type: string
              pattern: ^0x[0-9a-fA-F]*$
            delegateCall:
              type: boolean
              const: true
          required:
            - kind
            - description
            - to
            - data
            - delegateCall
          additionalProperties: false
        - type: object
          properties:
            kind:
              type: string
              enum:
                - approve
                - withdraw
                - approveReset
            description:
              type: string
            to:
              $ref: '#/components/schemas/Address'
            data:
              type: string
              pattern: ^0x[0-9a-fA-F]*$
          required:
            - kind
            - description
            - to
            - data
          additionalProperties: false
        - type: object
          properties:
            kind:
              type: string
              const: bridge
            description:
              type: string
            to:
              $ref: '#/components/schemas/Address'
            data:
              type: string
              pattern: ^0x[0-9a-fA-F]*$
            value:
              type: string
              pattern: ^[0-9]+$
            chainId:
              $ref: '#/components/schemas/EvmChainId'
            timeEstimate:
              type: number
              minimum: 0
            fees:
              $ref: '#/components/schemas/QuoteFees'
          required:
            - kind
            - description
            - to
            - data
            - value
            - chainId
            - timeEstimate
            - fees
          additionalProperties: false
  responses:
    BadRequest:
      description: Invalid request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Missing or invalid credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: Access denied
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Conflict:
      description: Request conflicts with the current resource state
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Gone:
      description: Session expired
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Locked:
      description: Account type is halted
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimited:
      description: Rate limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unavailable:
      description: Required service is unavailable
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    PublishableKey:
      type: apiKey
      in: header
      name: X-Publishable-Key
      description: Account Type publishable key (pk_live_...)
    SiweBearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: SIWE session JWT issued by POST /auth/verify

````