# Internal transfers

the internal-transfers API

## Transfer funds between two tenants within the same omnibus

 - [POST /v1/domains/{domainId}/omnibus/{omnibusId}/tenants/{tenantId}/internal-transfers](https://docs.ripple.com/products/custody/reference/api/openapi/internal-transfers/createinternaltransfer.md): Moves an amount from a source tenant to a destination tenant within the same omnibus by recording a cross-account entry in the Accounting service. Asynchronous: accepts the request, durably persists the operation, starts a Temporal workflow (validate → reserve → post to Accounting → finalize), and returns 202 with status=PENDING immediately. Poll GET .../internal-transfers/{operationId} for the terminal status. A required, per-transfer Idempotency-Key makes retries safe — reuse the same key to retry a transfer, use a new key for a new transfer. See InternalTransferStatus for the meaning of each status.

## List internal transfers for an omnibus (paginated)

 - [GET /v1/domains/{domainId}/omnibus/{omnibusId}/internal-transfers](https://docs.ripple.com/products/custody/reference/api/openapi/internal-transfers/getinternaltransfers.md)

## Get a single internal transfer by operation ID

 - [GET /v1/domains/{domainId}/omnibus/{omnibusId}/internal-transfers/{operationId}](https://docs.ripple.com/products/custody/reference/api/openapi/internal-transfers/getinternaltransfer.md): Returns the current state of an internal transfer. Clients poll this after a 202 from the create endpoint until the status is terminal (COMPLETED or FAILED) or PENDING_VERIFICATION. Reads are eventually consistent.

