---
title: "Create a transfer"
method: POST
path: "/v1/transfers"
tags: ["Transfers"]
---

# Create a transfer

`POST /v1/transfers`

## Request

- Base URL: `https://api.scrip.dev`
- URL: `https://api.scrip.dev/v1/transfers`
- Auth: HTTP bearer

Atomically transfer an ACTIVE asset from one participant or group to one or more recipients. Archived assets reject new transfers.

## Headers

- `Idempotency-Key` string

## Request body

- CreateTransferRequest: Moves an amount of an asset from one participant or group to one or more recipients.
  - `asset_id` string, uuid, required: Asset being transferred
  - `description` string, required: Human-readable explanation of the transfer's purpose
  - `idempotency_key` string: Your key for this transfer. You can send it in the Idempotency-Key header instead; when both are sent they must match.
  - `program_id` string, uuid, required: Program this transfer belongs to
  - `recipients` TransferRecipient[], required: List of transfer recipients (1 to 100)
    - `amount` string, required: Quantity to transfer to this recipient (decimal string for precision)
    - `external_id` string: Recipient participant's external ID (mutually exclusive with `group_id` and `participant_id`)
    - `group_id` string, uuid: Recipient group UUID (mutually exclusive with `external_id` and `participant_id`)
    - `participant_id` string, uuid: Recipient participant UUID (mutually exclusive with `external_id` and `group_id`)
  - `source_external_id` string: Source participant's external ID (mutually exclusive with `source_group_id` and `source_participant_id`)
  - `source_group_id` string, uuid: Source group UUID (mutually exclusive with `source_external_id` and `source_participant_id`)
  - `source_participant_id` string, uuid: Source participant UUID (mutually exclusive with `source_external_id` and `source_group_id`)

## Response `201`

Transfer completed with journal entry ID

- TransferResponse: The result of a transfer: the journal entry that recorded it and the total amount moved.
  - `asset_id` string, uuid: Asset that was transferred
  - `journal_entry_id` string, uuid: Journal entry created for this transfer (use for audit trails)
  - `recipient_count` integer: Number of recipients in this transfer
  - `source_id` string, uuid: Scrip's id for the source participant or group
  - `total_amount` string: Sum of all recipient amounts

## Other responses

- `400`: Validation failed (code: validation_error)
- `401`: The API key is missing or not valid. See [Authentication](https://docs.scrip.dev/authentication).
- `403`: The caller is not allowed to do this.
- `404`: Program, asset, or group not found (code: program_not_found | asset_not_found | group_not_found)
- `409`: Recipient inactive, idempotency conflict, or another request changed the same balance at the same time (code: participant_inactive | program_inactive | idempotency_conflict | retryable_conflict)
- `422`: Insufficient funds, unknown participant, asset not linked or archived, or self-transfer (code: insufficient_funds | unknown_participant | asset_not_linked | asset_archived | archived_resource | self_transfer_not_allowed)
- `429`: Too many requests. Wait the number of seconds in the `Retry-After` header, then retry. See [Limits and durations](https://docs.scrip.dev/limits#rate-limits).
- `500`: Something failed on Scrip's side. Retry the request, and quote `request_id` if it keeps failing. [Errors](https://docs.scrip.dev/errors) lists every code, and the [API introduction](https://docs.scrip.dev/api-reference/introduction) describes the error format.

---

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