curl --request POST \
--url https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"depositInstructionId": "uspay-deposit-instruction-id",
"amount": "250.00",
"reference": "INV-5530",
"counterpartyName": "Acme Corp"
}
'import requests
url = "https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit"
payload = {
"depositInstructionId": "uspay-deposit-instruction-id",
"amount": "250.00",
"reference": "INV-5530",
"counterpartyName": "Acme Corp"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
depositInstructionId: 'uspay-deposit-instruction-id',
amount: '250.00',
reference: 'INV-5530',
counterpartyName: 'Acme Corp'
})
};
fetch('https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit', 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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit",
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([
'depositInstructionId' => 'uspay-deposit-instruction-id',
'amount' => '250.00',
'reference' => 'INV-5530',
'counterpartyName' => 'Acme Corp'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit"
payload := strings.NewReader("{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}Send a Mock Deposit
Simulates an inbound deposit into a balance account through a given deposit instruction, so you can exercise downstream processing — balances, transactions, and webhooks — without moving real money. This is fire-and-acknowledge: it responds 202 with an empty body and settles out of band, so observe the result by polling the account balance or transactions.
Sandbox only. This endpoint exists exclusively in the sandbox environment for testing. Simulating a deposit is not possible in production.
curl --request POST \
--url https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"depositInstructionId": "uspay-deposit-instruction-id",
"amount": "250.00",
"reference": "INV-5530",
"counterpartyName": "Acme Corp"
}
'import requests
url = "https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit"
payload = {
"depositInstructionId": "uspay-deposit-instruction-id",
"amount": "250.00",
"reference": "INV-5530",
"counterpartyName": "Acme Corp"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
depositInstructionId: 'uspay-deposit-instruction-id',
amount: '250.00',
reference: 'INV-5530',
counterpartyName: 'Acme Corp'
})
};
fetch('https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit', 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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit",
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([
'depositInstructionId' => 'uspay-deposit-instruction-id',
'amount' => '250.00',
'reference' => 'INV-5530',
'counterpartyName' => 'Acme Corp'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit"
payload := strings.NewReader("{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.va.meridianpay.com/v1/accounts/{accountId}/simulate-deposit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"depositInstructionId\": \"uspay-deposit-instruction-id\",\n \"amount\": \"250.00\",\n \"reference\": \"INV-5530\",\n \"counterpartyName\": \"Acme Corp\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}{
"message": "<string>",
"validationErrors": [
{
"fieldRef": "<string>",
"type": "InvalidFormat",
"message": "<string>"
}
],
"errorCode": "UNAUTHORIZED"
}Authorizations
Bearer token authentication, for client-server calls.
Send the access token issued by POST /v1/auth/token as Authorization: Bearer {token}. The token carries its own program and user context, so the X-Meridian-* headers are not required. See Authentication.
Headers
Server-to-server (HMAC) requests only. Partner API key issued by Meridian during provisioning.
Server-to-server (HMAC) requests only. Current time in milliseconds since the Unix epoch. Must be within 60 seconds of the request.
Server-to-server (HMAC) requests only. Identifies the program context for the request.
Server-to-server (HMAC) requests only. Identifies the Meridian user targeted by the request. Required for MULTI_USER integrations; omit for SINGLE_USER.
Path Parameters
ID of the balance account to deposit into — the id returned by GET /v1/accounts (e.g. uspay-...).
Body
The deposit instruction to credit and the amount to deposit, plus an optional reference and counterparty name to carry onto the deposit.
Request payload for simulating an inbound deposit in the sandbox
The id of the deposit instruction to credit — an opaque identifier such as uspay-..., NOT a rail name like ACH or WIRE. Each deposit instruction is a funding rail (ACH, Fedwire, etc.) configured on the account that an inbound deposit would arrive through. To find it, call GET /v1/accounts/{accountId} and copy the id of the desired entry from the depositInstructions array (match on its rail.label, e.g. Fedwire for a wire). Passing anything that is not an existing instruction id returns 404.
"uspay-rvrsmt8vngju3kea5mm6fcck"
Amount to deposit, as a decimal string in the account's currency (e.g. 100.00). Must be greater than zero.
"100.00"
Optional payment reference for the simulated deposit, so you can exercise reference matching against realistic data. Max 255 characters. On the resulting transaction it is mapped to debitReference, in both API responses and webhooks; some providers also copy it to debitMemo. Omit it and the transaction carries the backing provider's default, which is a placeholder reference or none at all.
"INV-5530"
Optional name of the sending counterparty for the simulated deposit. Max 255 characters. On the resulting transaction it is mapped to debitParty.payer.displayName, in both API responses and webhooks; a transaction has no counterpartyName field. Omit it and the deposit arrives from Meridian.
"Acme Corp"
Response
Deposit simulation accepted; settles out of band
Response carrying no resource data, with an optional human-readable message
Optional human-readable message describing the outcome