Ramps
Execute a Ramp Quote
Create a ramp transaction from a selected quoteId. Returns HTTP 201 with the full Transaction.
Request example
{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}
# 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/intent/create/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}'
const transaction = await apiClient.createTransactionFromIntent({
quoteId: "quote_ramp_payroll_1042",
externalId: "payroll-top-up-1042",
memo: "Convert 10000 USDC to USD for payroll",
});
console.log(transaction.id, transaction.status);
Response example
{
"id": "transaction_ramp_payroll_1042",
"orgId": "org_456",
"vaultId": "vault_usdc_treasury",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "RAMP",
"subCategory": "OFF_RAMP",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll",
"blockChain": "ETHEREUM",
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"balanceChanges": {
"changes": [
{
"party": { "type": "VAULT", "id": "vault_usdc_treasury" },
"asset": "USDC",
"amount": "-10000.00",
"chain": "ETHEREUM"
},
{
"party": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll" },
"asset": "USD",
"amount": "9975.00",
"paymentRail": "ACH"
}
]
},
"fees": {
"amount": "25.00",
"asset": "USDC"
},
"quoteResponse": {
"quoteId": "quote_ramp_payroll_1042",
"rate": "1",
"fees": { "amount": "25.00", "asset": "USDC" },
"input": { "asset": "USDC", "amount": "10000.00" },
"output": { "asset": "USD", "amount": "9975.00", "vaultId": "vault_usd_settlement" },
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"expiresAt": "2026-09-30T10:00:30+00:00"
}
}
interface Transaction {
id: string;
orgId: string;
vaultId: string;
status: TransactionStatus | string;
transactionType: TransactionType | string;
category: TransactionCategory | string;
subCategory: TransactionSubCategory | string;
createdAt: string;
updatedAt: string;
isDeleted: boolean;
amount: string;
txHash?: string;
error?: string;
externalId?: string;
createdById?: string;
fees?: Fees;
memo?: string;
txnSignature?: string;
txnSignatureData?: Record<string, unknown>;
output?: TransactionOutput;
amountInUSD?: string;
nonce?: number;
dAppId?: string;
source?: TransferPartyData;
destination?: TransferPartyData;
quoteResponse?: QuoteResponseItem;
depositInstructions?: DepositInstructions;
operations?: TransactionOperation[];
balanceChanges?: TransactionOperationBalanceChanges | null;
blockChain?: string;
asset?: string;
/** Deprecated: use destination.address. */
toAddress?: string;
/** Deprecated: use destination.name. */
toAddressName?: string;
/** Deprecated: use destination.id. */
toVaultId?: string;
/** Deprecated: use source.address. */
sourceAddress?: string;
}
POST
/api/external/transactions/intent/create/
Example: executes the off-ramp quote quote_ramp_payroll_1042, converting 10,000 USDC into 9,975 USD (after a 25 USDC fee) for a payroll bank account.
Request body
null
Send
null when executing a quote. Do not repeat the quote intent.string
Client reference.
string
Human-readable note.
Response
Returns HTTP 201 with a full Transaction. Optional fields depend on the payment route and status.string
Transaction ID. Use it with Retrieve Transaction to track status.
string
Lifecycle status. Track it until
COMPLETED, FAILED, or DECLINED.QuoteResponseItem
The executed quote, including its
input, output, source, destination, and expiresAt. See QuoteResponseItem.TransferPartyData
Where the funds come from, as a TransferPartyData. Which fields are present depends on
type.TransferPartyData
Where the funds go. Same fields as
source. See TransferPartyData.TransactionOperationBalanceChanges | null
Aggregate balance movements across the transaction, when present: the input asset debited and the output asset credited. See TransactionOperationBalanceChanges.
Show Properties
Show Properties
TransactionOperationBalanceChange[]
One entry per party and asset. See TransactionOperationBalanceChange.
DepositInstructions
Present when funding is required. Use the returned details exactly. See DepositInstructions.
Executing a quote creates a transaction in
PENDING that waits for approval. Get the approval message for the transaction id, sign it, then submit the approval. The SDK’s createTransactionFromIntent() does this for you and returns the updated transaction. See Approvals.Request example
{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}
# 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/intent/create/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}'
const transaction = await apiClient.createTransactionFromIntent({
quoteId: "quote_ramp_payroll_1042",
externalId: "payroll-top-up-1042",
memo: "Convert 10000 USDC to USD for payroll",
});
console.log(transaction.id, transaction.status);
Response example
{
"id": "transaction_ramp_payroll_1042",
"orgId": "org_456",
"vaultId": "vault_usdc_treasury",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "RAMP",
"subCategory": "OFF_RAMP",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll",
"blockChain": "ETHEREUM",
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"balanceChanges": {
"changes": [
{
"party": { "type": "VAULT", "id": "vault_usdc_treasury" },
"asset": "USDC",
"amount": "-10000.00",
"chain": "ETHEREUM"
},
{
"party": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll" },
"asset": "USD",
"amount": "9975.00",
"paymentRail": "ACH"
}
]
},
"fees": {
"amount": "25.00",
"asset": "USDC"
},
"quoteResponse": {
"quoteId": "quote_ramp_payroll_1042",
"rate": "1",
"fees": { "amount": "25.00", "asset": "USDC" },
"input": { "asset": "USDC", "amount": "10000.00" },
"output": { "asset": "USD", "amount": "9975.00", "vaultId": "vault_usd_settlement" },
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"expiresAt": "2026-09-30T10:00:30+00:00"
}
}
interface Transaction {
id: string;
orgId: string;
vaultId: string;
status: TransactionStatus | string;
transactionType: TransactionType | string;
category: TransactionCategory | string;
subCategory: TransactionSubCategory | string;
createdAt: string;
updatedAt: string;
isDeleted: boolean;
amount: string;
txHash?: string;
error?: string;
externalId?: string;
createdById?: string;
fees?: Fees;
memo?: string;
txnSignature?: string;
txnSignatureData?: Record<string, unknown>;
output?: TransactionOutput;
amountInUSD?: string;
nonce?: number;
dAppId?: string;
source?: TransferPartyData;
destination?: TransferPartyData;
quoteResponse?: QuoteResponseItem;
depositInstructions?: DepositInstructions;
operations?: TransactionOperation[];
balanceChanges?: TransactionOperationBalanceChanges | null;
blockChain?: string;
asset?: string;
/** Deprecated: use destination.address. */
toAddress?: string;
/** Deprecated: use destination.name. */
toAddressName?: string;
/** Deprecated: use destination.id. */
toVaultId?: string;
/** Deprecated: use source.address. */
sourceAddress?: string;
}
⌘I
Request example
{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}
# 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/intent/create/" \
--header "Authorization: Bearer <signed JWT>" \
--header "Api-Key: <API key>" \
--header "Content-Type: application/json" \
--data '{
"intent": null,
"quoteId": "quote_ramp_payroll_1042",
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll"
}'
const transaction = await apiClient.createTransactionFromIntent({
quoteId: "quote_ramp_payroll_1042",
externalId: "payroll-top-up-1042",
memo: "Convert 10000 USDC to USD for payroll",
});
console.log(transaction.id, transaction.status);
Response example
{
"id": "transaction_ramp_payroll_1042",
"orgId": "org_456",
"vaultId": "vault_usdc_treasury",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "RAMP",
"subCategory": "OFF_RAMP",
"createdAt": "2026-08-04T10:40:00Z",
"updatedAt": "2026-08-04T10:40:00Z",
"isDeleted": false,
"externalId": "payroll-top-up-1042",
"memo": "Convert 10000 USDC to USD for payroll",
"blockChain": "ETHEREUM",
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"balanceChanges": {
"changes": [
{
"party": { "type": "VAULT", "id": "vault_usdc_treasury" },
"asset": "USDC",
"amount": "-10000.00",
"chain": "ETHEREUM"
},
{
"party": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll" },
"asset": "USD",
"amount": "9975.00",
"paymentRail": "ACH"
}
]
},
"fees": {
"amount": "25.00",
"asset": "USDC"
},
"quoteResponse": {
"quoteId": "quote_ramp_payroll_1042",
"rate": "1",
"fees": { "amount": "25.00", "asset": "USDC" },
"input": { "asset": "USDC", "amount": "10000.00" },
"output": { "asset": "USD", "amount": "9975.00", "vaultId": "vault_usd_settlement" },
"source": { "type": "VAULT", "id": "vault_usdc_treasury", "chain": "ETHEREUM" },
"destination": { "type": "BANK_ACCOUNT", "id": "bank_account_usd_payroll", "paymentRail": "ACH" },
"expiresAt": "2026-09-30T10:00:30+00:00"
}
}
interface Transaction {
id: string;
orgId: string;
vaultId: string;
status: TransactionStatus | string;
transactionType: TransactionType | string;
category: TransactionCategory | string;
subCategory: TransactionSubCategory | string;
createdAt: string;
updatedAt: string;
isDeleted: boolean;
amount: string;
txHash?: string;
error?: string;
externalId?: string;
createdById?: string;
fees?: Fees;
memo?: string;
txnSignature?: string;
txnSignatureData?: Record<string, unknown>;
output?: TransactionOutput;
amountInUSD?: string;
nonce?: number;
dAppId?: string;
source?: TransferPartyData;
destination?: TransferPartyData;
quoteResponse?: QuoteResponseItem;
depositInstructions?: DepositInstructions;
operations?: TransactionOperation[];
balanceChanges?: TransactionOperationBalanceChanges | null;
blockChain?: string;
asset?: string;
/** Deprecated: use destination.address. */
toAddress?: string;
/** Deprecated: use destination.name. */
toAddressName?: string;
/** Deprecated: use destination.id. */
toVaultId?: string;
/** Deprecated: use source.address. */
sourceAddress?: string;
}