Create a crypto transfer
curl --request POST \
--url https://api-production.fossapay.com/api/v1/transfers/crypto \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "<string>",
"recipient": "<string>",
"amount": 123,
"memo": "<string>"
}
'import requests
url = "https://api-production.fossapay.com/api/v1/transfers/crypto"
payload = {
"customerId": "<string>",
"recipient": "<string>",
"amount": 123,
"memo": "<string>"
}
headers = {
"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-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({customerId: '<string>', recipient: '<string>', amount: 123, memo: '<string>'})
};
fetch('https://api-production.fossapay.com/api/v1/transfers/crypto', 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/transfers/crypto",
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([
'customerId' => '<string>',
'recipient' => '<string>',
'amount' => 123,
'memo' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/transfers/crypto"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/transfers/crypto")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/transfers/crypto")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"message": "processing crypto transaction",
"data": {
"token": {
"symbol": "usdc",
"amount": 100.50
},
"network": "SOLANA",
"recipientAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"senderAddress": "So11111111111111111111111111111111111111112",
"status": "processing"
}
}
Crypto Transfers
Crypto Transfer
Submit a customer-funded transfer on Solana or Stellar
POST
/
api
/
v1
/
transfers
/
crypto
Create a crypto transfer
curl --request POST \
--url https://api-production.fossapay.com/api/v1/transfers/crypto \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "<string>",
"recipient": "<string>",
"amount": 123,
"memo": "<string>"
}
'import requests
url = "https://api-production.fossapay.com/api/v1/transfers/crypto"
payload = {
"customerId": "<string>",
"recipient": "<string>",
"amount": 123,
"memo": "<string>"
}
headers = {
"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-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({customerId: '<string>', recipient: '<string>', amount: 123, memo: '<string>'})
};
fetch('https://api-production.fossapay.com/api/v1/transfers/crypto', 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/transfers/crypto",
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([
'customerId' => '<string>',
'recipient' => '<string>',
'amount' => 123,
'memo' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/transfers/crypto"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/transfers/crypto")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-production.fossapay.com/api/v1/transfers/crypto")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customerId\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": 123,\n \"memo\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": true,
"message": "processing crypto transaction",
"data": {
"token": {
"symbol": "usdc",
"amount": 100.50
},
"network": "SOLANA",
"recipientAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"senderAddress": "So11111111111111111111111111111111111111112",
"status": "processing"
}
}
Request
string
required
Active production API key belonging to the customer and source wallet merchant.
string
required
UUID of the customer making the transfer
string
required
Complete recipient address on the selected network. Stellar requires a valid Stellar public address.
string
required
The blockchain network for the transfer:
solana or stellar.string
required
Solana supports
sol, usdc, and usdt. Stellar supports xlm and usdc. Use lowercase values.number
required
Gross token amount. The configured fee is deducted and the net amount is sent to the recipient.
string
Optional Stellar text memo, maximum 28 characters. FossaPay generates a memo when omitted. This field is used only for Stellar transfers.
Request Example
curl -X POST https://api-production.fossapay.com/api/v1/transfers/crypto \
-H "x-api-key: $FOSSAPAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "11111111-1111-4111-8111-111111111111",
"recipient": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"network": "solana",
"currency": "usdc",
"amount": 100.50
}'
const response = await fetch('https://api-production.fossapay.com/api/v1/transfers/crypto', {
method: 'POST',
headers: {
'x-api-key': process.env.FOSSAPAY_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
customerId: '11111111-1111-4111-8111-111111111111',
recipient: '7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY',
network: 'solana',
currency: 'usdc',
amount: 100.50
})
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}
const transfer = await response.json();
network to stellar, currency to xlm or usdc, and recipient to the destination’s full Stellar public address. Add a memo if the recipient requires one:
{
"customerId": "11111111-1111-4111-8111-111111111111",
"recipient": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
"network": "stellar",
"currency": "xlm",
"amount": 5,
"memo": "ORDER-123"
}
Response
{
"status": true,
"message": "processing crypto transaction",
"data": {
"token": {
"symbol": "usdc",
"amount": 100.50
},
"network": "SOLANA",
"recipientAddress": "7EcJ1eB6J3ggRrGkQWsT4ZP8dkqPZ4JmW4YRwR7Qp5cY",
"senderAddress": "So11111111111111111111111111111111111111112",
"status": "processing"
}
}
{
"status": "error",
"statusCode": 400,
"message": "Crypto transfer failed. Try again later!"
}
{
"status": "error",
"statusCode": 500,
"message": "Internal server error"
}
Errors
| Status | Typical cause |
|---|---|
400 | Customer/wallet unavailable, insufficient funds, unsupported operation, or provider rejection |
401 | Missing or invalid API key |
422 | Invalid customer UUID, currency, amount, memo, or network other than solana or stellar |
5xx | Temporary platform or provider failure; reconcile before retrying |
Authorizations
Body
application/json
Available options:
solana, stellar Solana: sol, usdc, usdt. Stellar: xlm, usdc.
Available options:
usdc, usdt, sol, xlm Gross token amount. FossaPay deducts the quoted transfer fee, if any, and sends the remainder to the recipient. SOL supports up to 9 decimal places; XLM up to 7.
Optional text memo for Stellar transfers. FossaPay generates one when omitted.
Maximum string length:
28
