Confirm outgoing send action
curl --request POST \
--url https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm"
payload = {
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
actionId: 'action_123',
proof: {
type: 'transaction',
transactionHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
},
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm', 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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm",
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([
'actionId' => 'action_123',
'proof' => [
'type' => 'transaction',
'transactionHash' => '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
],
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm"
payload := strings.NewReader("{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"payment": {
"id": "payment_01JY8M7H3C6D9P2Q4R5T7V8WXA",
"apiVersion": "2026-09-09",
"intent": "send",
"amountMode": "deliver_exact",
"status": "processing",
"offrampStatus": null,
"stage": "receipt_verifying",
"operationalState": "normal",
"operationalReasonCode": null,
"operationalUpdatedAt": null,
"statusVersion": 2,
"paymentAmount": {
"amount": "10.00",
"amountAtomic": "10000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"sourceAmount": {
"amount": "10.05",
"amountAtomic": "10050000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"participants": [
{
"role": "sender",
"accountId": "acct_sender"
}
],
"destination": {
"type": "crypto_wallet",
"chainId": 8453,
"address": "0x2222222222222222222222222222222222222222",
"assetCode": "USDC",
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"settlement": null,
"fees": {
"version": 1,
"pricingStatus": "quoted",
"platformFeeBps": 50,
"partnerFeeBps": 0,
"platformFeeAmountAtomic": "50000",
"partnerFeeAmountAtomic": "0",
"merchantNetAmountAtomic": "10000000"
},
"funding": null,
"externalReference": "transfer_482",
"description": "Vendor payout",
"metadata": {},
"expiresAt": "2026-08-28T10:10:00.000Z",
"acceptedAt": null,
"succeededAt": null,
"cancelledAt": null,
"failure": null,
"refundSummary": {
"status": "none",
"count": 0,
"requestedAmountAtomic": "0",
"confirmedAmountAtomic": "0"
},
"incidentRecoverySummary": {
"count": 0,
"pendingCount": 0,
"confirmedCount": 0,
"failedCount": 0,
"requiresInterventionCount": 0,
"requestedAmountAtomic": "0",
"confirmedAmountAtomic": "0"
},
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:01:00.000Z"
},
"nextAction": null
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}Payments
Confirm a send payment's pending action
Submit the proof an outgoing send Payment’s next action asks for.
POST
/
v2
/
payments
/
{paymentId}
/
confirm
Confirm outgoing send action
curl --request POST \
--url https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm"
payload = {
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
actionId: 'action_123',
proof: {
type: 'transaction',
transactionHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
},
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm', 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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm",
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([
'actionId' => 'action_123',
'proof' => [
'type' => 'transaction',
'transactionHash' => '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
],
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm"
payload := strings.NewReader("{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.stableyard.fi/v2/payments/{paymentId}/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"actionId\": \"action_123\",\n \"proof\": {\n \"type\": \"transaction\",\n \"transactionHash\": \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n },\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"payment": {
"id": "payment_01JY8M7H3C6D9P2Q4R5T7V8WXA",
"apiVersion": "2026-09-09",
"intent": "send",
"amountMode": "deliver_exact",
"status": "processing",
"offrampStatus": null,
"stage": "receipt_verifying",
"operationalState": "normal",
"operationalReasonCode": null,
"operationalUpdatedAt": null,
"statusVersion": 2,
"paymentAmount": {
"amount": "10.00",
"amountAtomic": "10000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"sourceAmount": {
"amount": "10.05",
"amountAtomic": "10050000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"participants": [
{
"role": "sender",
"accountId": "acct_sender"
}
],
"destination": {
"type": "crypto_wallet",
"chainId": 8453,
"address": "0x2222222222222222222222222222222222222222",
"assetCode": "USDC",
"tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
},
"settlement": null,
"fees": {
"version": 1,
"pricingStatus": "quoted",
"platformFeeBps": 50,
"partnerFeeBps": 0,
"platformFeeAmountAtomic": "50000",
"partnerFeeAmountAtomic": "0",
"merchantNetAmountAtomic": "10000000"
},
"funding": null,
"externalReference": "transfer_482",
"description": "Vendor payout",
"metadata": {},
"expiresAt": "2026-08-28T10:10:00.000Z",
"acceptedAt": null,
"succeededAt": null,
"cancelledAt": null,
"failure": null,
"refundSummary": {
"status": "none",
"count": 0,
"requestedAmountAtomic": "0",
"confirmedAmountAtomic": "0"
},
"incidentRecoverySummary": {
"count": 0,
"pendingCount": 0,
"confirmedCount": 0,
"failedCount": 0,
"requiresInterventionCount": 0,
"requestedAmountAtomic": "0",
"confirmedAmountAtomic": "0"
},
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:01:00.000Z"
},
"nextAction": null
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}{
"error": {
"code": "bad_request",
"message": "The request is invalid",
"details": "example"
}
}Send the
actionId and exactly the proof type the Payment’s nextAction requests; never guess it from the payment source. Connected-wallet sources submit a transaction hash after signing and sending from the wallet. Managed or Vault-backed sources submit the requested authorization proof.
Escrow-funded Payments use their checkout funding method instead: when no outgoing execution exists, this endpoint returns 409 with reasonCode: payment_confirmation_not_supported. A transaction nextAction with depositInstructions describes escrow funding, not a confirm action.
A successful response means the proof was accepted, not that settlement is final. See Sending payments.Authorizations
HTTP Basic auth. Username is the Stableyard app ID. Password is the app secret. The optional Stableyard-Version request header must match the environment pin.
Headers
Optional contract-version assertion. Omit it to use the app environment's pinned version. A different supported version is accepted only after that environment is explicitly migrated.
Available options:
2026-09-09 Path Parameters
Canonical payment_* identifier. Internal execution identifiers are never accepted by Partner Payment routes.
Pattern:
^payment_[A-Za-z0-9_-]+$Example:
"payment_123"
Body
application/json
Response
Confirmed payment action
Show child attributes
Show child attributes
The exact action the caller must complete. Null means Stableyard needs no action from the partner right now.
- Action required
- Start account KYC
- Verify UPA email
- Complete hosted compliance
- Wait for partner KYC
- Contact support
- No provider action
Show child attributes
Show child attributes
Show child attributes
Show child attributes