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

# Generate strategy transaction bytecode

> Generate transactions for strategy operations. Supports same-chain deposits and withdrawals, swaps before deposits, cross-chain operations, Fireblocks output, user operations, and Solana instructions where supported.



## OpenAPI

````yaml /openapi.yaml get /strategies/{strategyId}/bytecode
openapi: 3.0.0
info:
  version: 2.0.0
  title: Pods API
  description: >
    # Pods API Documentation


    Pods API is a comprehensive DeFi aggregation platform that enables
    cross-chain and same-chain transactions for yield strategies.


    ## Key Features


    - **Cross-Chain Swaps**: Swap tokens across different blockchain networks

    - **Same-Chain Swaps**: Optimal routing for swaps within the same network

    - **Yield Strategies**: Access to multiple DeFi protocols (Aave, Morpho,
    Lido, etc.)

    - **Wallet Tracking**: Monitor positions and yields across protocols

    - **Transaction Monitoring**: Real-time status updates for cross-chain
    transactions


    ## Authentication


    Most API endpoints require authentication using an API key in the
    `x-api-key` header:


    ```

    x-api-key: your-api-key-here

    ```


    Obtain your API key from the Pods dashboard.


    **Exceptions:**

    - `GET /health` is public and does not require authentication.

    - Customer dashboard endpoints (e.g. `GET /customers/me`,
    `/customers/:id/tokens`, `/customers/:id/token-groups`) require a **Bearer**
    token (Supabase or Magic JWT). API key alone is not sufficient for these
    routes because they enforce user role checks.


    ## Base URL


    Production: `https://api.pods.finance`


    ## Rate Limits


    - 100 requests per minute per API key

    - 1000 requests per hour per API key


    ## Quote Expiration


    Quotes expire after 5 minutes. The `deadline` field is a Unix timestamp in
    seconds and `deadlineDate` is an ISO 8601 string (UTC); request a new quote
    when the deadline has passed.


    ## Error Handling


    All errors follow a consistent format. The HTTP status line is the source of
    truth — the body does **not** include `httpStatus`:


    ```json

    {
      "error": {
        "code": "ERROR_CODE",
        "message": "Human-readable error message",
        "details": {}
      }
    }

    ```


    ## Common Error Codes


    - **QUOTE_NOT_FOUND** (404): Quote not found or expired

    - **ACTION_NOT_FOUND** (404): Action not found

    - **STRATEGY_NOT_FOUND** (404): Strategy not found

    - **RECURRING_COLLECTION_REQUIRES_FEE** (400): Recurring collection requires
    a performance or markup fee configured

    - **RECURRING_MARKUP_RECIPIENT_REQUIRED** (422): Live recurring collection
    with a markup fee requires a non-zero markup fee recipient

    - **MARKUP_RECIPIENT_CONFLICTS_WITH_PERFORMANCE_COLLECTOR** (422): Markup
    fee recipient cannot be the performance fee collector

    - **RECURRING_RECIPIENT_ROTATION_PENDING_DISPATCH** (409): Markup fee
    recipient cannot be rotated while a recurring collection transaction is
    unresolved

    - **RECURRING_REGISTRY_CONTROLLER_NOT_CONFIGURED** (503): Recurring
    collection controller is not configured for this network

    - **RECURRING_REGISTRY_MISMATCH** (409): On-chain recurring collection
    registry is not synchronized

    - **INVALID_ACTION_TYPE** (400): Action type is not supported for this
    endpoint

    - **QUOTE_EXPIRED** (400): Quote has expired

    - **QUOTE_VALIDATION_ERROR** (400): Quote validation failed

    - **PIX_THIRD_PARTY_QUOTE_MISMATCH** (400): thirdParty must match the Pix
    offramp quote

    - **MISSING_PIX_KEY** (400): pixKey is required to create the BRL Pix payout
    ticket

    - **INVALID_PIX_KEY** (400): The Pix key is invalid or was not found

    - **PIX_KEY_LOOKUP_FAILED** (502): Unable to validate the Pix key. Please
    try again later

    - **INVALID_PIX_BRCODE_FORMAT** (400): pixKey looks like a Pix BR Code but
    failed format/checksum validation

    - **PIX_BRCODE_EXPIRED** (400): This Pix BR Code has expired

    - **PIX_BRCODE_LOOKUP_FAILED** (502): Failed to look up Pix BR Code details
    from Avenia

    - **PIX_BRCODE_REQUOTE_REQUIRED** (400): This Pix BR Code has a fixed amount
    that was not priced into the existing quote; request a new quote

    - **PROVIDER_NOT_FOUND** (404): Swap provider not found

    - **NO_ROUTE_FOUND** (400): No swap route available between specified chains

    - **INVALID_PREFERRED_PROVIDER** (400): Unknown preferredProvider name

    - **PREFERRED_PROVIDER_NOT_ELIGIBLE** (400): preferredProvider is not
    eligible for this swap route

    - **PREFERRED_PROVIDER_QUOTE_UNAVAILABLE** (400): No quote was returned for
    the requested preferredProvider

    - **INVALID_RAMP_PROVIDER** (400): Unknown rampProvider name

    - **RAMP_PROVIDER_NOT_ELIGIBLE** (400): rampProvider is not eligible for
    this fiat ramp route

    - **RAMP_AMOUNT_OUT_OF_RANGE** (422): Amount is outside the range this ramp
    provider accepts

    - **RAMP_ACCOUNT_ID_MISSING** (400): KYC profile is missing the selected
    ramp provider account id

    - **UNBLOCKPAY_NOT_CONFIGURED** (500): UnblockPay API key is not configured

    - **UNBLOCKPAY_API_ERROR** (502): UnblockPay API request failed

    - **INVALID_UNBLOCKPAY_QUOTE** (502): UnblockPay quote is missing required
    fields

    - **INVALID_UNBLOCKPAY_TICKET** (502): UnblockPay transaction is missing
    required fields

    - **INVALID_UNBLOCKPAY_CUSTOMER** (502): UnblockPay customer is missing
    required fields

    - **UNBLOCKPAY_KYC_NOT_PROVISIONED** (409): UnblockPay customer is not
    provisioned on this KYC profile

    - **UNBLOCKPAY_KYC_REJECTED** (409): UnblockPay KYC was rejected and cannot
    be retried from this profile

    - **UNBLOCKPAY_KYC_IN_PROGRESS** (409): UnblockPay KYC is already under
    review

    - **UNBLOCKPAY_USD_OFFRAMP_ACCOUNT_MISSING** (409): UnblockPay USD offramp
    needs a wire external account. POST /api/v1/kyc/currency-unlock with
    rampProvider=unblockpay and the bank fields listed on
    ramps.unblockpay.unlock.requiredBodyFields

    - **KYC_PROFILE_INCOMPLETE_FOR_RAMP** (400): KYC profile is missing fields
    required by the selected ramp provider

    - **KYC_WALLET_ALREADY_LINKED** (409): Wallet is already linked to another
    KYC profile for this customer

    - **KYC_WALLET_NOT_LINKED** (404): Wallet is not linked to this KYC profile

    - **KYC_LAST_WALLET** (409): Cannot unlink the last wallet from a KYC
    profile

    - **QUOTE_GENERATION_FAILED** (400): Could not generate quote for specified
    parameters

    - **ROUTER_EXACT_OUT_UNSUPPORTED** (400): Router public Pix/Yield quotes
    currently support amountIn only

    - **FEE_SPONSORSHIP_NOT_ALLOWED** (403): Fee sponsorship is not allowed for
    this customer

    - **CUSTOMER_STRATEGY_NOT_FOUND** (404): Customer strategy not found

    - **FEE_ACTIVATION_IN_PROGRESS** (409): Profit fee activation is already
    reconciling

    - **FEE_ACTIVATION_TASK_NOT_PERSISTED** (500): Fee activation task could not
    be persisted

    - **INVALID_TX_HASH** (400): Invalid transaction hash format

    - **TX_UPDATE_FAILED** (500): Failed to update transaction status

    - **INVALID_AMOUNT_PARAMS** (400): Cannot specify both amountIn and
    amountOut simultaneously

    - **MISSING_AMOUNT_PARAMS** (400): Either amountIn or amountOut is required

    - **INVALID_SLIPPAGE** (400): slippage must be a number between 0.0001 and
    0.5 (fraction of 1, e.g. 0.01 = 1%)

    - **AMOUNT_IN_TOO_LOW** (400): AmountIn is below the minimum for this route

    - **AMOUNT_IN_TOO_HIGH** (400): AmountIn exceeds available liquidity for
    this route. Try a smaller amount.

    - **AMOUNT_IN_TOO_LOW_OFFRAMP** (400): AmountIn must be greater than 1 USDC

    - **AMOUNT_IN_TOO_HIGH_OFFRAMP** (400): AmountIn must be less than 20k USDC

    - **AMOUNT_OUT_TOO_LOW_OFFRAMP** (400): AmountOut is below the route minimum
    (0.5 BRL on Pix BRLA/BRS, 5 BRLA on USDC Pix)

    - **AMOUNT_OUT_TOO_HIGH_OFFRAMP** (400): AmountOut must be less than 110k
    BRLA

    - **AMOUNT_EXCEEDS_PROVIDER_LIMIT** (409): Requested amount exceeds the
    remaining provider withdrawal limit

    - **AMOUNT_IN_TOO_LOW_ONRAMP** (400): AmountIn is below the route minimum
    (0.5 BRL on Pix BRLA/BRS, 1 BRLA on USDC Pix)

    - **AMOUNT_IN_TOO_HIGH_ONRAMP** (400): AmountIn must be at most 100k BRLA

    - **AMOUNT_OUT_TOO_LOW_ONRAMP** (400): AmountOut must be greater than 1 USDC

    - **AMOUNT_OUT_TOO_HIGH_ONRAMP** (400): AmountOut must be at most 20k USDC

    - **TRANSFER_VALIDATION_FAILED** (400): Token transfer validation failed

    - **REFUND_PROCESSING_FAILED** (500): Failed to process refund transaction

    - **INSUFFICIENT_AMOUNT_FOR_REFUND** (400): Transferred amount insufficient
    to cover refund fee

    - **FORBIDDEN** (403): Access denied

    - **INTERNAL_SERVER_ERROR** (500): An unexpected error occurred

    - **BYTECODE_GENERATION_FAILED** (500): Failed to generate transaction
    bytecode

    - **SWAP_EXECUTION_FAILED** (500): Failed to execute swap transaction

    - **KAMINO_SERVICE_UNAVAILABLE** (503): Lending service is temporarily
    unavailable. Please try again later.

    - **KAMINO_BAD_REQUEST** (400): Invalid request to lending service

    - **DEPOSIT_NOT_FOUND** (404): Bitcoin deposit not found

    - **SYMBIOSIS_API_ERROR** (502): Error communicating with Symbiosis API

    - **ONDO_GM_NOT_CONFIGURED** (503): Ondo GM API is not configured.

    - **ONDO_GM_ATTESTATION_FAILED** (502): Ondo GM hard attestation request
    failed.

    - **ONDO_GM_SOFT_QUOTE_UNAVAILABLE** (502): Ondo GM soft quote is
    unavailable.

    - **ONDO_GM_FLOOR_BREACH** (409): Ondo GM hard attestation is worse than the
    bytecode floor.


    ## Support


    - Documentation: https://docs.pods.finance

    - Support: support@pods.finance
  contact:
    name: Pods Support
    email: support@pods.finance
    url: https://pods.finance
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://api.pods.finance
    description: Production server
security: []
tags:
  - name: Health
    description: Health check endpoints
  - name: KYC
    description: >-
      KYC onboarding and status endpoints: Brazilian and foreign Sumsub import,
      BigDataCorp capture, external evidence, linked wallets, and USD currency
      unlock
  - name: Swap
    description: Token swap operations
  - name: Tracking
    description: Execution tracking for swaps, transfers, and strategy operations
  - name: Strategies
    description: DeFi yield strategy operations
  - name: Ondo
    description: Ondo Global Markets stock status and tradability
  - name: Tokens
    description: Token catalog and metadata
  - name: Transfer
    description: Token transfer transaction generation
  - name: Wallets
    description: Wallet position tracking
  - name: Customers
    description: Customer account management (Bearer auth)
  - name: Quotes
    description: Quote history and management
  - name: Smart Account
    description: ERC-4337 Gnosis Safe smart account provisioning
paths:
  /strategies/{strategyId}/bytecode:
    get:
      tags:
        - Strategies
      summary: Generate strategy transaction bytecode
      description: >-
        Generate transactions for strategy operations. Supports same-chain
        deposits and withdrawals, swaps before deposits, cross-chain operations,
        Fireblocks output, user operations, and Solana instructions where
        supported.
      parameters:
        - schema:
            type: string
            description: Strategy ID or slug
          required: true
          name: strategyId
          in: path
        - schema:
            type: string
            enum:
              - lend
              - request-lend
              - buy
              - withdraw
              - request-withdraw
              - sell
              - quick-withdraw
              - claim-airdrop
              - borrow
              - repay
            description: >-
              Strategy action type. buy and sell are aliases of request-lend and
              request-withdraw on Ondo stock strategies.
          required: true
          name: action
          in: query
        - schema:
            allOf:
              - $ref: '#/components/schemas/BigIntLike'
              - description: >-
                  Amount in token smallest unit. Omit when amountInShares
                  supplies the withdrawal amount.
          required: false
          name: amount
          in: query
        - schema:
            allOf:
              - $ref: '#/components/schemas/BigIntLike'
              - description: Withdrawal amount in strategy share-token units.
          required: false
          name: amountInShares
          in: query
        - schema:
            type: boolean
            default: false
            description: >-
              Redeem the complete wallet share balance for supported ERC-4626
              strategies. Use for an exact full exit; amount remains required as
              the expected underlying amount.
          required: false
          name: withdrawAll
          in: query
        - schema:
            type: boolean
            default: false
            description: >-
              Skip on-chain wallet balance checks while generating bytecode (fee
              transfers, native transfers, and Aave lend). The returned
              transactions can still revert at execution if the wallet cannot
              fund them.
          required: false
          name: skipBalanceCheck
          in: query
        - schema:
            type: string
            description: User wallet address
          required: true
          name: wallet
          in: query
        - schema:
            type: number
            description: Source chain ID alias for cross-chain deposits
            example: 8453
          required: false
          name: chainIdIn
          in: query
        - schema:
            type: number
            description: Source chain ID for cross-chain deposits
            example: 8453
          required: false
          name: fromChainId
          in: query
        - schema:
            allOf:
              - $ref: '#/components/schemas/Address'
              - description: Source token for same-chain swap or cross-chain deposit
          required: false
          name: fromTokenAddress
          in: query
        - schema:
            type: number
            description: Destination chain ID alias for cross-chain withdrawals
            example: 8453
          required: false
          name: chainIdOut
          in: query
        - schema:
            type: number
            description: Destination chain ID for cross-chain withdrawals
            example: 8453
          required: false
          name: toChainId
          in: query
        - schema:
            allOf:
              - $ref: '#/components/schemas/Address'
              - description: Destination token for cross-chain withdrawals
          required: false
          name: toTokenAddress
          in: query
        - schema:
            allOf:
              - $ref: '#/components/schemas/Address'
              - description: Destination wallet address when different from wallet
          required: false
          name: destinationAddress
          in: query
        - schema:
            type: string
            description: Registered swap provider name to use for any swap or bridge leg.
            example: pods
          required: false
          name: preferredProvider
          in: query
        - schema:
            type: string
            enum:
              - bytecode
              - userOperation
              - fireblocks
              - instructions
            default: bytecode
            description: Response format
          required: false
          name: output
          in: query
        - schema:
            type: string
            description: Fireblocks vault account ID. Required when output=fireblocks.
            example: '12'
          required: false
          name: accountId
          in: query
        - schema:
            type: string
            description: Solana reserve address for supported borrow/repay operations
          required: false
          name: reserveAddress
          in: query
        - schema:
            type: string
            format: uri
            description: Optional per-action webhook endpoint override.
            example: https://example.com/webhooks/strategy-action
          required: false
          name: webhookURL
          in: query
        - schema:
            anyOf:
              - type: string
              - type: number
            description: >-
              Ondo BSC CoW request-lend / request-withdraw only. Client limit
              price as integer USD cents (17050 = $170.50). Independent of
              expireAt. Other strategies return 400 PRICE_IN_USD_NOT_SUPPORTED.
            example: 17050
          required: false
          name: priceInUsd
          in: query
        - schema:
            type: integer
            description: >-
              Ondo BSC CoW request-lend / request-withdraw only. CoW validTo as
              a UTC Unix timestamp in seconds (not milliseconds). Must be in the
              future and at most 168 hours from now. Independent of priceInUsd.
              Other strategies return 400 EXPIRE_AT_NOT_SUPPORTED.
            example: 1778000000
          required: false
          name: expireAt
          in: query
      responses:
        '200':
          description: Bytecode generated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  feeCharged:
                    $ref: '#/components/schemas/BigIntLike'
                  chainIdIn:
                    type: number
                    example: 8453
                  chainIdOut:
                    type: number
                    example: 42161
                  id:
                    type: string
                    description: ID created for execution tracking
                    example: 6a04f2f75bf7233c6220b3ca
                  crossChain:
                    allOf:
                      - $ref: '#/components/schemas/CrossChainRoute'
                      - nullable: true
                        description: >-
                          Cross-chain route metadata, or null for same-chain
                          strategy actions
                  quote:
                    nullable: true
                    description: >-
                      Bridge or swap quote metadata when the strategy action
                      includes a swap or bridge. Ondo BSC client-limit quotes
                      also include clientLimitPriceUsd (dollars), spotPriceUsd,
                      and distanceBps.
                  bytecode:
                    type: array
                    items:
                      $ref: '#/components/schemas/TransactionData'
                  userOperation:
                    nullable: true
                    description: User operation when output=userOperation
                  transactionData:
                    nullable: true
                    description: Fireblocks transaction request when output=fireblocks
                  transaction:
                    type: string
                    description: Base64 Solana transaction when output=bytecode on Solana
                  instructions:
                    type: array
                    items:
                      nullable: true
                    description: Solana instructions when output=instructions
                  lutsByAddress:
                    nullable: true
                    description: Solana lookup tables keyed by address
                required:
                  - feeCharged
                  - id
        '400':
          description: Bad request - invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Strategy not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    BigIntLike:
      type: string
      description: Large integer represented as string (for amounts with decimals)
      example: '1000000000000000000'
    Address:
      type: string
      description: Ethereum address (EVM-compatible)
      example: '0xb794F5eA0ba39494cE839613fffBA74279579268'
    CrossChainRoute:
      type: object
      properties:
        isCrossChain:
          type: boolean
          example: true
        chainIdIn:
          type: number
          example: 8453
        chainIdOut:
          type: number
          example: 42161
      required:
        - isCrossChain
        - chainIdIn
        - chainIdOut
      description: Canonical source and destination chain route
    TransactionData:
      type: object
      properties:
        chainId:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: Chain ID as decimal string
              example: '137'
        to:
          $ref: '#/components/schemas/Address'
        data:
          type: string
          description: Transaction calldata (hex)
          example: 0x...
        value:
          type: string
          description: ETH value to send
          example: '0'
        from:
          $ref: '#/components/schemas/Address'
      required:
        - chainId
        - to
        - data
      description: Transaction data for execution
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            details:
              nullable: true
          required:
            - code
            - message
      required:
        - error
      example:
        error:
          code: QUOTE_NOT_FOUND
          message: Quote not found or expired
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication. Obtain from your Pods dashboard.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.