curl --request POST \
--url https://api.afkcrypto.com/v1/send \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"chain": "<string>",
"to": "<string>",
"amount": "<string>",
"from": "<string>",
"token": "<string>"
}
'import requests
url = "https://api.afkcrypto.com/v1/send"
payload = {
"chain": "<string>",
"to": "<string>",
"amount": "<string>",
"from": "<string>",
"token": "<string>"
}
headers = {
"Idempotency-Key": "<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: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
chain: '<string>',
to: '<string>',
amount: '<string>',
from: '<string>',
token: '<string>'
})
};
fetch('https://api.afkcrypto.com/v1/send', 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.afkcrypto.com/v1/send",
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([
'chain' => '<string>',
'to' => '<string>',
'amount' => '<string>',
'from' => '<string>',
'token' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <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.afkcrypto.com/v1/send"
payload := strings.NewReader("{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<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.afkcrypto.com/v1/send")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.afkcrypto.com/v1/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{ "id": "tx_...", "status": "SUBMITTED", "hash": "0x...", "explorerUrl": "https://basescan.org/tx/0x...", "chainName": "Base" }
Send Asset (EVM + Solana)
Send native assets and tokens on EVM and Solana with idempotent POST requests.
curl --request POST \
--url https://api.afkcrypto.com/v1/send \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"chain": "<string>",
"to": "<string>",
"amount": "<string>",
"from": "<string>",
"token": "<string>"
}
'import requests
url = "https://api.afkcrypto.com/v1/send"
payload = {
"chain": "<string>",
"to": "<string>",
"amount": "<string>",
"from": "<string>",
"token": "<string>"
}
headers = {
"Idempotency-Key": "<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: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
chain: '<string>',
to: '<string>',
amount: '<string>',
from: '<string>',
token: '<string>'
})
};
fetch('https://api.afkcrypto.com/v1/send', 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.afkcrypto.com/v1/send",
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([
'chain' => '<string>',
'to' => '<string>',
'amount' => '<string>',
'from' => '<string>',
'token' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <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.afkcrypto.com/v1/send"
payload := strings.NewReader("{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<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.afkcrypto.com/v1/send")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.afkcrypto.com/v1/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"chain\": \"<string>\",\n \"to\": \"<string>\",\n \"amount\": \"<string>\",\n \"from\": \"<string>\",\n \"token\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{ "id": "tx_...", "status": "SUBMITTED", "hash": "0x...", "explorerUrl": "https://basescan.org/tx/0x...", "chainName": "Base" }
Idempotency-Key header. ERC20 calls transfer(); SPL may create ATA if needed.{ "id": "tx_...", "status": "SUBMITTED", "hash": "0x...", "explorerUrl": "https://basescan.org/tx/0x...", "chainName": "Base" }
Authorizations
Headers
Provide a unique Idempotency-Key per user to ensure single submission.
Body
Chain slug (e.g., base, base-sepolia, solana-devnet).
Recipient wallet address (owner for token transfers).
Asset type to send.
native, erc20, spl Amount in base units (wei/lamports/token units).
Optional sender wallet; defaults to user's default wallet for the chain.
Token address (EVM) or mint (Solana) when sending tokens.
Response
Submission accepted
AFK transaction id for the submitted action.
Submission status.
SUBMITTED On-chain transaction hash/signature (may be null at submission time).
Direct link to the transaction on a chain explorer. Null until a hash/signature exists.
Human-readable chain name for display (e.g., Base, Ethereum, Solana).