curl --request POST \
--url https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"mode": "external_owner",
"ownerAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"spendLimitAtomic": "1000000",
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets"
payload = {
"mode": "external_owner",
"ownerAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"spendLimitAtomic": "1000000",
"metadata": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
mode: 'external_owner',
ownerAddress: '0x1111111111111111111111111111111111111111',
maxTransferAtomic: '1000000',
spendLimitAtomic: '1000000',
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets', 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/accounts/external/{externalUserId}/smart-wallets",
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([
'mode' => 'external_owner',
'ownerAddress' => '0x1111111111111111111111111111111111111111',
'maxTransferAtomic' => '1000000',
'spendLimitAtomic' => '1000000',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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/accounts/external/{externalUserId}/smart-wallets"
payload := strings.NewReader("{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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/accounts/external/{externalUserId}/smart-wallets")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"smartWallet": {
"id": "resource_123",
"accountId": "acct_123",
"environmentId": "environment_123",
"mode": "external_owner",
"chainId": 1,
"status": "example",
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:00:00.000Z"
},
"policy": {
"id": "resource_123",
"smartWalletId": "smartwallet_123",
"version": 1,
"roleKey": "example",
"executorAddress": "0x1111111111111111111111111111111111111111",
"tokenAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"status": "example"
},
"setupTransaction": {}
}{
"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"
}
}Create by external user ID
Same as POST /v2/accounts//smart-wallets, addressed by the partner-owned externalUserId instead of the canonical account id.
curl --request POST \
--url https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"mode": "external_owner",
"ownerAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"spendLimitAtomic": "1000000",
"metadata": {}
}
'import requests
url = "https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets"
payload = {
"mode": "external_owner",
"ownerAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"spendLimitAtomic": "1000000",
"metadata": {}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
mode: 'external_owner',
ownerAddress: '0x1111111111111111111111111111111111111111',
maxTransferAtomic: '1000000',
spendLimitAtomic: '1000000',
metadata: {}
})
};
fetch('https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets', 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/accounts/external/{externalUserId}/smart-wallets",
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([
'mode' => 'external_owner',
'ownerAddress' => '0x1111111111111111111111111111111111111111',
'maxTransferAtomic' => '1000000',
'spendLimitAtomic' => '1000000',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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/accounts/external/{externalUserId}/smart-wallets"
payload := strings.NewReader("{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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/accounts/external/{externalUserId}/smart-wallets")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.stableyard.fi/v2/accounts/external/{externalUserId}/smart-wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mode\": \"external_owner\",\n \"ownerAddress\": \"0x1111111111111111111111111111111111111111\",\n \"maxTransferAtomic\": \"1000000\",\n \"spendLimitAtomic\": \"1000000\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"smartWallet": {
"id": "resource_123",
"accountId": "acct_123",
"environmentId": "environment_123",
"mode": "external_owner",
"chainId": 1,
"status": "example",
"createdAt": "2026-08-28T10:00:00.000Z",
"updatedAt": "2026-08-28T10:00:00.000Z"
},
"policy": {
"id": "resource_123",
"smartWalletId": "smartwallet_123",
"version": 1,
"roleKey": "example",
"executorAddress": "0x1111111111111111111111111111111111111111",
"tokenAddress": "0x1111111111111111111111111111111111111111",
"maxTransferAtomic": "1000000",
"status": "example"
},
"setupTransaction": {}
}{
"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"
}
}externalUserId instead of the canonical account ID.Authorizations
HTTP Basic auth. Username is the Stableyard app ID. Password is the app secret. The optional Stableyard-Version request header must match the environment pin.
Headers
Optional contract-version assertion. Omit it to use the app environment's pinned version. A different supported version is accepted only after that environment is explicitly migrated.
2026-09-09 Path Parameters
Partner-owned external user id supplied when the UPA was created.
128"user_123"
Body
external_owner, managed EVM address. Required for external_owner mode.
Optional partner metadata. Must be JSON-safe, at most 4096 bytes, depth 3, 25 keys per object, 512 characters per string, and 50 items per array.
Response
Smart wallet
Show child attributes
Show child attributes
Present only when policy setup was computed for a newly created wallet.
Show child attributes
Show child attributes
Present only alongside policy. An unsigned Safe transaction payload the caller must sign and broadcast to finish on-chain vault setup.