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

# Get Transfer Status

> Check the status of a gasless subwallet transfer by its operation ID

> [!NOTE]
>
> **Auth method: Signed (HMAC)** — this endpoint requires the full set of signed
> headers: `x-access-id`, `x-request-id`, `x-timestamp`, and an HMAC-SHA256
> `authorization` signature. See [Authentication](/api-reference/authentication.md#signed-hmac-authentication).

Use this endpoint to follow a gasless token transfer after
[Transfer Funds](/api-reference/endpoint/subwallets/transfer.md) returned `202` with an
`operation_id`. You can only look up operations created by your own merchant account.

The HTTP status tells you whether the operation is final:

* **`200`**: the operation has settled (succeeded or failed).
* **`202`**: the operation is still in progress. Poll again later.

You don't have to poll: Tender also sends `sub_user_wallet_transfer_confirmed` or
`sub_user_wallet_transfer_failed` when the operation settles. If you poll, keep the interval at
10 seconds or more; this endpoint counts against the subwallet rate limit.

## Status values

`status` is returned as-is from the gasless network and depends on the chain:

| Chain | In progress (`202`) | Succeeded (`200`) | Failed (`200`) |
| - | - | - | - |
| `EVM` | `pending` | `succeeded` | `failed` |
| `TRON` | `waiting`, `inprogress`, `confirming` | `succeed` | `failed` |

Treat any value other than `succeeded`, `succeed` or `failed` as in progress.

## Example

```javascript Node.js theme={null}
const res = await fetch(`${BASE}/wallet/transfer/status`, {
  method: 'POST',
  headers: makeHeaders(),
  body: JSON.stringify({
    network:      'TRON',
    operation_id: 'f3b0c2d1e4a5...',
  }),
});

const { data } = await res.json();
if (res.status === 202) {
  // still in progress — data.status e.g. "inprogress"
} else if (data.status === 'failed') {
  // data.message explains why
} else {
  // settled — data.transaction_hash is the on-chain hash
}
```

```python Python theme={null}
res = requests.post(
    f"{BASE}/wallet/transfer/status",
    headers=make_headers(),
    json={"network": "TRON", "operation_id": "f3b0c2d1e4a5..."},
)
data = res.json()["data"]
final = res.status_code == 200
```

## Headers

**authorization** `string` *required*

Base64-encoded HMAC-SHA256 signature of `{"timeStamp":"<x-timestamp>","requestId":"<x-request-id>","accessId":"<x-access-id>"}`, signed with your access secret. The request body is not part of the signature.

**Example:** `"pV3n0o8kq0lK2mJ8bZ1yq3Yt6hR0cXK9u4mVJ2l9sE0="`

**x-timestamp** `string` *required*

ISO 8601 timestamp; must be within 5 minutes of server time

**Example:** `"2026-10-15T09:45:53.000Z"`

**x-request-id** `string` *required*

A unique UUID v4 per request

**Example:** `"550e8400-e29b-41d4-a716-446655440000"`

**x-access-id** `string` *required*

Your API access ID

**Example:** `"your-access-id-here"`

**Content-Type** `string` *required*

**Example:** `"application/json"`

## Body

**network** `string` *required*

Network of the transfer: `EVM` for `ethereum` transfers or `TRON` for `tron` transfers. The
aliases `ethereum`, `eth` and `trx` are also accepted, case-insensitively. Bitcoin transfers are
never gasless.

**Example:** `"TRON"`

**operation\_id** `string` *required*

The `operation_id` returned by [Transfer Funds](/api-reference/endpoint/subwallets/transfer.md).

**Example:** `"f3b0c2d1e4a5..."`

## Response

**status** `string` *required*

**Example:** `"success"`

**message** `string` *required*

**Example:** `"transfer status retrieved"`

**data** `object` *required*

**data properties**

**operation\_id** `string`

**Example:** `"f3b0c2d1e4a5..."`

**status** `string`

Operation status. See [Status values](#status-values).

**Example:** `"succeed"`

**transaction\_hash** `string`

On-chain transaction hash once known; empty string before that.

**Example:** `"7c1e9a..."`

**message** `string`

Extra detail, mainly the failure reason. Often an empty string.

**Example:** `""`

**confirmation\_count** `integer`

On-chain confirmations recorded so far. `0` until the transaction is confirmed.

**Example:** `1`

**provider** `string`

Identifier of the gasless service that ran the transfer, returned as-is.

**Example:** `"gasfree"`

## Error responses

| Condition | Status | Message |
| - | - | - |
| Missing or invalid field | 400 | Validation message, e.g. `operation_id must be a string` |
| Unknown operation, or one created by another merchant | 404 | `Transfer operation not found` |
| Network not supported for status lookups | 400 | Message describing the problem |
| Wallet service unavailable | 503 | `Wallet service is temporarily unavailable. Please try again.` |


## OpenAPI

````yaml POST /v1/api/wallet/transfer/status
openapi: 3.1.0
info:
  title: Tender API
  description: Tender Developer API for cryptocurrency payments and agent management
  version: 2.0.0
  contact:
    name: Tender Support
    url: https://tender.cash
servers:
  - url: https://secureapi.tender.cash
    description: Production Server
  - url: https://sandbox-api.tender.cash
    description: Sandbox Server
security:
  - SignedAuth: []
tags:
  - name: Agents
    description: Manage agents and sub-businesses
  - name: Transactions
    description: Payment and transaction operations
  - name: System
    description: System information and configuration
  - name: Webhooks
    description: Webhook management and logs
  - name: On-ramp
    description: Fiat-to-crypto on-ramp operations
  - name: Payouts
    description: Send crypto from merchant balance to a wallet address or payout account
  - name: Subwallets
    description: Provision and manage crypto wallet infrastructure for your end-users
  - name: Conversions
    description: Swap crypto between coins and chains, or convert to a payout account
paths:
  /v1/api/wallet/transfer/status:
    post:
      tags:
        - Subwallets
      summary: Get Transfer Status
      description: >-
        Get the status of a gasless transfer by operation_id. Returns 200 when
        final, 202 while in progress. Only your own operations are visible.
      operationId: getSubWalletTransferStatus
      parameters:
        - name: authorization
          in: header
          required: true
          description: >-
            Base64-encoded HMAC-SHA256 signature of
            {"timeStamp":"<x-timestamp>","requestId":"<x-request-id>","accessId":"<x-access-id>"},
            signed with your access secret. The request body is not part of the
            signature.
          schema:
            type: string
          example: pV3n0o8kq0lK2mJ8bZ1yq3Yt6hR0cXK9u4mVJ2l9sE0=
        - name: x-timestamp
          in: header
          required: true
          description: ISO 8601 timestamp; must be within 5 minutes of server time
          schema:
            type: string
            format: date-time
          example: '2026-10-15T09:45:53.000Z'
        - name: x-request-id
          in: header
          required: true
          description: A unique UUID v4 per request
          schema:
            type: string
            format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        - name: x-access-id
          in: header
          required: true
          schema:
            type: string
          example: your-access-id-here
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
          example: application/json
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubwalletTransferStatusRequest'
            example:
              network: TRON
              operation_id: f3b0c2d1e4a5...
      responses:
        '200':
          description: Operation settled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletTransferStatusResponse'
              example:
                status: success
                message: transfer status retrieved
                data:
                  operation_id: f3b0c2d1e4a5...
                  status: succeed
                  transaction_hash: 7c1e9a...
                  message: ''
                  confirmation_count: 1
                  provider: gasfree
        '202':
          description: Operation in progress
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletTransferStatusResponse'
              example:
                status: success
                message: transfer status retrieved
                data:
                  operation_id: f3b0c2d1e4a5...
                  status: inprogress
                  transaction_hash: ''
                  message: ''
                  confirmation_count: 0
                  provider: gasfree
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletErrorResponse'
              example:
                status: error
                message: operation_id must be a string
                data: null
        '401':
          description: Missing or invalid signature
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletErrorResponse'
              example:
                status: error
                message: INVALID_REQUEST_SIGNATURE
                data: null
        '404':
          description: Operation not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletErrorResponse'
              example:
                status: error
                message: Transfer operation not found
                data: null
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletErrorResponse'
              example:
                status: error
                message: Too many requests. Max 120 per 60s.
                data: null
        '503':
          description: Wallet service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubwalletErrorResponse'
              example:
                status: error
                message: Wallet service is temporarily unavailable. Please try again.
                data: null
      security:
        - SignedAuth: []
components:
  schemas:
    SubwalletTransferStatusRequest:
      type: object
      required:
        - network
        - operation_id
      properties:
        network:
          type: string
          description: EVM or TRON (aliases ethereum, eth, trx accepted).
          example: TRON
        operation_id:
          type: string
          example: f3b0c2d1e4a5...
    SubwalletTransferStatusResponse:
      type: object
      properties:
        status:
          type: string
          example: success
        message:
          type: string
          example: transfer status retrieved
        data:
          type: object
          properties:
            operation_id:
              type: string
            status:
              type: string
              description: >-
                Returned as-is. EVM: pending, succeeded, failed. TRON: waiting,
                inprogress, confirming, succeed, failed.
              example: succeed
            transaction_hash:
              type: string
              description: Empty string until known.
            message:
              type: string
              description: Mainly the failure reason; often empty.
            confirmation_count:
              type: integer
              example: 1
            provider:
              type: string
              description: Gasless service identifier, returned as-is.
              example: gasfree
    SubwalletErrorResponse:
      type: object
      required:
        - status
        - message
      properties:
        status:
          type: string
          example: error
        message:
          type: string
        data:
          nullable: true
          description: Usually null or an empty object.
  securitySchemes:
    SignedAuth:
      type: apiKey
      in: header
      name: authorization
      description: >-
        Signed (HMAC) authentication. Required headers: x-access-id,
        x-request-id (UUID v4), x-timestamp (ISO 8601, must be within 5 minutes
        of server time), and authorization: the Base64 HMAC-SHA256 of the JSON
        string
        {"timeStamp":"<x-timestamp>","requestId":"<x-request-id>","accessId":"<x-access-id>"}
        (keys in that order, no whitespace) using your access secret. The
        request body, method and path are not signed. The API key must be linked
        to an outlet.

````

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