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

# Prepare Solana transaction

> Prepares an unsigned Solana v0 message for the authenticated user's embedded wallet to sign. Supports `transfer`, `payment`, `yield.deposit`, and `yield.withdraw` intents. Kamino is the only yield protocol supported today. The response `messageBytes` are base64-encoded Solana message bytes, not a serialized transaction; the wallet must sign the decoded bytes exactly and submit only the detached signature.



## OpenAPI

````yaml https://platform.spritz.finance/openapi.json post /v1/wallet-kit/solana/transactions/prepare
openapi: 3.0.3
info:
  title: Spritz Finance API
  version: 1.0.0
  description: API for the Spritz Finance platform with RFC 9457 error handling
servers:
  - url: https://platform.spritz.finance
    description: Production
  - url: https://sandbox.spritz.finance
    description: Sandbox
security: []
tags:
  - name: Users
    description: User management endpoints
  - name: Bank Accounts
    description: Manage bank accounts for off-ramp destinations
  - name: Bills
    description: Manage bill pay accounts
  - name: Cards
    description: Spritz-issued debit cards
  - name: Auto-Ramp Accounts
    description: Virtual bank accounts that automatically convert fiat deposits to crypto
  - name: Spritz App
    description: >-
      Endpoints used by the Spritz app and internal SDKs. Excluded from the
      public partner spec.
paths:
  /v1/wallet-kit/solana/transactions/prepare:
    post:
      tags:
        - Wallet Kit
      summary: Prepare Solana transaction
      description: >-
        Prepares an unsigned Solana v0 message for the authenticated user's
        embedded wallet to sign. Supports `transfer`, `payment`,
        `yield.deposit`, and `yield.withdraw` intents. Kamino is the only yield
        protocol supported today. The response `messageBytes` are base64-encoded
        Solana message bytes, not a serialized transaction; the wallet must sign
        the decoded bytes exactly and submit only the detached signature.
      operationId: postV1Wallet-kitSolanaTransactionsPrepare
      requestBody:
        description: >-
          Request body for preparing a Solana transaction. The authenticated
          user id is derived from the bearer token; clients do not send `userId`
          to Wallet Kit. The server builds and stores an unsigned Solana v0
          message, then returns the exact bytes the embedded wallet must sign.
        required: true
        content:
          application/json:
            schema:
              description: >-
                Request body for preparing a Solana transaction. The
                authenticated user id is derived from the bearer token; clients
                do not send `userId` to Wallet Kit. The server builds and stores
                an unsigned Solana v0 message, then returns the exact bytes the
                embedded wallet must sign.
              type: object
              properties:
                clientIntentId:
                  minLength: 1
                  description: >-
                    Caller-supplied idempotency key for this prepare call.
                    Repeating the same `clientIntentId` with an identical intent
                    returns the existing prepared transaction while it is
                    active. Reusing the same key with different intent details
                    returns a conflict error.
                  type: string
                intentVersion:
                  description: >-
                    Version of the intent schema. Production prepare currently
                    expects exactly `1`.
                  type: number
                  example: 1
                  enum:
                    - 1
                feeMode:
                  type: string
                  enum:
                    - auto
                    - sponsored_only
                    - user_paid_only
                intent:
                  description: >-
                    Discriminated Solana transaction intent. Use `transfer` for
                    wallet transfers, `payment` for Spritz off-ramp quote
                    payments, `yield.deposit` for Kamino USDC vault deposits,
                    and `yield.withdraw` for Kamino USDC vault withdrawals.
                  anyOf:
                    - description: >-
                        Transfer intent. The transaction builder creates the
                        exact Solana v0 message for the authenticated user's
                        embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a native SOL or SPL token transfer.
                          type: string
                          enum:
                            - transfer
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        to:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Recipient Solana public key (base58).
                          type: string
                          example: FqVnHphYBfJTb46iWbwS8oRaAWGnLPVhWqvY1pgZ7yC8
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            SPL mint address for token transfers, or null for
                            native SOL transfers.
                          type: string
                          nullable: true
                          example: null
                      required:
                        - kind
                        - from
                        - to
                        - amount
                        - mint
                    - description: >-
                        Off-ramp quote payment intent. The transaction builder
                        creates the exact Solana v0 message for the
                        authenticated user's embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a Spritz off-ramp quote payment.
                          type: string
                          enum:
                            - payment
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        offRampQuoteId:
                          minLength: 1
                          description: >-
                            Existing off-ramp quote id. The transaction builder
                            resolves amount due, destination, memo/reference,
                            and token route from this quote.
                          type: string
                          example: offramp_xyz789
                      required:
                        - kind
                        - from
                        - offRampQuoteId
                    - description: >-
                        Kamino yield deposit intent. `amount` is a raw USDC
                        base-unit integer string, so `1500000` means 1.5 USDC.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for depositing USDC into a Kamino vault.
                          type: string
                          enum:
                            - yield.deposit
                        protocol:
                          description: >-
                            Yield protocol that will construct the deposit
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - amount
                        - mint
                    - description: >-
                        Kamino yield withdraw intent. Wallet Kit currently
                        exposes full-position withdrawals with `withdrawAll:
                        true`.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for withdrawing from a Kamino vault.
                          type: string
                          enum:
                            - yield.withdraw
                        protocol:
                          description: >-
                            Yield protocol that will construct the withdraw
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        withdrawAll:
                          description: >-
                            Withdraw the user's full available position from
                            this vault. Partial withdraws are not exposed by
                            Wallet Kit yet.
                          type: boolean
                          enum:
                            - true
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - withdrawAll
                        - mint
              required:
                - clientIntentId
                - intentVersion
                - intent
          application/x-www-form-urlencoded:
            schema:
              description: >-
                Request body for preparing a Solana transaction. The
                authenticated user id is derived from the bearer token; clients
                do not send `userId` to Wallet Kit. The server builds and stores
                an unsigned Solana v0 message, then returns the exact bytes the
                embedded wallet must sign.
              type: object
              properties:
                clientIntentId:
                  minLength: 1
                  description: >-
                    Caller-supplied idempotency key for this prepare call.
                    Repeating the same `clientIntentId` with an identical intent
                    returns the existing prepared transaction while it is
                    active. Reusing the same key with different intent details
                    returns a conflict error.
                  type: string
                intentVersion:
                  description: >-
                    Version of the intent schema. Production prepare currently
                    expects exactly `1`.
                  type: number
                  example: 1
                  enum:
                    - 1
                feeMode:
                  type: string
                  enum:
                    - auto
                    - sponsored_only
                    - user_paid_only
                intent:
                  description: >-
                    Discriminated Solana transaction intent. Use `transfer` for
                    wallet transfers, `payment` for Spritz off-ramp quote
                    payments, `yield.deposit` for Kamino USDC vault deposits,
                    and `yield.withdraw` for Kamino USDC vault withdrawals.
                  anyOf:
                    - description: >-
                        Transfer intent. The transaction builder creates the
                        exact Solana v0 message for the authenticated user's
                        embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a native SOL or SPL token transfer.
                          type: string
                          enum:
                            - transfer
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        to:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Recipient Solana public key (base58).
                          type: string
                          example: FqVnHphYBfJTb46iWbwS8oRaAWGnLPVhWqvY1pgZ7yC8
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            SPL mint address for token transfers, or null for
                            native SOL transfers.
                          type: string
                          nullable: true
                          example: null
                      required:
                        - kind
                        - from
                        - to
                        - amount
                        - mint
                    - description: >-
                        Off-ramp quote payment intent. The transaction builder
                        creates the exact Solana v0 message for the
                        authenticated user's embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a Spritz off-ramp quote payment.
                          type: string
                          enum:
                            - payment
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        offRampQuoteId:
                          minLength: 1
                          description: >-
                            Existing off-ramp quote id. The transaction builder
                            resolves amount due, destination, memo/reference,
                            and token route from this quote.
                          type: string
                          example: offramp_xyz789
                      required:
                        - kind
                        - from
                        - offRampQuoteId
                    - description: >-
                        Kamino yield deposit intent. `amount` is a raw USDC
                        base-unit integer string, so `1500000` means 1.5 USDC.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for depositing USDC into a Kamino vault.
                          type: string
                          enum:
                            - yield.deposit
                        protocol:
                          description: >-
                            Yield protocol that will construct the deposit
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - amount
                        - mint
                    - description: >-
                        Kamino yield withdraw intent. Wallet Kit currently
                        exposes full-position withdrawals with `withdrawAll:
                        true`.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for withdrawing from a Kamino vault.
                          type: string
                          enum:
                            - yield.withdraw
                        protocol:
                          description: >-
                            Yield protocol that will construct the withdraw
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        withdrawAll:
                          description: >-
                            Withdraw the user's full available position from
                            this vault. Partial withdraws are not exposed by
                            Wallet Kit yet.
                          type: boolean
                          enum:
                            - true
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - withdrawAll
                        - mint
              required:
                - clientIntentId
                - intentVersion
                - intent
          multipart/form-data:
            schema:
              description: >-
                Request body for preparing a Solana transaction. The
                authenticated user id is derived from the bearer token; clients
                do not send `userId` to Wallet Kit. The server builds and stores
                an unsigned Solana v0 message, then returns the exact bytes the
                embedded wallet must sign.
              type: object
              properties:
                clientIntentId:
                  minLength: 1
                  description: >-
                    Caller-supplied idempotency key for this prepare call.
                    Repeating the same `clientIntentId` with an identical intent
                    returns the existing prepared transaction while it is
                    active. Reusing the same key with different intent details
                    returns a conflict error.
                  type: string
                intentVersion:
                  description: >-
                    Version of the intent schema. Production prepare currently
                    expects exactly `1`.
                  type: number
                  example: 1
                  enum:
                    - 1
                feeMode:
                  type: string
                  enum:
                    - auto
                    - sponsored_only
                    - user_paid_only
                intent:
                  description: >-
                    Discriminated Solana transaction intent. Use `transfer` for
                    wallet transfers, `payment` for Spritz off-ramp quote
                    payments, `yield.deposit` for Kamino USDC vault deposits,
                    and `yield.withdraw` for Kamino USDC vault withdrawals.
                  anyOf:
                    - description: >-
                        Transfer intent. The transaction builder creates the
                        exact Solana v0 message for the authenticated user's
                        embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a native SOL or SPL token transfer.
                          type: string
                          enum:
                            - transfer
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        to:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Recipient Solana public key (base58).
                          type: string
                          example: FqVnHphYBfJTb46iWbwS8oRaAWGnLPVhWqvY1pgZ7yC8
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            SPL mint address for token transfers, or null for
                            native SOL transfers.
                          type: string
                          nullable: true
                          example: null
                      required:
                        - kind
                        - from
                        - to
                        - amount
                        - mint
                    - description: >-
                        Off-ramp quote payment intent. The transaction builder
                        creates the exact Solana v0 message for the
                        authenticated user's embedded wallet to sign.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for a Spritz off-ramp quote payment.
                          type: string
                          enum:
                            - payment
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        offRampQuoteId:
                          minLength: 1
                          description: >-
                            Existing off-ramp quote id. The transaction builder
                            resolves amount due, destination, memo/reference,
                            and token route from this quote.
                          type: string
                          example: offramp_xyz789
                      required:
                        - kind
                        - from
                        - offRampQuoteId
                    - description: >-
                        Kamino yield deposit intent. `amount` is a raw USDC
                        base-unit integer string, so `1500000` means 1.5 USDC.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for depositing USDC into a Kamino vault.
                          type: string
                          enum:
                            - yield.deposit
                        protocol:
                          description: >-
                            Yield protocol that will construct the deposit
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        amount:
                          minLength: 1
                          pattern: ^[1-9][0-9]*$
                          description: >-
                            Positive integer amount in base units, formatted as
                            a string. For native SOL this is lamports. For SPL
                            tokens this is the mint's base unit, for example
                            USDC uses 6 decimals.
                          type: string
                          example: '1000000'
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - amount
                        - mint
                    - description: >-
                        Kamino yield withdraw intent. Wallet Kit currently
                        exposes full-position withdrawals with `withdrawAll:
                        true`.
                      type: object
                      properties:
                        kind:
                          description: Intent kind for withdrawing from a Kamino vault.
                          type: string
                          enum:
                            - yield.withdraw
                        protocol:
                          description: >-
                            Yield protocol that will construct the withdraw
                            instructions. Only Kamino is supported for Solana
                            yield transactions today.
                          type: string
                          enum:
                            - kamino
                        from:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        vault:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: Solana public key (base58).
                          type: string
                          example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                        withdrawAll:
                          description: >-
                            Withdraw the user's full available position from
                            this vault. Partial withdraws are not exposed by
                            Wallet Kit yet.
                          type: boolean
                          enum:
                            - true
                        mint:
                          minLength: 32
                          maxLength: 44
                          pattern: ^[1-9A-HJ-NP-Za-km-z]+$
                          description: >-
                            Solana USDC mint address supported by the selected
                            Kamino vault.
                          type: string
                          example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                      required:
                        - kind
                        - protocol
                        - from
                        - vault
                        - withdrawAll
                        - mint
              required:
                - clientIntentId
                - intentVersion
                - intent
      responses:
        '200':
          description: >-
            Prepare response for the embedded-wallet signing flow. Decode
            `messageBytes`, sign those exact bytes with `userSigner`, then
            submit only the detached base64 signature. Do not submit a
            serialized transaction or rebuild the message client-side.
          content:
            application/json:
              schema:
                description: >-
                  Prepare response for the embedded-wallet signing flow. Decode
                  `messageBytes`, sign those exact bytes with `userSigner`, then
                  submit only the detached base64 signature. Do not submit a
                  serialized transaction or rebuild the message client-side.
                type: object
                properties:
                  txId:
                    description: >-
                      Server-issued transaction id. Pass this back to the submit
                      endpoint along with the user signature.
                    type: string
                  messageBytes:
                    description: >-
                      Base64-encoded Solana v0 message bytes. The embedded
                      wallet must sign exactly these bytes after base64 decoding
                      — do not mutate, rebuild, or wrap.
                    type: string
                  messageFormat:
                    description: >-
                      Format of `messageBytes`. `solana_message_v0` means the
                      bytes are a Solana v0 message, not a serialized
                      transaction.
                    type: string
                    enum:
                      - solana_message_v0
                  userSigner:
                    description: >-
                      Solana public key that must produce `userSignature` over
                      the decoded `messageBytes`.
                    type: string
                    example: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
                  requiredSigners:
                    description: >-
                      All signer public keys required by the prepared message.
                      The embedded wallet is responsible for the `userSigner`;
                      Spritz may add the fee-payer signature during submit.
                    type: array
                    items:
                      type: string
                  feePayer:
                    description: >-
                      Solana public key paying the network fee for the prepared
                      transaction.
                    type: string
                  sponsored:
                    description: >-
                      Whether Spritz is expected to pay the Solana network fee
                      for this prepared transaction.
                    type: boolean
                  estimatedFeeLamports:
                    minimum: 0
                    description: >-
                      Estimated Solana network fee in lamports for the prepared
                      message.
                    type: integer
                    example: 5000
                  addressLookupTableAddresses:
                    description: >-
                      Address lookup table accounts used by the v0 message.
                      Empty when the message does not use lookup tables.
                    type: array
                    items:
                      type: string
                  blockhash:
                    description: >-
                      Recent blockhash embedded in the prepared message. This
                      blockhash is what makes the prepared message expire.
                    type: string
                  lastValidBlockHeight:
                    minimum: 0
                    description: >-
                      Last Solana block height at which the prepared message can
                      still be submitted.
                    type: integer
                  expiresAt:
                    format: date-time
                    description: >-
                      ISO 8601 timestamp at which this prepared transaction
                      expires. Solana blockhashes expire quickly; if submit
                      fails with `TX_EXPIRED`, call prepare again and sign the
                      new `messageBytes`.
                    type: string
                  summary:
                    description: >-
                      Product summary of the prepared transaction. Shape varies
                      by intent. Transfer summaries identify sender, recipient,
                      mint, and amount. Payment summaries identify the off-ramp
                      quote, destination, amount, mint, and required token
                      input. Kamino yield summaries identify protocol, vault,
                      mint, and the deposit amount or withdraw-all request.
                    type: object
                    additionalProperties: {}
                required:
                  - txId
                  - messageBytes
                  - messageFormat
                  - userSigner
                  - requiredSigners
                  - feePayer
                  - sponsored
                  - estimatedFeeLamports
                  - addressLookupTableAddresses
                  - blockhash
                  - lastValidBlockHeight
                  - expiresAt
                  - summary
        '401':
          description: Response for status 401
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 401
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                    example: Bearer token required
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                  realm:
                    description: The authentication realm
                    type: string
                    example: API
                  scope:
                    description: The required scope for this resource
                    type: string
                    example: read:users
                required:
                  - title
                  - status
                additionalProperties: false
        '409':
          description: Response for status 409
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 400
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                    example: /errors/1234567890
                  code:
                    description: >-
                      Machine-readable cause, present when exactly one thing
                      failed. Branch on this, never on `detail`, which is
                      human-facing copy and may change. For deposit limits the
                      vocabulary matches the `reason` values the limits API
                      returns pre-flight.
                    type: string
                    example: transaction_limit
                  field:
                    description: The offending request field, present alongside `code`.
                    type: string
                    example: amountUsd
                  retryable:
                    description: >-
                      Whether retrying the same request later may succeed
                      without changing its inputs.
                    type: boolean
                    example: true
                required:
                  - title
                  - status
                additionalProperties: false
        '422':
          description: Response for status 422
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 400
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                    example: /errors/1234567890
                  code:
                    description: >-
                      Machine-readable cause, present when exactly one thing
                      failed. Branch on this, never on `detail`, which is
                      human-facing copy and may change. For deposit limits the
                      vocabulary matches the `reason` values the limits API
                      returns pre-flight.
                    type: string
                    example: transaction_limit
                  field:
                    description: The offending request field, present alongside `code`.
                    type: string
                    example: amountUsd
                  retryable:
                    description: >-
                      Whether retrying the same request later may succeed
                      without changing its inputs.
                    type: boolean
                    example: true
                required:
                  - title
                  - status
                additionalProperties: false
        '500':
          description: Response for status 500
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 400
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                    example: /errors/1234567890
                  code:
                    description: >-
                      Machine-readable cause, present when exactly one thing
                      failed. Branch on this, never on `detail`, which is
                      human-facing copy and may change. For deposit limits the
                      vocabulary matches the `reason` values the limits API
                      returns pre-flight.
                    type: string
                    example: transaction_limit
                  field:
                    description: The offending request field, present alongside `code`.
                    type: string
                    example: amountUsd
                  retryable:
                    description: >-
                      Whether retrying the same request later may succeed
                      without changing its inputs.
                    type: boolean
                    example: true
                required:
                  - title
                  - status
                additionalProperties: false
        '502':
          description: Response for status 502
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 400
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                    example: /errors/1234567890
                  code:
                    description: >-
                      Machine-readable cause, present when exactly one thing
                      failed. Branch on this, never on `detail`, which is
                      human-facing copy and may change. For deposit limits the
                      vocabulary matches the `reason` values the limits API
                      returns pre-flight.
                    type: string
                    example: transaction_limit
                  field:
                    description: The offending request field, present alongside `code`.
                    type: string
                    example: amountUsd
                  retryable:
                    description: >-
                      Whether retrying the same request later may succeed
                      without changing its inputs.
                    type: boolean
                    example: true
                required:
                  - title
                  - status
                additionalProperties: false
        '503':
          description: Response for status 503
          content:
            application/json:
              schema:
                type: object
                properties:
                  type:
                    default: about:blank
                    description: A URI reference that identifies the problem type
                    type: string
                    example: urn:problem-type:auth:unauthorized
                  title:
                    description: A short, human-readable summary of the problem type
                    type: string
                    example: Unauthorized
                  status:
                    description: The HTTP status code
                    type: number
                    example: 400
                  detail:
                    description: A human-readable explanation specific to this occurrence
                    type: string
                  instance:
                    description: A URI reference that identifies the specific occurrence
                    type: string
                    example: /errors/1234567890
                  code:
                    description: >-
                      Machine-readable cause, present when exactly one thing
                      failed. Branch on this, never on `detail`, which is
                      human-facing copy and may change. For deposit limits the
                      vocabulary matches the `reason` values the limits API
                      returns pre-flight.
                    type: string
                    example: transaction_limit
                  field:
                    description: The offending request field, present alongside `code`.
                    type: string
                    example: amountUsd
                  retryable:
                    description: >-
                      Whether retrying the same request later may succeed
                      without changing its inputs.
                    type: boolean
                    example: true
                required:
                  - title
                  - status
                additionalProperties: false
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Cognito JWT token for regular user authentication

````