curl --request POST \
--url https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals \
--header 'Content-Type: application/json' \
--header 'X-Meridian-Api-Key: <x-meridian-api-key>' \
--header 'X-Meridian-Signature: <api-key>' \
--header 'X-Meridian-Timestamp: <x-meridian-timestamp>' \
--data '
{
"amount": 50,
"quoteId": "quote_01HT2P6W9PC2QV4W0Q63QMFJ44",
"externalRef": "order-2026-00142"
}
'import requests
url = "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals"
payload = {
"amount": 50,
"quoteId": "quote_01HT2P6W9PC2QV4W0Q63QMFJ44",
"externalRef": "order-2026-00142"
}
headers = {
"X-Meridian-Api-Key": "<x-meridian-api-key>",
"X-Meridian-Timestamp": "<x-meridian-timestamp>",
"X-Meridian-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Meridian-Api-Key': '<x-meridian-api-key>',
'X-Meridian-Timestamp': '<x-meridian-timestamp>',
'X-Meridian-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 50,
quoteId: 'quote_01HT2P6W9PC2QV4W0Q63QMFJ44',
externalRef: 'order-2026-00142'
})
};
fetch('https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 50,
'quoteId' => 'quote_01HT2P6W9PC2QV4W0Q63QMFJ44',
'externalRef' => 'order-2026-00142'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Meridian-Api-Key: <x-meridian-api-key>",
"X-Meridian-Signature: <api-key>",
"X-Meridian-Timestamp: <x-meridian-timestamp>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals"
payload := strings.NewReader("{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Meridian-Api-Key", "<x-meridian-api-key>")
req.Header.Add("X-Meridian-Timestamp", "<x-meridian-timestamp>")
req.Header.Add("X-Meridian-Signature", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals")
.header("X-Meridian-Api-Key", "<x-meridian-api-key>")
.header("X-Meridian-Timestamp", "<x-meridian-timestamp>")
.header("X-Meridian-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Meridian-Api-Key"] = '<x-meridian-api-key>'
request["X-Meridian-Timestamp"] = '<x-meridian-timestamp>'
request["X-Meridian-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}"
response = http.request(request)
puts response.read_body{
"transaction": {
"createdAt": "<string>",
"id": "<string>",
"status": "PENDING",
"transactionRef": "<string>",
"type": "DEPOSIT",
"updatedAt": "<string>",
"userId": "<string>",
"virtualAccountId": "<string>",
"debitAmount": "50.00",
"debitCurrency": "USD",
"depositType": "<string>",
"exchangeRate": "56.00",
"externalRef": "order-2026-00142",
"fees": [
{
"amount": "5.00",
"currency": "USD",
"label": "Wire processing fee",
"type": "WIRE_PROCESSING_FEE"
}
],
"fromAmount": "50.00",
"fromCurrency": "USD",
"originatorAccount": "<string>",
"originatorInstitution": "<string>",
"originatorMemo": "<string>",
"originatorName": "<string>",
"receiverAccount": "<string>",
"receiverInstitution": "<string>",
"receiverName": "<string>",
"relatedId": "<string>",
"relatedIdType": "PAYMENT_LINK",
"statusReason": "<string>",
"toAmount": "2800.00",
"toCurrency": "PHP"
}
}{
"transaction": {
"createdAt": "<string>",
"id": "<string>",
"status": "PENDING",
"transactionRef": "<string>",
"type": "DEPOSIT",
"updatedAt": "<string>",
"userId": "<string>",
"virtualAccountId": "<string>",
"debitAmount": "50.00",
"debitCurrency": "USD",
"depositType": "<string>",
"exchangeRate": "56.00",
"externalRef": "order-2026-00142",
"fees": [
{
"amount": "5.00",
"currency": "USD",
"label": "Wire processing fee",
"type": "WIRE_PROCESSING_FEE"
}
],
"fromAmount": "50.00",
"fromCurrency": "USD",
"originatorAccount": "<string>",
"originatorInstitution": "<string>",
"originatorMemo": "<string>",
"originatorName": "<string>",
"receiverAccount": "<string>",
"receiverInstitution": "<string>",
"receiverName": "<string>",
"relatedId": "<string>",
"relatedIdType": "PAYMENT_LINK",
"statusReason": "<string>",
"toAmount": "2800.00",
"toCurrency": "PHP"
}
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}Create a withdrawal
Execute a withdrawal from a virtual account using a previously created quote.
curl --request POST \
--url https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals \
--header 'Content-Type: application/json' \
--header 'X-Meridian-Api-Key: <x-meridian-api-key>' \
--header 'X-Meridian-Signature: <api-key>' \
--header 'X-Meridian-Timestamp: <x-meridian-timestamp>' \
--data '
{
"amount": 50,
"quoteId": "quote_01HT2P6W9PC2QV4W0Q63QMFJ44",
"externalRef": "order-2026-00142"
}
'import requests
url = "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals"
payload = {
"amount": 50,
"quoteId": "quote_01HT2P6W9PC2QV4W0Q63QMFJ44",
"externalRef": "order-2026-00142"
}
headers = {
"X-Meridian-Api-Key": "<x-meridian-api-key>",
"X-Meridian-Timestamp": "<x-meridian-timestamp>",
"X-Meridian-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Meridian-Api-Key': '<x-meridian-api-key>',
'X-Meridian-Timestamp': '<x-meridian-timestamp>',
'X-Meridian-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 50,
quoteId: 'quote_01HT2P6W9PC2QV4W0Q63QMFJ44',
externalRef: 'order-2026-00142'
})
};
fetch('https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 50,
'quoteId' => 'quote_01HT2P6W9PC2QV4W0Q63QMFJ44',
'externalRef' => 'order-2026-00142'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Meridian-Api-Key: <x-meridian-api-key>",
"X-Meridian-Signature: <api-key>",
"X-Meridian-Timestamp: <x-meridian-timestamp>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals"
payload := strings.NewReader("{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Meridian-Api-Key", "<x-meridian-api-key>")
req.Header.Add("X-Meridian-Timestamp", "<x-meridian-timestamp>")
req.Header.Add("X-Meridian-Signature", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals")
.header("X-Meridian-Api-Key", "<x-meridian-api-key>")
.header("X-Meridian-Timestamp", "<x-meridian-timestamp>")
.header("X-Meridian-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.mnai.com/v1/users/{userId}/virtual-accounts/{accountId}/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Meridian-Api-Key"] = '<x-meridian-api-key>'
request["X-Meridian-Timestamp"] = '<x-meridian-timestamp>'
request["X-Meridian-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 50,\n \"quoteId\": \"quote_01HT2P6W9PC2QV4W0Q63QMFJ44\",\n \"externalRef\": \"order-2026-00142\"\n}"
response = http.request(request)
puts response.read_body{
"transaction": {
"createdAt": "<string>",
"id": "<string>",
"status": "PENDING",
"transactionRef": "<string>",
"type": "DEPOSIT",
"updatedAt": "<string>",
"userId": "<string>",
"virtualAccountId": "<string>",
"debitAmount": "50.00",
"debitCurrency": "USD",
"depositType": "<string>",
"exchangeRate": "56.00",
"externalRef": "order-2026-00142",
"fees": [
{
"amount": "5.00",
"currency": "USD",
"label": "Wire processing fee",
"type": "WIRE_PROCESSING_FEE"
}
],
"fromAmount": "50.00",
"fromCurrency": "USD",
"originatorAccount": "<string>",
"originatorInstitution": "<string>",
"originatorMemo": "<string>",
"originatorName": "<string>",
"receiverAccount": "<string>",
"receiverInstitution": "<string>",
"receiverName": "<string>",
"relatedId": "<string>",
"relatedIdType": "PAYMENT_LINK",
"statusReason": "<string>",
"toAmount": "2800.00",
"toCurrency": "PHP"
}
}{
"transaction": {
"createdAt": "<string>",
"id": "<string>",
"status": "PENDING",
"transactionRef": "<string>",
"type": "DEPOSIT",
"updatedAt": "<string>",
"userId": "<string>",
"virtualAccountId": "<string>",
"debitAmount": "50.00",
"debitCurrency": "USD",
"depositType": "<string>",
"exchangeRate": "56.00",
"externalRef": "order-2026-00142",
"fees": [
{
"amount": "5.00",
"currency": "USD",
"label": "Wire processing fee",
"type": "WIRE_PROCESSING_FEE"
}
],
"fromAmount": "50.00",
"fromCurrency": "USD",
"originatorAccount": "<string>",
"originatorInstitution": "<string>",
"originatorMemo": "<string>",
"originatorName": "<string>",
"receiverAccount": "<string>",
"receiverInstitution": "<string>",
"receiverName": "<string>",
"relatedId": "<string>",
"relatedIdType": "PAYMENT_LINK",
"statusReason": "<string>",
"toAmount": "2800.00",
"toCurrency": "PHP"
}
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}{
"hasValidationErrors": true,
"message": "<string>",
"validationErrors": [
{
"type": "InvalidFormat",
"fieldRef": "<string>",
"message": "<string>"
}
],
"errorCode": "<string>"
}Authorizations
Meridian HMAC header authentication.
Required headers:
- X-Meridian-Api-Key
- X-Meridian-Timestamp
- X-Meridian-Signature
X-Meridian-Signature is the HMAC SHA-256 signature of the canonical request string, computed per request as HMAC-SHA256(apiKey + timestamp + method + path + body). See Authentication for how to construct it.
Headers
API key issued by Meridian during provisioning.
Current time in milliseconds since the Unix epoch. Must be within 10 seconds of the request.
Path Parameters
ID of the user initiating the withdrawal
ID of the virtual account to withdraw from
Body
Request body for creating a virtual account withdrawal transaction
Amount to withdraw from the virtual account
50
Quote ID for the withdrawal
"quote_01HT2P6W9PC2QV4W0Q63QMFJ44"
A unique reference from your own systems used to identify and reconcile this transaction, such as a contract number, order ID, or internal transaction reference.
"order-2026-00142"
Response
The withdrawal was already processed for this quote; the existing transaction is returned (idempotent replay)
Response returned after creating a withdrawal transaction.
The created withdrawal transaction
Show child attributes
Show child attributes