curl --request POST \
--url https://production-api.puppetvendors.com/payouts/make-payment/dry-run \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"vendors": [
{
"vendorId": "507f1f77bcf86cd799439012",
"lineItemIds": [
"507f1f77bcf86cd799439099",
"507f1f77bcf86cd79943909a"
],
"adjustmentIds": [
"507f1f77bcf86cd799439088"
]
},
{
"vendorId": "507f1f77bcf86cd799439013",
"lineItemIds": [
"507f1f77bcf86cd7994390b1"
]
}
],
"method": "stripe",
"notifyVendor": true,
"payoutDate": "2026-03-02",
"comment": "March payouts"
}
'import requests
url = "https://production-api.puppetvendors.com/payouts/make-payment/dry-run"
payload = {
"vendors": [
{
"vendorId": "507f1f77bcf86cd799439012",
"lineItemIds": ["507f1f77bcf86cd799439099", "507f1f77bcf86cd79943909a"],
"adjustmentIds": ["507f1f77bcf86cd799439088"]
},
{
"vendorId": "507f1f77bcf86cd799439013",
"lineItemIds": ["507f1f77bcf86cd7994390b1"]
}
],
"method": "stripe",
"notifyVendor": True,
"payoutDate": "2026-03-02",
"comment": "March payouts"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
vendors: [
{
vendorId: '507f1f77bcf86cd799439012',
lineItemIds: ['507f1f77bcf86cd799439099', '507f1f77bcf86cd79943909a'],
adjustmentIds: ['507f1f77bcf86cd799439088']
},
{
vendorId: '507f1f77bcf86cd799439013',
lineItemIds: ['507f1f77bcf86cd7994390b1']
}
],
method: 'stripe',
notifyVendor: true,
payoutDate: '2026-03-02',
comment: 'March payouts'
})
};
fetch('https://production-api.puppetvendors.com/payouts/make-payment/dry-run', 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://production-api.puppetvendors.com/payouts/make-payment/dry-run",
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([
'vendors' => [
[
'vendorId' => '507f1f77bcf86cd799439012',
'lineItemIds' => [
'507f1f77bcf86cd799439099',
'507f1f77bcf86cd79943909a'
],
'adjustmentIds' => [
'507f1f77bcf86cd799439088'
]
],
[
'vendorId' => '507f1f77bcf86cd799439013',
'lineItemIds' => [
'507f1f77bcf86cd7994390b1'
]
]
],
'method' => 'stripe',
'notifyVendor' => true,
'payoutDate' => '2026-03-02',
'comment' => 'March payouts'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <api-key>"
],
]);
$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://production-api.puppetvendors.com/payouts/make-payment/dry-run"
payload := strings.NewReader("{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<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://production-api.puppetvendors.com/payouts/make-payment/dry-run")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.puppetvendors.com/payouts/make-payment/dry-run")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"dryRun": true,
"vendors": [
{
"vendorId": "<string>",
"vendorName": "<string>",
"totalAmount": 123,
"totalLineItemsCount": 123,
"issue": "<string>"
}
],
"totalPayout": 123
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}Dry-run a make-payment selection (what a run would pay)
Merchant scope only, requires the admin:payouts:make_payment
permission, the same check as POST /payouts/make-payment, so a key
that cannot pay cannot preview a payment either. Runs the exact computation
POST /payouts/make-payment would run, with ZERO writes: one row per
vendor in the selection with the amount a run would pay, the line
item count, and the issue the run would reject that vendor on
(already paid/pending, payout amount above balance, below zero),
plus the shop total. No Idempotency-Key header: nothing is written.
Multi-vendor, like the run: vendors holds one group per vendor (up
to 50) and method applies to all of them. The same checks refuse the
whole request when any vendor is unknown, hidden or not ready for the
method.
method is the READ-side vocabulary (stripe / paypal /
globalPayouts / manual, same enum as GET /payouts/methods); the
bridge maps it to legacy’s resolver keys (stripeConnected,
paypalConnected, globalPayoutConnected, other) before the engine
runs.
curl --request POST \
--url https://production-api.puppetvendors.com/payouts/make-payment/dry-run \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"vendors": [
{
"vendorId": "507f1f77bcf86cd799439012",
"lineItemIds": [
"507f1f77bcf86cd799439099",
"507f1f77bcf86cd79943909a"
],
"adjustmentIds": [
"507f1f77bcf86cd799439088"
]
},
{
"vendorId": "507f1f77bcf86cd799439013",
"lineItemIds": [
"507f1f77bcf86cd7994390b1"
]
}
],
"method": "stripe",
"notifyVendor": true,
"payoutDate": "2026-03-02",
"comment": "March payouts"
}
'import requests
url = "https://production-api.puppetvendors.com/payouts/make-payment/dry-run"
payload = {
"vendors": [
{
"vendorId": "507f1f77bcf86cd799439012",
"lineItemIds": ["507f1f77bcf86cd799439099", "507f1f77bcf86cd79943909a"],
"adjustmentIds": ["507f1f77bcf86cd799439088"]
},
{
"vendorId": "507f1f77bcf86cd799439013",
"lineItemIds": ["507f1f77bcf86cd7994390b1"]
}
],
"method": "stripe",
"notifyVendor": True,
"payoutDate": "2026-03-02",
"comment": "March payouts"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
vendors: [
{
vendorId: '507f1f77bcf86cd799439012',
lineItemIds: ['507f1f77bcf86cd799439099', '507f1f77bcf86cd79943909a'],
adjustmentIds: ['507f1f77bcf86cd799439088']
},
{
vendorId: '507f1f77bcf86cd799439013',
lineItemIds: ['507f1f77bcf86cd7994390b1']
}
],
method: 'stripe',
notifyVendor: true,
payoutDate: '2026-03-02',
comment: 'March payouts'
})
};
fetch('https://production-api.puppetvendors.com/payouts/make-payment/dry-run', 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://production-api.puppetvendors.com/payouts/make-payment/dry-run",
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([
'vendors' => [
[
'vendorId' => '507f1f77bcf86cd799439012',
'lineItemIds' => [
'507f1f77bcf86cd799439099',
'507f1f77bcf86cd79943909a'
],
'adjustmentIds' => [
'507f1f77bcf86cd799439088'
]
],
[
'vendorId' => '507f1f77bcf86cd799439013',
'lineItemIds' => [
'507f1f77bcf86cd7994390b1'
]
]
],
'method' => 'stripe',
'notifyVendor' => true,
'payoutDate' => '2026-03-02',
'comment' => 'March payouts'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <api-key>"
],
]);
$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://production-api.puppetvendors.com/payouts/make-payment/dry-run"
payload := strings.NewReader("{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<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://production-api.puppetvendors.com/payouts/make-payment/dry-run")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.puppetvendors.com/payouts/make-payment/dry-run")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vendors\": [\n {\n \"vendorId\": \"507f1f77bcf86cd799439012\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd799439099\",\n \"507f1f77bcf86cd79943909a\"\n ],\n \"adjustmentIds\": [\n \"507f1f77bcf86cd799439088\"\n ]\n },\n {\n \"vendorId\": \"507f1f77bcf86cd799439013\",\n \"lineItemIds\": [\n \"507f1f77bcf86cd7994390b1\"\n ]\n }\n ],\n \"method\": \"stripe\",\n \"notifyVendor\": true,\n \"payoutDate\": \"2026-03-02\",\n \"comment\": \"March payouts\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"dryRun": true,
"vendors": [
{
"vendorId": "<string>",
"vendorName": "<string>",
"totalAmount": 123,
"totalLineItemsCount": 123,
"issue": "<string>"
}
],
"totalPayout": 123
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}{
"success": false,
"error": {
"message": "Resource not found",
"code": "NOT_FOUND",
"errorId": "err_1783365360839_j281w7b",
"details": {}
}
}Authorizations
JWT minted from a merchant API key (mk_live_…) by POST /authenticate. Send the token value directly, with no "Bearer" prefix. Tokens last 14 days and can be renewed at POST /refresh-token; revoking the key refuses the next request made with any token minted from it.
Body
The vendors to pay, one group each, paid as one batch per vendor. A vendorId may appear only once, and a line item or adjustment id under only one vendor (ids compare case-insensitively). Every vendor must belong to this shop and be ready for the method, or the whole request is refused and nothing is paid.
1 - 50 elementsShow child attributes
Show child attributes
READ-side method name, one for every vendor of the run; mapped to legacy resolver keys at the bridge. manual records a payment made outside the app and needs manualMethod
stripe, paypal, globalPayouts, manual How a manual payout was made, the same options as the merchant portal. Recorded as the run's payout method and shown in the vendor email. Required when method is manual, refused with any other method
bankTransfer, paypal, cash, other "bankTransfer"
Whether the run emails the vendor
Recorded as the payout date. Either an RFC 3339 date-time or a calendar date without a time (YYYY-MM-DD), recorded as that day in the merchant portal's MM/DD/YYYY. When omitted, defaults to today in the shop's timezone (as MM/DD/YYYY), as the merchant portal pre-fills it
"2026-03-02"
Free-text note recorded with the run
2000Was this page helpful?