---
title: "Register a transfer draft for platform approval"
method: POST
path: "/v1/transfer-drafts"
tags: ["Transfer drafts"]
---

# Register a transfer draft for platform approval

`POST /v1/transfer-drafts`

## Request

- Base URL: `https://sandbox.api.infinite.dev`
- URL: `https://sandbox.api.infinite.dev/v1/transfer-drafts`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
- TypeScript: <https://skmtc.dev/infinite/apis/infinite-api/docs/v1/transfer-drafts/post.ts> (a function with typed inputs; its response is checked against the schema)

Registers an MCP transfer draft (`tdraft_…`) as pending platform approval. Customer must belong to the caller organization. Idempotent for the same draftId + draftHash. Does not move money.

## Headers

- `X-API-Key` string

## Request body

- RegisterTransferDraftDto
  - `draftId` string, required: MCP transfer draft id from create_transfer_draft.
  - `draftHash` string, required: SHA-256 hex prefix of the canonical create payload (requestDigest). Bound at approve so post-approve tampering invalidates execute.
  - `customerId` string, required: Bound Connect customer that owns the draft.
  - `draftSnapshot` LaneATransferDraftLinkSnapshotDto
    - `draftId` string, required
    - `customerId` string, required
    - `amountMinor` string, required
    - `sourceCurrency` string, required
    - `destinationCurrency` string, required
    - `destinationAccountId` string, required
    - `destinationRail` string, required
    - `sourceAccountId` string, nullable, required
    - `sourceRail` string, nullable, required
    - `paymentReason` string, nullable, required
    - `reference` string, nullable, required
    - `destinationCountry` string, nullable, required
    - `destinationCountryRequested` string, nullable
    - `requestDigest` string, required
    - `destinationAmountMinor` string, nullable
  - `destinationAccountIds` string[]: Payee / destination account ids. When draftSnapshot is present these must match destinationAccountId (derived server-side). Ignored when draftSnapshot is omitted (stored as empty; approve fails closed).
  - `quotedDestinationAmountMinor` string: Destination payout minor units from the MCP indicative quote when source and destination currencies differ. Omit for same-currency drafts.

## Response `201`

Transfer draft registered

- TransferDraftPublicResponseDto
  - `id` string, required
  - `draftId` string, required
  - `customerId` string, required
  - `draftHash` string, required
  - `destinationAccountIds` string[], required: Payee account ids bound at registration and screened at approve.
  - `status` 'PENDING_APPROVAL' | 'SCREENING' | 'APPROVED' | 'REJECTED', required
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

## Other responses

- `401`: Unauthorized - Invalid or missing authentication credentials

## Changes

- **2026-10-03** `9f50af0b2ebf`: 1 warning, 3 info
  - added the new `SCREENING` enum value to the `status` response property for the response status `201`
  - added the new optional request property `destinationAccountIds`
  - added the new optional request property `draftSnapshot`
  - added the required property `destinationAccountIds` to the response with the `201` status
- **2026-10-02** `603402a92e85`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/infinite/apis/infinite-api/changes/v1/transfer-drafts/post.md)

---

[API](https://skmtc.dev/infinite/apis/infinite-api.md) - [All operations](https://skmtc.dev/infinite/apis/infinite-api/llms.txt) - [OpenAPI document](https://skmtc.dev/infinite/apis/infinite-api/revisions/90065d3e6974?raw)
