curl --request POST \
--url https://api.grainfinance.co/v1/payouts/{proposalId}/submit \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.grainfinance.co/v1/payouts/{proposalId}/submit"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.grainfinance.co/v1/payouts/{proposalId}/submit', 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://api.grainfinance.co/v1/payouts/{proposalId}/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.grainfinance.co/v1/payouts/{proposalId}/submit"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.grainfinance.co/v1/payouts/{proposalId}/submit")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.grainfinance.co/v1/payouts/{proposalId}/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"id": "8173b9a7-ee61-413e-b9e3-7c04b2a067c5",
"status": "in_process",
"externalPayoutId": "inv_2026_001",
"currency": "USD",
"amount": 5000,
"fee": 1.5,
"totalAmount": 5001.5,
"reason": 2,
"description": "<string>",
"payoutDate": "2026-05-15",
"payoutMethod": "SEPA",
"vendorDetails": {
"vendorId": "1b0ada1e-fa1b-4cfe-a553-01b340c5650e",
"vendorName": "Acme Supplies Ltd",
"externalVendorId": "vendor_001",
"bankDetails": {
"accountHolderName": "Acme Payments Ltd",
"accountNumber": "8290041523",
"bankName": "JPMorgan Chase Bank, N.A.",
"bankAddress": "383 Madison Avenue, New York, NY 10017",
"bankCountry": "US",
"bankState": "NY",
"iban": "<string>",
"bicSwift": "CHASUS33XXX",
"routingCode": "<string>",
"bankCode": "<string>",
"branchCode": "<string>",
"sortCode": "560036",
"bsbCode": "082902"
}
}
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}Submit Payout
Submits a previously reviewed payout, executing the payment. The proposalId is the id returned
by POST /v1/payouts. Must be called before the proposal’s validUntilTs, otherwise it is rejected
as expired.
curl --request POST \
--url https://api.grainfinance.co/v1/payouts/{proposalId}/submit \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.grainfinance.co/v1/payouts/{proposalId}/submit"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.grainfinance.co/v1/payouts/{proposalId}/submit', 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://api.grainfinance.co/v1/payouts/{proposalId}/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.grainfinance.co/v1/payouts/{proposalId}/submit"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.grainfinance.co/v1/payouts/{proposalId}/submit")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.grainfinance.co/v1/payouts/{proposalId}/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"id": "8173b9a7-ee61-413e-b9e3-7c04b2a067c5",
"status": "in_process",
"externalPayoutId": "inv_2026_001",
"currency": "USD",
"amount": 5000,
"fee": 1.5,
"totalAmount": 5001.5,
"reason": 2,
"description": "<string>",
"payoutDate": "2026-05-15",
"payoutMethod": "SEPA",
"vendorDetails": {
"vendorId": "1b0ada1e-fa1b-4cfe-a553-01b340c5650e",
"vendorName": "Acme Supplies Ltd",
"externalVendorId": "vendor_001",
"bankDetails": {
"accountHolderName": "Acme Payments Ltd",
"accountNumber": "8290041523",
"bankName": "JPMorgan Chase Bank, N.A.",
"bankAddress": "383 Madison Avenue, New York, NY 10017",
"bankCountry": "US",
"bankState": "NY",
"iban": "<string>",
"bicSwift": "CHASUS33XXX",
"routingCode": "<string>",
"bankCode": "<string>",
"branchCode": "<string>",
"sortCode": "560036",
"bsbCode": "082902"
}
}
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}{
"message": "Can't perform this action",
"reason": "Supplied object is in *Cancelled* state, which prevents performing this action"
}Authorizations
Basic authentication using the partner API keys from https://console.grainfinance.co/keys
Path Parameters
The id of the payout proposal, as returned by POST /v1/payouts.
[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}Response
Payout submitted
A Payout represents an executed payment to a vendor. Returned by GET /v1/payouts/{id},
GET /v1/payouts, and POST /v1/payouts/{id}/submit.
The id of the payout within the Grain platform.
[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}"8173b9a7-ee61-413e-b9e3-7c04b2a067c5"
The current status of the payout.
in_process, sent, paid, failed, rejected "in_process"
The payout id, as identified within your system.
^[A-Za-z0-9_.\-]{1,64}$"inv_2026_001"
The alpha-3 ISO 4217 currency code of the payout.
^[A-Z]{3}$"USD"
The payout amount, denoted in currency.
5000
The fee applied to this payout, denoted in currency.
1.5
Total amount that will leave the wallet (amount + fee), denoted in currency.
5001.5
The compliance reason categorising this payout, as a numeric code:
1 - Intercompany Payment 2 - Purchase of Good(s) 3 - Purchase of Service(s) 4 - Transferring to Own Accounts 5 - Valid Vendor Purchases
1, 2, 3, 4, 5 2
Free-form description supplied when initiating the payout.
The date the payout was sent to the bank, in YYYY-MM-DD format.
\d{4}-\d{2}-\d{2}"2026-05-15"
The payment method that will be used to send the payout.
SWIFT, SEPA, WIRE, ACH, FPS, CA ACSS, NPP, IBG, BECS, CCASS, TEF, UAEFTS, SIC, CERTIS, DKSMC, NICS, SORBNET, RIX, SAMOS, ZAHAV, SARIE, QPS "SEPA"
The vendor receiving the payout, including their bank account details.
Show child attributes
Show child attributes