---
title: "Create an internal Connect transfer"
method: POST
path: "/api/connect/transfers"
tags: ["Connect Transfers"]
---

# Create an internal Connect transfer

`POST /api/connect/transfers`

Moves custodial funds from the authenticated marketplace to one of its sub-merchants. Only the MARKETPLACE → SUB_MERCHANT direction is allowed: `originId` MUST be the authenticated marketplace and `destinationId` MUST be a sub-merchant it owns. The amount is debited from the marketplace custodial wallet and credited to the sub-merchant custodial wallet on Base.

Privy-custodial origins settle synchronously (`CONFIRMED`). Bridge-custodial origins are submitted asynchronously (`PROCESSING`) and confirmed later via webhook. Provide an `idempotencyKey` to safely retry without double-spending.

## Request body

- CreateMarketplaceTransferDto
  - `originId` string, required — User id of the account to debit. MUST be the authenticated marketplace account.
  - `destinationId` string, required — User id of the account to credit. MUST be a sub-merchant owned by the authenticated marketplace.
  - `amountInCents` number, required — Amount to transfer, in minor units (cents). Must be a positive integer.
  - `currency` 'USDC' | 'EURC' — Stablecoin to move. Defaults to USDC.
  - `idempotencyKey` string — Caller-supplied idempotency key. Re-sending the same key returns the existing transfer instead of creating a duplicate.
  - `description` string — Free-form description stored on the transfer record.
  - `metadata` object — Arbitrary metadata attached to the transfer.

## Response `201`

Transfer created

- MarketplaceTransferDto
  - `id` string, required
  - `marketplaceUserId` string, required
  - `originUserId` string, required
  - `destinationUserId` string, required
  - `amountInCents` number, required
  - `currency` 'USDC' | 'EURC', required
  - `status` 'INITIATED' | 'PROCESSING' | 'CONFIRMED' | 'FAILED', required — `CONFIRMED` is terminal-success. `PROCESSING` means the on-chain transfer was submitted and is awaiting confirmation (Bridge origins). `FAILED` is terminal-failure.
  - `provider` 'privy' | 'bridge', required
  - `reference` string, nullable
  - `txHash` string, nullable
  - `failReason` string, nullable
  - `description` string, nullable
  - `metadata` object, nullable
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

---

[API](https://skmtc.dev/inflowpay/apis/inflow-api.md) · [All operations](https://skmtc.dev/inflowpay/apis/inflow-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/inflowpay/inflow-api/revisions/3012dd3dd14a/schema)
