REST API

Stableyard provides a comprehensive REST API for all integrations. Use standard HTTP clients in any language.

Base URLs

EnvironmentBase URL
Sandboxhttps://sandbox.api.stableyard.fi
Productionhttps://api.stableyard.fi

Authentication

All requests require the Authorization header with Basic auth. Account and Vault APIs use both STABLEYARD_APP_ID and STABLEYARD_APP_SECRET. All other APIs use only STABLEYARD_APP_ID. Obtain your credentials from the Stableyard SDK:
# Account & Vault APIs (STABLEYARD_APP_ID and STABLEYARD_APP_SECRET)
curl -X GET https://api.stableyard.fi/sdk/v1/get-user?userId=user_123 \
  -H "Authorization: Basic $(echo -n $STABLEYARD_APP_ID:$STABLEYARD_APP_SECRET | base64)" \
  -H "Content-Type: application/json"
# Other APIs (only STABLEYARD_APP_ID needed)
curl -X POST https://api.stableyard.fi/sdk/v1/quote \
  -H "Authorization: Basic $(echo -n $STABLEYARD_APP_ID | base64)" \
  -H "Content-Type: application/json"

Language Examples

JavaScript / TypeScript

const APP_ID = process.env.STABLEYARD_APP_ID;
const APP_SECRET = process.env.STABLEYARD_APP_SECRET;
const BASE_URL = 'https://api.stableyard.fi';
const credentials = Buffer.from(`${APP_ID}:${APP_SECRET}`).toString('base64');
const appIdOnly = Buffer.from(APP_ID).toString('base64');

// Register a user
async function registerUser(username: string, addresses: string[]) {
  const response = await fetch(`${BASE_URL}/sdk/v1/register`, {
    method: 'POST',
    headers: {
      'Authorization': `Basic ${credentials}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ username, addresses })
  });
  return response.json();
}

// Get user balance
async function getBalance(userId: string) {
  const response = await fetch(`${BASE_URL}/sdk/v1/get-balance`, {
    method: 'POST',
    headers: {
      'Authorization': `Basic ${credentials}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ userId })
  });
  return response.json();
}

// Create payment quote
async function createQuote(userId: string, amount: string, destinationPaymentAddress: string) {
  const response = await fetch(`${BASE_URL}/sdk/v1/quote`, {
    method: 'POST',
    headers: {
      'Authorization': `Basic ${appIdOnly}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ userId, amount, destinationPaymentAddress })
  });
  return response.json();
}

Python

import requests
import base64

APP_ID = 'YOUR_STABLEYARD_APP_ID'
APP_SECRET = 'YOUR_STABLEYARD_APP_SECRET'
BASE_URL = 'https://api.stableyard.fi'

credentials = base64.b64encode(f'{APP_ID}:{APP_SECRET}'.encode()).decode()
headers = {
    'Authorization': f'Basic {credentials}',
    'Content-Type': 'application/json'
}

# Register a user
def register_user(partner_id, username, addresses):
    response = requests.post(
        f'{BASE_URL}/sdk/v1/register',
        headers=headers,
        json={
            'username': username,
            'addresses': addresses
        }
    )
    return response.json()

# Get user balance
def get_balance(user_id):
    response = requests.post(
        f'{BASE_URL}/sdk/v1/get-balance',
        headers=headers,
        json={'userId': user_id}
    )
    return response.json()

# Create payment quote
def create_quote(user_id, partner_id, amount, destination):
    response = requests.post(
        f'{BASE_URL}/sdk/v1/quote',
        headers=headers,
        json={
            'userId': user_id,
            'amount': amount,
            'destinationPaymentAddress': destination
        }
    )
    return response.json()

Go

package main

import (
    "bytes"
    "encoding/base64"
    "encoding/json"
    "net/http"
)

const (
    appID     = "YOUR_STABLEYARD_APP_ID"
    appSecret = "YOUR_STABLEYARD_APP_SECRET"
    baseURL   = "https://api.stableyard.fi"
)

func getAuthHeader() string {
    return "Basic " + base64.StdEncoding.EncodeToString([]byte(appID+":"+appSecret))
}

func registerUser(username string, addresses []string) (map[string]interface{}, error) {
    payload, _ := json.Marshal(map[string]interface{}{
        "username":  username,
        "addresses": addresses,
    })

    req, _ := http.NewRequest("POST", baseURL+"/sdk/v1/register", bytes.NewBuffer(payload))
    req.Header.Set("Authorization", getAuthHeader())
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    return result, nil
}

Complete Payment Flow Example

// 1. Register user
const user = await registerUser('your_partner_id', 'alice', ['0x...']);
console.log('User created:', user.data.userId);

// 2. Create vault
const vault = await fetch(`${BASE_URL}/sdk/v1/create-vault`, {
  method: 'POST',
  headers: { 'Authorization': `Basic ${credentials}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ userId: user.data.userId })
}).then(r => r.json());
console.log('Vault:', vault.data.vaultAddress);

// 3. Get balance
const balance = await getBalance(user.data.userId);
console.log('Balance:', balance.data.balance, 'USDC');

// 4. Create payment quote
const quote = await createQuote(
  user.data.userId,
  'your_partner_id',
  '100.00',
  'merchant@stableyard'
);
console.log('Quote:', quote.data.quoteData);

// 5. User signs the quote payload (implement based on your wallet)
const signature = await getUserSignature(quote.data.quoteData.payload);

// 6. Settle payment
const settlement = await fetch(`${BASE_URL}/sdk/v1/settle`, {
  method: 'POST',
  headers: { 'Authorization': `Basic ${appIdOnly}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    payload: quote.data.quoteData.payload,
    signature: signature,
    domain: quote.data.domain,
    types: quote.data.types
  })
}).then(r => r.json());
console.log('Payment settled:', settlement);

API Access

Contact us for API access:
See API Overview for complete endpoint documentation.