Confirm my payment
curl --request POST \
--url https://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm"
payload = {
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
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({
actionId: 'action_123',
proof: {
type: 'transaction',
transactionHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
},
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/client/me/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/client/me/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: 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://prod-api.stableyard.fi/v2/client/me/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", "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://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm")
.header("Authorization", "Bearer <token>")
.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/client/me/payments/{paymentId}/confirm")
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 \"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_123",
"apiVersion": "2026-09-09",
"intent": "receive",
"amountMode": "collect_exact",
"status": "requires_payment_method",
"offrampStatus": null,
"stage": null,
"operationalState": "normal",
"operationalReasonCode": null,
"operationalUpdatedAt": null,
"statusVersion": 1,
"paymentAmount": {
"amount": "50.00",
"amountAtomic": "50000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"sourceAmount": {
"amount": "50.00",
"amountAtomic": "50000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"participants": [
{
"role": "sender",
"accountId": "acct_123"
}
],
"recipientDisplay": {
"displayName": "Example account",
"logoUrl": null
},
"destination": {
"type": "upa",
"accountId": "acct_123"
},
"settlement": {
"type": "settlement_destination",
"settlementDestinationId": null,
"destinationType": "example",
"destinationAddress": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"assetCode": "USDC",
"tokenAddress": "0x1111111111111111111111111111111111111111",
"decimals": 0
},
"fees": {
"version": null,
"pricingStatus": "quote_pending",
"platformFeeBps": 0,
"partnerFeeBps": 0,
"platformFeeAmountAtomic": null,
"partnerFeeAmountAtomic": null,
"merchantNetAmountAtomic": null
},
"funding": {
"mode": "escrow",
"required": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"providerPrincipal": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"providerFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"platformFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"partnerFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"totalFees": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"exchangeRate": {
"rate": "1000000",
"baseAssetCode": "USDC",
"quoteAssetCode": "USDC"
},
"quoteExpiresAt": null,
"depositAddress": {
"address": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111",
"assetCode": "USDC",
"decimals": 0,
"amount": "1000000",
"amountAtomic": "1000000"
}
},
"externalReference": null,
"description": null,
"metadata": {},
"expiresAt": null,
"acceptedAt": null,
"succeededAt": null,
"cancelledAt": null,
"failure": {
"code": null,
"message": null
},
"refundSummary": {
"status": "none",
"count": 0,
"requestedAmountAtomic": "1000000",
"confirmedAmountAtomic": "1000000"
},
"incidentRecoverySummary": {
"count": 0,
"pendingCount": 0,
"confirmedCount": 0,
"failedCount": 0,
"requiresInterventionCount": 0,
"requestedAmountAtomic": "1000000",
"confirmedAmountAtomic": "1000000"
},
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:00:00.000Z"
},
"checkout": {
"paymentUrl": "https://example.com",
"clientSecret": "examplexxxxxxxxxxxxxxxxxxxxxxxxx",
"expiresAt": "2026-08-28T10:00:00.000Z",
"returnUrl": null
},
"nextAction": {
"id": "resource_123",
"type": "transaction",
"expiresAt": null,
"depositInstructions": {
"address": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111",
"assetCode": "USDC",
"decimals": 0,
"amount": "1000000",
"amountAtomic": "1000000"
}
}
}{
"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"
}
}Client payments
Confirm a payment for the client account
Submit the proof an outgoing Payment’s next action asks for, from the client.
POST
/
v2
/
client
/
me
/
payments
/
{paymentId}
/
confirm
Confirm my payment
curl --request POST \
--url https://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm"
payload = {
"actionId": "action_123",
"proof": {
"type": "transaction",
"transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"metadata": {}
}
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({
actionId: 'action_123',
proof: {
type: 'transaction',
transactionHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
},
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/client/me/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/client/me/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: 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://prod-api.stableyard.fi/v2/client/me/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", "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://prod-api.stableyard.fi/v2/client/me/payments/{paymentId}/confirm")
.header("Authorization", "Bearer <token>")
.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/client/me/payments/{paymentId}/confirm")
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 \"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_123",
"apiVersion": "2026-09-09",
"intent": "receive",
"amountMode": "collect_exact",
"status": "requires_payment_method",
"offrampStatus": null,
"stage": null,
"operationalState": "normal",
"operationalReasonCode": null,
"operationalUpdatedAt": null,
"statusVersion": 1,
"paymentAmount": {
"amount": "50.00",
"amountAtomic": "50000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"sourceAmount": {
"amount": "50.00",
"amountAtomic": "50000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 6,
"chainId": 8453,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"participants": [
{
"role": "sender",
"accountId": "acct_123"
}
],
"recipientDisplay": {
"displayName": "Example account",
"logoUrl": null
},
"destination": {
"type": "upa",
"accountId": "acct_123"
},
"settlement": {
"type": "settlement_destination",
"settlementDestinationId": null,
"destinationType": "example",
"destinationAddress": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"assetCode": "USDC",
"tokenAddress": "0x1111111111111111111111111111111111111111",
"decimals": 0
},
"fees": {
"version": null,
"pricingStatus": "quote_pending",
"platformFeeBps": 0,
"partnerFeeBps": 0,
"platformFeeAmountAtomic": null,
"partnerFeeAmountAtomic": null,
"merchantNetAmountAtomic": null
},
"funding": {
"mode": "escrow",
"required": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"providerPrincipal": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"providerFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"platformFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"partnerFee": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"totalFees": {
"amount": "1000000",
"amountAtomic": "1000000",
"assetType": "crypto",
"assetCode": "USDC",
"decimals": 0,
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111"
},
"exchangeRate": {
"rate": "1000000",
"baseAssetCode": "USDC",
"quoteAssetCode": "USDC"
},
"quoteExpiresAt": null,
"depositAddress": {
"address": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111",
"assetCode": "USDC",
"decimals": 0,
"amount": "1000000",
"amountAtomic": "1000000"
}
},
"externalReference": null,
"description": null,
"metadata": {},
"expiresAt": null,
"acceptedAt": null,
"succeededAt": null,
"cancelledAt": null,
"failure": {
"code": null,
"message": null
},
"refundSummary": {
"status": "none",
"count": 0,
"requestedAmountAtomic": "1000000",
"confirmedAmountAtomic": "1000000"
},
"incidentRecoverySummary": {
"count": 0,
"pendingCount": 0,
"confirmedCount": 0,
"failedCount": 0,
"requiresInterventionCount": 0,
"requestedAmountAtomic": "1000000",
"confirmedAmountAtomic": "1000000"
},
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:00:00.000Z"
},
"checkout": {
"paymentUrl": "https://example.com",
"clientSecret": "examplexxxxxxxxxxxxxxxxxxxxxxxxx",
"expiresAt": "2026-08-28T10:00:00.000Z",
"returnUrl": null
},
"nextAction": {
"id": "resource_123",
"type": "transaction",
"expiresAt": null,
"depositInstructions": {
"address": "0x1111111111111111111111111111111111111111",
"chainId": 1,
"tokenAddress": "0x1111111111111111111111111111111111111111",
"assetCode": "USDC",
"decimals": 0,
"amount": "1000000",
"amountAtomic": "1000000"
}
}
}{
"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"
}
}Submits the canonical
proof requested by an outgoing execution’s nextAction; send exactly that proof type. The Payment must belong to the account fixed by the client bearer token.
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 successful response returns the current Payment and does not imply final settlement.Authorizations
Short-lived account-bound token returned by POST /v2/client/auth/exchange.
Path Parameters
Canonical Payment id returned by payment creation.
Pattern:
^payment_Example:
"payment_123"
Body
application/json
Response
Canonical Payment
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