> ## Documentation Index
> Fetch the complete documentation index at: https://docs.primevault.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Execute a Ramp Quote

> Create a ramp transaction from a selected quoteId. Returns HTTP 201 with the full Transaction.

**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

<ParamField body="quoteId" type="string" required>
  The `quoteId` returned by [Get Quote](/transactions/ramps/get-quote).
</ParamField>

<ParamField body="intent" type="null">
  Send `null` when executing a quote. Do not repeat the quote intent.
</ParamField>

<ParamField body="externalId" type="string">
  Client reference.
</ParamField>

<ParamField body="memo" type="string">
  Human-readable note.
</ParamField>

## Response

Returns HTTP 201 with a full [Transaction](/api-basics/data-models#transaction). Optional fields depend on the payment route and status.

<ResponseField name="id" type="string">
  Transaction ID. Use it with [Retrieve Transaction](/transactions/retrieve-transaction) to track status.
</ResponseField>

<ResponseField name="status" type="string">
  Lifecycle status. Track it until `COMPLETED`, `FAILED`, or `DECLINED`.
</ResponseField>

<ResponseField name="quoteResponse" type="QuoteResponseItem">
  The executed quote, including its `input`, `output`, `source`, `destination`, and `expiresAt`. See [QuoteResponseItem](/api-basics/data-models#quoteresponseitem).
</ResponseField>

<ResponseField name="source" type="TransferPartyData">
  Where the funds come from, as a [TransferPartyData](/api-basics/data-models#transferpartydata). Which fields are present depends on `type`.

  <Expandable title="Properties">
    <ResponseField name="type" type="string">
      `VAULT`, `BANK_ACCOUNT`, `CONTACT`, `EXTERNAL_ADDRESS`, or `EXTERNAL_BANK_ACCOUNT`.
    </ResponseField>

    <ResponseField name="id" type="string">
      ID of the vault, bank account, or contact.
    </ResponseField>

    <ResponseField name="name" type="string">
      Display name.
    </ResponseField>

    <ResponseField name="address" type="string">
      Wallet address, for crypto parties.
    </ResponseField>

    <ResponseField name="chain" type="string">
      Blockchain, for crypto parties.
    </ResponseField>

    <ResponseField name="paymentRail" type="string">
      Payment rail, for bank parties, such as `ACH`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="destination" type="TransferPartyData">
  Where the funds go. Same fields as `source`. See [TransferPartyData](/api-basics/data-models#transferpartydata).

  <Expandable title="Properties">
    <ResponseField name="type" type="string">
      `VAULT`, `BANK_ACCOUNT`, `CONTACT`, `EXTERNAL_ADDRESS`, or `EXTERNAL_BANK_ACCOUNT`.
    </ResponseField>

    <ResponseField name="id" type="string">
      ID of the vault, bank account, or contact.
    </ResponseField>

    <ResponseField name="name" type="string">
      Display name.
    </ResponseField>

    <ResponseField name="address" type="string">
      Wallet address, for crypto parties.
    </ResponseField>

    <ResponseField name="chain" type="string">
      Blockchain, for crypto parties.
    </ResponseField>

    <ResponseField name="paymentRail" type="string">
      Payment rail, for bank parties, such as `ACH`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="balanceChanges" type="TransactionOperationBalanceChanges | null">
  Aggregate balance movements across the transaction, when present: the input asset debited and the output asset credited. See [TransactionOperationBalanceChanges](/api-basics/data-models#transactionoperationbalancechanges).

  <Expandable title="Properties">
    <ResponseField name="changes" type="TransactionOperationBalanceChange[]">
      One entry per party and asset. See [TransactionOperationBalanceChange](/api-basics/data-models#transactionoperationbalancechange).

      <Expandable title="Properties">
        <ResponseField name="party" type="TransferPartyData | null">
          Party whose balance changed. Same fields as `source`. See [TransferPartyData](/api-basics/data-models#transferpartydata).
        </ResponseField>

        <ResponseField name="asset" type="string">
          Asset symbol.
        </ResponseField>

        <ResponseField name="amount" type="string">
          Signed decimal string: negative for a debit, positive for a credit.
        </ResponseField>

        <ResponseField name="chain" type="string">
          Blockchain, for crypto movements.
        </ResponseField>

        <ResponseField name="paymentRail" type="string">
          Payment rail, for fiat movements.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="depositInstructions" type="DepositInstructions">
  Present when funding is required. Use the returned details exactly. See [DepositInstructions](/api-basics/data-models#depositinstructions).
</ResponseField>

<Note>
  Executing a quote creates a transaction in `PENDING` that waits for approval. [Get the approval message](/approvals/get-approval-message) for the transaction `id`, sign it, then [submit the approval](/approvals/submit-approval-action). The SDK's `createTransactionFromIntent()` does this for you and returns the updated transaction. See [Approvals](/approvals/overview).
</Note>

<RequestExample dropdown>
  ```json Request example theme={null}
  {
    "intent": null,
    "quoteId": "quote_ramp_payroll_1042",
    "externalId": "payroll-top-up-1042",
    "memo": "Convert 10000 USDC to USD for payroll"
  }
  ```

  ```bash cURL theme={null}
  # 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"
    }'
  ```

  ```typescript JavaScript SDK theme={null}
  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);
  ```
</RequestExample>

<ResponseExample>
  ```json JSON example theme={null}
  {
    "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"
    }
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.