curl --request POST \
--url https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"asset": "RD",
"amount": "2.00"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({asset: 'RD', amount: '2.00'})
};
fetch('https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet"
payload = {
"asset": "RD",
"amount": "2.00"
}
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)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet"
payload := strings.NewReader("{\n \"asset\": \"RD\",\n \"amount\": \"2.00\"\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))
}{
"simulation_id": "sim_faucet_01J8ZQ4T7K2M9X",
"wallet_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"asset": "RD",
"amount": "2.00",
"status": "accepted"
}Fund a sandbox wallet from the testnet faucet
Sends testnet RD from Dakotaās sandbox float wallet to the wallet on Base Sepolia. The transfer is a real on-chain send, so the balance arrives through the same deposit ingestion a customerās own deposit takes; only the trigger is synthetic.
Accepted immediately. Poll GET /sandbox/simulations/{simulation_id}
for the terminal state; the simulation completes once the deposit
webhook is ingested.
The faucet draws on a shared float, so calls are metered per wallet per day, per client per day, and against a floor the float must still hold after the transfer. Each refusal carries a distinct problem type so a client can tell a limit that clears on its own from one that needs an operator.
Available in sandbox mode only.
curl --request POST \
--url https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"asset": "RD",
"amount": "2.00"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({asset: 'RD', amount: '2.00'})
};
fetch('https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet"
payload = {
"asset": "RD",
"amount": "2.00"
}
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)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/sandbox/wallets/{wallet_id}/faucet"
payload := strings.NewReader("{\n \"asset\": \"RD\",\n \"amount\": \"2.00\"\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))
}{
"simulation_id": "sim_faucet_01J8ZQ4T7K2M9X",
"wallet_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"asset": "RD",
"amount": "2.00",
"status": "accepted"
}Authorizations
Headers
Unique key (UUID) to ensure request idempotency on POST, PUT and PATCH requests.
A key is scoped to your client, the HTTP method and the path, and is remembered for 24 hours after a
successful (below 400) response. Repeating the same request (same JSON body, whatever the key order or
whitespace) with the same key within that window returns the original response with
X-Idempotent-Replayed: true instead of executing the request again. Using the same key on the same
endpoint with a different body returns 422 with problem type idempotency-key-reused; the request is
not executed. Error responses (4xx and 5xx) are not remembered, so a request refused for a fixable reason
can be corrected and retried under the same key. Request bodies that are not JSON (for example file
uploads) are not compared.
Path Parameters
Wallet to fund. KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Body
A request to fund a sandbox wallet from the testnet float.
Response
Faucet transfer accepted
An accepted faucet transfer.
Simulation identifier. Resolve it with
GET /sandbox/simulations/{simulation_id}.
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Asset that was sent.
"RD"
Amount that was sent, in decimal token units.
"2.00"
State of a sandbox simulation after submission.
accepted Reserved for the on-chain transaction hash. The faucet answers
before the transfer has one, so the accepted response does not
carry it. Do not depend on this field; poll
GET /sandbox/simulations/{simulation_id} for the outcome.
Was this page helpful?

