Sign and broadcast with the master Solana wallet
curl --request POST \
--url https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"serializedTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB..."
}
'import requests
url = "https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast"
payload = { "serializedTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB..." }
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
serializedTransaction: 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...'
})
};
fetch('https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast', 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-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast",
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([
'serializedTransaction' => 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Idempotency-Key: <x-idempotency-key>",
"x-api-key: <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://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast"
payload := strings.NewReader("{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Idempotency-Key", "<x-idempotency-key>")
req.Header.Add("x-api-key", "<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://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast")
.header("X-Idempotency-Key", "<x-idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Idempotency-Key"] = '<x-idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"statusCode": 202,
"message": "Solana transaction signed and submitted successfully",
"data": {
"requestId": "7a7de73d-92a8-4cd8-b18c-c70e6c922a66",
"walletType": "master",
"customerId": null,
"walletId": "65028962-9369-4f62-8758-0fc9f2e35fb2",
"walletAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"network": "solana",
"cluster": "mainnet-beta",
"feePayer": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"status": "submitted",
"providerTransactionId": "63946f15-e605-47f4-813b-ac79f1303db9",
"transactionHash": "5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"explorerLink": "https://explorer.solana.com/tx/5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"simulation": {
"unitsConsumed": 18094,
"logs": ["Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success"]
}
}
}
Crypto Wallets
Sign a Master Wallet Transaction
Validate, simulate, sign, and broadcast a Solana transaction with the merchant master wallet
POST
/
api
/
v1
/
wallets
/
crypto
/
master
/
transactions
/
sign-and-broadcast
Sign and broadcast with the master Solana wallet
curl --request POST \
--url https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"serializedTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB..."
}
'import requests
url = "https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast"
payload = { "serializedTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB..." }
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
serializedTransaction: 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...'
})
};
fetch('https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast', 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-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast",
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([
'serializedTransaction' => 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Idempotency-Key: <x-idempotency-key>",
"x-api-key: <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://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast"
payload := strings.NewReader("{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Idempotency-Key", "<x-idempotency-key>")
req.Header.Add("x-api-key", "<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://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast")
.header("X-Idempotency-Key", "<x-idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Idempotency-Key"] = '<x-idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"serializedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB...\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"statusCode": 202,
"message": "Solana transaction signed and submitted successfully",
"data": {
"requestId": "7a7de73d-92a8-4cd8-b18c-c70e6c922a66",
"walletType": "master",
"customerId": null,
"walletId": "65028962-9369-4f62-8758-0fc9f2e35fb2",
"walletAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"network": "solana",
"cluster": "mainnet-beta",
"feePayer": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"status": "submitted",
"providerTransactionId": "63946f15-e605-47f4-813b-ac79f1303db9",
"transactionHash": "5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"explorerLink": "https://explorer.solana.com/tx/5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"simulation": {
"unitsConsumed": 18094,
"logs": ["Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success"]
}
}
}
The active Solana master wallet resolved from the API key must be both a required signer and the fee payer. A successful
202 response means the transaction was submitted, not finalized.
Headers
string
required
Active production API key for the merchant that owns the master wallet.
string
required
Unique key for this logical signing request, up to 255 characters. Retain it with the exact serialized transaction.
Request body
string
required
Base64-encoded serialized Solana
VersionedTransaction, up to 4,096 characters. The selected wallet must be the fee payer and a required signer. Other required signers must sign before serialization.curl --request POST \
--url https://api-production.fossapay.com/api/v1/wallets/crypto/master/transactions/sign-and-broadcast \
--header "x-api-key: $FOSSAPAY_API_KEY" \
--header "X-Idempotency-Key: $IDEMPOTENCY_KEY" \
--header 'Content-Type: application/json' \
--data "{\"serializedTransaction\":\"$SERIALIZED_TRANSACTION\"}"
Response
{
"status": "success",
"statusCode": 202,
"message": "Solana transaction signed and submitted successfully",
"data": {
"requestId": "7a7de73d-92a8-4cd8-b18c-c70e6c922a66",
"walletType": "master",
"customerId": null,
"walletId": "65028962-9369-4f62-8758-0fc9f2e35fb2",
"walletAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"network": "solana",
"cluster": "mainnet-beta",
"feePayer": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"status": "submitted",
"providerTransactionId": "63946f15-e605-47f4-813b-ac79f1303db9",
"transactionHash": "5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"explorerLink": "https://explorer.solana.com/tx/5KtPn1yXj9DmhHVQJPNfV4PfA3BC6GgZ6JDfnYMYLXLPNqqsV5RrTRVqQJ6eTdBBL9SHSknUT9v2GkA9SGscTdQH",
"simulation": {
"unitsConsumed": 18094,
"logs": ["Program MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr success"]
}
}
}
Important behavior
- FossaPay simulates before signing and broadcasting.
- The wallet initiating the transaction pays the Solana network fee.
- Requests are limited to 10 per minute.
- Repeating the identical submitted request with the same idempotency key returns the stored result.
- A failed or expired transaction must be rebuilt with a fresh blockhash and submitted with a new key.
- Finality is reconciled through Solana RPC; this flow does not emit a merchant webhook.
Authorizations
Headers
Unique merchant-scoped key for this exact signing request. Maximum 255 characters.
Required string length:
1 - 255Body
application/json
Base64-encoded serialized Solana VersionedTransaction. The selected FossaPay wallet must be a required signer and the fee payer; all other required signers must already have signed.
Required string length:
1 - 4096Example:
"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAB..."

