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

# Submit Off-Ramp Transaction Hash

> Reports the on-chain hash of the transaction the user sent to fund an off-ramp. Optional: deposits are detected automatically; the hash speeds up the match and resolves it when the automatic detection did not arrive.

The hash alone never moves the operation. Kravata checks it with the custodian: the transaction must be confirmed, sent to the deposit `address` of the operation, for the exact `amount`, from the declared external wallet. If it matches, the off-ramp continues (compliance review, then the fiat payout). Verification is retried automatically until `expiresAt`; after that, submit the hash again to trigger a new one.

You can resubmit the same hash (idempotent) or correct it while the operation is `AWAITING_DEPOSIT`.

#### Request

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Authorization | Header | Yes | `Bearer <access_token>` obtained from **POST /api/v1/client/token**. |
| user_id | Path | Yes | User who owns the off-ramp. |
| operation_id | Path | Yes | `operation.id` returned by **POST /admin/operation/&#123;user_id&#125;/withdrawal** with `originExternalWalletId`. |

#### Request Body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| txHash | string | Yes | On-chain transaction hash. EVM networks: `0x` + 64 hex characters; TRON / Stellar: 64 hex characters; Solana / SUI: base58. |

#### Response

`202 Accepted`

| Field | Description |
| --- | --- |
| operationId | The off-ramp operation. |
| txHash | The hash as stored (normalized). |
| status | `VERIFYING`. Follow the result with **GET /admin/operation/&#123;user_id&#125;/withdrawal/&#123;operation_id&#125;/hash**. |

#### Errors

| Status | When |
| --- | --- |
| 404 | The operation does not exist, does not belong to the user, or is not an off-ramp funded from an external wallet. |
| 409 | The operation is no longer `AWAITING_DEPOSIT`, or the hash is already declared for another operation. |
| 422 | `txHash` is missing or not a valid hash for the network of the deposit address. |



## OpenAPI

````yaml /stack/openapi.json post /api/v1/admin/operation/{user_id}/withdrawal/{operation_id}/hash
openapi: 3.1.0
info:
  title: Kravata Stack API
  version: '2.0'
  description: >-
    Kravata Stack API: users, accounts, custody wallets, liquidity ramps and
    fiat payments.
servers:
  - url: https://test-api-kore.kravata.co
    description: Test
  - url: https://partners-api.kravata.co
    description: Production (mTLS + IP allowlist)
security:
  - bearerAuth: []
tags:
  - name: Authentication
  - name: Users
  - name: Accounts
  - name: Earn
  - name: Custody
  - name: Liquidity Ramps
  - name: Payments
  - name: Webhooks
  - name: Request Logs
paths:
  /api/v1/admin/operation/{user_id}/withdrawal/{operation_id}/hash:
    post:
      tags:
        - Liquidity Ramps
      summary: Submit Off-Ramp Transaction Hash
      description: >-
        Reports the on-chain hash of the transaction the user sent to fund an
        off-ramp. Optional: deposits are detected automatically; the hash speeds
        up the match and resolves it when the automatic detection did not
        arrive.


        The hash alone never moves the operation. Kravata checks it with the
        custodian: the transaction must be confirmed, sent to the deposit
        `address` of the operation, for the exact `amount`, from the declared
        external wallet. If it matches, the off-ramp continues (compliance
        review, then the fiat payout). Verification is retried automatically
        until `expiresAt`; after that, submit the hash again to trigger a new
        one.


        You can resubmit the same hash (idempotent) or correct it while the
        operation is `AWAITING_DEPOSIT`.


        #### Request


        | Field | Type | Required | Description |

        | --- | --- | --- | --- |

        | Authorization | Header | Yes | `Bearer <access_token>` obtained from
        **POST /api/v1/client/token**. |

        | user_id | Path | Yes | User who owns the off-ramp. |

        | operation_id | Path | Yes | `operation.id` returned by **POST
        /admin/operation/&#123;user_id&#125;/withdrawal** with
        `originExternalWalletId`. |


        #### Request Body


        | Field | Type | Required | Description |

        | --- | --- | --- | --- |

        | txHash | string | Yes | On-chain transaction hash. EVM networks: `0x`
        + 64 hex characters; TRON / Stellar: 64 hex characters; Solana / SUI:
        base58. |


        #### Response


        `202 Accepted`


        | Field | Description |

        | --- | --- |

        | operationId | The off-ramp operation. |

        | txHash | The hash as stored (normalized). |

        | status | `VERIFYING`. Follow the result with **GET
        /admin/operation/&#123;user_id&#125;/withdrawal/&#123;operation_id&#125;/hash**.
        |


        #### Errors


        | Status | When |

        | --- | --- |

        | 404 | The operation does not exist, does not belong to the user, or is
        not an off-ramp funded from an external wallet. |

        | 409 | The operation is no longer `AWAITING_DEPOSIT`, or the hash is
        already declared for another operation. |

        | 422 | `txHash` is missing or not a valid hash for the network of the
        deposit address. |
      operationId: submit-off-ramp-transaction-hash
      parameters:
        - name: user_id
          in: path
          required: true
          description: ''
          schema:
            type: string
            format: uuid
        - name: operation_id
          in: path
          required: true
          description: ''
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txHash:
                  type: string
            example:
              txHash: '{{tx_hash}}'
      responses:
        '200':
          description: Successful response
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Access token from POST /api/v1/client/token.

````

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