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

# Get Transfer

> Look up a transfer by `transferId`. Use to poll cross-token transfers until terminal.

Returns the same envelope as [Create Transfer](/trading-api/funds/create-transfer). Poll this endpoint when a `POST /transfers` response returns `status: "pending"` - typically cross-token routes that need a swap leg.

A reasonable polling cadence is once every 3–5 seconds; most cross-token transfers settle in under a minute, but transient on-chain failures can push that to a few minutes while recovery retries the failing step (`substatus: "recoveryInProgress"`).

`txHashes` is populated as each on-chain step lands - `source`, `dest`, `approve`, and optionally `wrap`/`unwrap` (Polymarket), `safeExtract`/`safeDeposit` (Opinion), or `swap` (cross-token). `explorerLink` carries a bridge-explorer URL for cross-chain transfers; it's `null` for same-chain hops.


## OpenAPI

````yaml GET /api/accounts/{accountId}/transfers/{transferId}
openapi: 3.1.0
info:
  title: Predexon Trading API
  description: Unified trading API for prediction markets
  version: 1.0.0
servers:
  - url: https://trade.predexon.com
security:
  - ApiKeyAuth: []
paths:
  /api/accounts/{accountId}/transfers/{transferId}:
    get:
      tags:
        - Trading (Transfers)
      summary: Get Transfer
      description: >-
        Fetch a single transfer by ID. Lazy-refreshes pending rows from the
        bridge provider so the response always reflects the latest state.
      operationId: get_transfer
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: transferId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Transfer detail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transfer'
        '401':
          description: API key required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '404':
          description: Transfer not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
components:
  schemas:
    Transfer:
      type: object
      description: >-
        A single fund-movement operation. Same envelope returned by `POST
        /transfers`, `GET /transfers`, and `GET /transfers/{transferId}`.
        `status` is the partner-facing 3-state enum; `substatus` carries
        additional context where useful.
      properties:
        transferId:
          type: string
          description: >-
            Stable identifier (`tfr-...`). Use for `GET
            /transfers/{transferId}`.
        accountId:
          type: string
        from:
          type: object
          description: Source side of the transfer.
          properties:
            wallet:
              type: string
              description: '`deposit`, a venue name, or `external`.'
            chain:
              type: integer
            token:
              type: string
            address:
              type: string
        to:
          type: object
          description: Destination side of the transfer.
          properties:
            wallet:
              type: string
            chain:
              type: integer
            token:
              type: string
            address:
              type: string
        amount:
          type: string
          description: Source-side amount (echo of the request).
        amountReceived:
          type: string
          nullable: true
          description: >-
            Destination-side amount actually delivered. Populated once the
            transfer settles.
        status:
          type: string
          enum:
            - pending
            - completed
            - failed
          description: >-
            Partner-facing 3-state status. `pending` includes routes still in
            active recovery; `failed` includes routes that exhausted recovery
            (see `substatus`).
        substatus:
          type: string
          enum:
            - recoveryInProgress
            - escalated
            - legacyPartial
          nullable: true
          description: >-
            Optional context. `recoveryInProgress` — a transient on-chain step
            is being retried (poll until terminal). `escalated` — automated
            recovery exhausted; contact support. `legacyPartial` — historical
            pre-recovery-worker rows only.
        txHashes:
          type: object
          description: >-
            On-chain transaction hashes for each step that fired. Most routes
            use only `source`/`dest` (sometimes `approve`); venue-specific
            routes add `wrap`/`unwrap` (Polymarket), `safeExtract`/`safeDeposit`
            (Opinion), or `swap` (cross-token routes).
          properties:
            source:
              type: string
            dest:
              type: string
            approve:
              type: string
            unwrap:
              type: string
            wrap:
              type: string
            safeExtract:
              type: string
            safeDeposit:
              type: string
            swap:
              type: string
        explorerLink:
          type: string
          nullable: true
          description: >-
            Bridge-explorer URL for cross-chain transfers. `null` for same-chain
            transfers.
        clientReferenceId:
          type: string
          nullable: true
        createdAt:
          type: string
        completedAt:
          type: string
          nullable: true
        error:
          type: string
          nullable: true
          description: Human-readable failure message. Present iff `status === "failed"`.
        errorCode:
          type: string
          nullable: true
          description: Machine-readable failure code. Present iff `status === "failed"`.
    ApiError:
      type: object
      description: >-
        Unified error envelope returned by every endpoint on any 4xx or 5xx
        response. The `error` field is a stable snake_case code partners can
        branch on; `message` is the human-readable explanation (free-form, may
        change); `requestId` is the request correlation id (also returned in the
        `x-request-id` response header) — quote it when contacting support.
      required:
        - error
        - message
        - requestId
      properties:
        error:
          type: string
          description: >-
            Stable machine-readable code. See [Error
            codes](/trading-api/error-codes) for the full list. Snake_case,
            never renamed once shipped.
          example: insufficient_balance
        message:
          type: string
          description: >-
            Human-readable explanation. Free-form text that may include
            specifics (amounts, IDs, hints); do not parse — branch on `error`
            instead.
          example: 'Insufficient balance: need 50.000000, have 12.500000'
        requestId:
          type: string
          format: uuid
          description: >-
            Request correlation id. Quote this when filing a support ticket.
            Also returned in the `x-request-id` response header on every
            response (success or failure).
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````