On-chain Operations
Create a Transfer
Send assets from a source to a destination.
Request example
{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}
# Sample only. Generate a new signed token for each request
# (see Authentication). Tokens expire after 120 seconds.
curl --request POST \
--url "https://api.primevault.com/api/external/transactions/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}'
const tx = await apiClient.createTransferTransaction({
source: { type: "VAULT", id: "vault_123" },
destination: { type: "CONTACT", id: "contact_456" },
amount: "0.50",
asset: "ETH",
chain: "ETHEREUM",
externalId: "invoice-1001",
memo: "Vendor payout #1001",
feePayer: { id: "vault_234" },
});
console.log(tx.id, tx.status);
{
"id": "transaction_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "TRANSFER",
"subCategory": "EXTERNAL_TRANSFER",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"source": {
"type": "VAULT",
"id": "vault_123",
"subOrgId": "sub_org_123",
"name": "Treasury Vault"
},
"destination": {
"type": "CONTACT",
"id": "contact_456",
"name": "Operations Wallet",
"address": "0xAbC1234567890abcdef1234567890abcdef1234",
"chain": "ETHEREUM"
},
"blockChain": "ETHEREUM",
"asset": "ETH",
"amount": "0.50"
}
POST
/api/external/transactions/
Use a transfer when you already know the source, destination, blockchain, asset, and amount. You can estimate the network fee first. The returned status is the lifecycle source of truth.
Request body
TransferPartyData
required
Sending party.
TransferPartyData
required
Receiving party.
string
required
Decimal transfer amount.
string
required
Asset symbol.
string
required
Blockchain identifier.
string
required
Must be
"TRANSFER".string
Client reference.
string
Human-readable note.
object
Vault that pays the network fee when the chain supports sponsored fee payment.
Show Properties
Show Properties
string
required
Vault ID that will pay the fee.
The SDK accepts
chain and serializes it as blockChain. It injects category: "TRANSFER".Response
{
"id": "transaction_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "TRANSFER",
"subCategory": "EXTERNAL_TRANSFER",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"source": {
"type": "VAULT",
"id": "vault_123",
"subOrgId": "sub_org_123",
"name": "Treasury Vault"
},
"destination": {
"type": "CONTACT",
"id": "contact_456",
"name": "Operations Wallet",
"address": "0xAbC1234567890abcdef1234567890abcdef1234",
"chain": "ETHEREUM"
},
"blockChain": "ETHEREUM",
"asset": "ETH",
"amount": "0.50"
}
JavaScript SDK
interface CreateTransferTransactionRequest {
source: TransferPartyData;
destination: TransferPartyData;
amount: string;
asset: string;
chain: string;
externalId?: string;
memo?: string;
feePayer?: { id: string };
}
createTransferTransaction(
request: CreateTransferTransactionRequest,
): Promise<Transaction>
Approve the transaction
New transfers returnstatus: "PENDING" and wait for approval. Get the approval message for the transaction id, sign it with your API user’s key, then submit the approval. See Approvals.
With the SDK, createTransactionWithApproval(request) creates and approves in one call. createTransferTransaction(request) only creates.
Request example
{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}
# Sample only. Generate a new signed token for each request
# (see Authentication). Tokens expire after 120 seconds.
curl --request POST \
--url "https://api.primevault.com/api/external/transactions/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}'
const tx = await apiClient.createTransferTransaction({
source: { type: "VAULT", id: "vault_123" },
destination: { type: "CONTACT", id: "contact_456" },
amount: "0.50",
asset: "ETH",
chain: "ETHEREUM",
externalId: "invoice-1001",
memo: "Vendor payout #1001",
feePayer: { id: "vault_234" },
});
console.log(tx.id, tx.status);
{
"id": "transaction_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "TRANSFER",
"subCategory": "EXTERNAL_TRANSFER",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"source": {
"type": "VAULT",
"id": "vault_123",
"subOrgId": "sub_org_123",
"name": "Treasury Vault"
},
"destination": {
"type": "CONTACT",
"id": "contact_456",
"name": "Operations Wallet",
"address": "0xAbC1234567890abcdef1234567890abcdef1234",
"chain": "ETHEREUM"
},
"blockChain": "ETHEREUM",
"asset": "ETH",
"amount": "0.50"
}
⌘I
Request example
{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}
# Sample only. Generate a new signed token for each request
# (see Authentication). Tokens expire after 120 seconds.
curl --request POST \
--url "https://api.primevault.com/api/external/transactions/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"source": { "type": "VAULT", "id": "vault_123" },
"destination": { "type": "CONTACT", "id": "contact_456" },
"amount": "0.50",
"asset": "ETH",
"blockChain": "ETHEREUM",
"category": "TRANSFER",
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"feePayer": { "id": "vault_234" }
}'
const tx = await apiClient.createTransferTransaction({
source: { type: "VAULT", id: "vault_123" },
destination: { type: "CONTACT", id: "contact_456" },
amount: "0.50",
asset: "ETH",
chain: "ETHEREUM",
externalId: "invoice-1001",
memo: "Vendor payout #1001",
feePayer: { id: "vault_234" },
});
console.log(tx.id, tx.status);
{
"id": "transaction_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "TRANSFER",
"subCategory": "EXTERNAL_TRANSFER",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "invoice-1001",
"memo": "Vendor payout #1001",
"source": {
"type": "VAULT",
"id": "vault_123",
"subOrgId": "sub_org_123",
"name": "Treasury Vault"
},
"destination": {
"type": "CONTACT",
"id": "contact_456",
"name": "Operations Wallet",
"address": "0xAbC1234567890abcdef1234567890abcdef1234",
"chain": "ETHEREUM"
},
"blockChain": "ETHEREUM",
"asset": "ETH",
"amount": "0.50"
}