Authentification

Toutes les requĂȘtes API nĂ©cessitent une authentification HMAC-SHA256. Obtenez vos identifiants dans le tableau de bord → Boutiques.

En-tĂȘtes requis

En-tĂȘteDescription
X-Api-KeyClé API de votre boutique
X-TimestampHorodatage Unix actuel (fenĂȘtre ±5 min)
X-SignatureHMAC-SHA256 de timestamp + method + path + body signé avec API Secret

Exemple de signature

payload = "1700000000" + "POST" + "/api/v1/payment/create" + '{"amount":"100"}'
signature = HMAC-SHA256(payload, api_secret)
Chaque boutique a sa propre clé API. Un compte peut avoir plusieurs boutiques.

Créer un paiement

POST/api/v1/payment/createAuth Required

CrĂ©er un nouveau paiement. Supporte crypto direct et conversion fiat→crypto.

Corps de la requĂȘte (JSON)

ParamĂštreTypeDescription
amount*stringMontant en crypto (ex. "100.00" USDT ou "0.005" BTC)
order_idstringVotre ID de commande interne
fiat_amountstringMontant en fiat (remplace amount)
fiat_currencystringDevise fiat : USD, EUR, RUB, CNY, GBP
metadataobjectJSON arbitraire (retourné dans le webhook)
La devise est configurée par boutique dans le Tableau de bord. Si plusieurs devises, l'API retourne un payment_url avec sélection. Sinon, le paiement est créé immédiatement.
Utilisez fiat_amount + fiat_currency pour la conversion automatique.

RĂ©ponse — Devise unique

{
  "success": true,
  "data": {
    "payment_id": "a1b2c3d4-...",
    "amount": "100.14",
    "currency": "USDT_TRC20",
    "pay_address": "TXyz...abc",
    "status": "pending",
    "expires_at": "2025-01-15T12:30:00Z",
    "payment_url": "https://soko.ai/pay/a1b2c3d4-..."
  }
}

RĂ©ponse — Plusieurs devises (sĂ©lection requise)

{
  "success": true,
  "data": {
    "payment_id": null,
    "status": "selecting",
    "amount": 100,
    "currencies": ["USDT_TRC20", "BTC", "ETH"],
    "payment_url": "https://soko.ai/pay/select?token=..."
  }
}
Important : Redirigez toujours vers payment_url. Quand payment_id est null, l'utilisateur choisira une devise.

Statut du paiement

GET/api/v1/payment/{payment_id}Auth Required

Réponse

{
  "success": true,
  "data": {
    "payment_id": "a1b2c3d4-...",
    "order_id": "ORDER-123",
    "status": "completed",
    "amount_requested": 100.14,
    "amount_with_cents": 100.14,
    "amount_received": 100.14,
    "currency": "USDT_TRC20",
    "pay_address": "TXyz...abc",
    "tx_hash": "abc123...",
    "confirmations": 21,
    "confirmed_at": "2025-01-15T12:25:00Z",
    "expires_at": "2025-01-15T12:30:00Z",
    "created_at": "2025-01-15T12:00:00Z"
  }
}

Statuts de paiement

StatusDescription
selectingEn attente du choix de devise
pendingEn attente de paiement
queuedTous les slots USDT occupés
confirmingTransaction détectée
completedPaiement confirmé
expiredPaiement expiré
overpaidMontant supérieur au prévu
underpaidMontant inférieur au prévu

Liste des paiements

GET/api/v1/paymentsAuth Required

Liste paginée. Filtrer par status, currency, dates.

ParamĂštres de requĂȘte

ParamĂštreTypeDescription
pageoptionalintegerNuméro de page (défaut : 1)
per_pageoptionalintegerRésultats par page, 1-100 (défaut : 20)
statusoptionalstringFiltrer par statut
currencyoptionalstringFiltrer par devise

Solde du marchand

GET/api/v1/merchant/balanceAuth Required
{
  "success": true,
  "data": {
    "USDT_TRC20": {
      "available": 1250.50,
      "pending": 100.00,
      "total_received": 5000.00,
      "total_withdrawn": 3750.00,
      "total_commission": 75.00
    },
    "BTC": {
      "available": 0.05000000,
      "pending": 0.00100000,
      "total_received": 0.10000000,
      "total_withdrawn": 0.04900000,
      "total_commission": 0.00150000
    },
    "ETH": {
      "available": 1.25000000,
      "pending": 0.10000000,
      "total_received": 2.00000000,
      "total_withdrawn": 0.65000000,
      "total_commission": 0.03000000
    }
  }
}

Taux de change Public

GET/api/v1/rates

Sans authentification. Cache 5 min.

Conversion

GET /api/v1/rates?amount=5000&fiat=RUB&crypto=USDT_TRC20

{
  "success": true,
  "data": {
    "rates": {
      "btc": { "usd": 97500, "eur": 91200, "rub": 8775000 },
      "eth": { "usd": 3200, "eur": 2990, "rub": 288000 },
      "usdt": { "usd": 1.0001, "eur": 0.935, "rub": 90.5 }
    },
    "converted": 55.24
  }
}

Webhooks

Lors d'un changement de statut, nous envoyons un POST Ă  votre URL webhook.

En-tĂȘtes du webhook

En-tĂȘteDescription
X-SignatureHMAC-SHA256 de timestamp + body signé avec Webhook Secret
X-TimestampHorodatage Unix

Corps du webhook

{
  "event": "payment.completed",
  "payment_id": "a1b2c3d4-...",
  "order_id": "ORDER-123",
  "amount": 100.14,
  "amount_received": 100.14,
  "currency": "USDT_TRC20",
  "tx_hash": "abc123...",
  "confirmed_at": "2025-01-15T12:25:00Z",
  "status": "completed",
  "metadata": { "user_id": 42 }
}

ÉvĂ©nements

payment.completedPaiement confirmé
payment.confirmingTransaction détectée
payment.expiredPaiement expiré
payment.underpaidMontant insuffisant
Vérifiez toujours la signature. Retournez HTTP 200. Jusqu'à 5 tentatives.

Vérification de signature (PHP)

$timestamp = $_SERVER['HTTP_X_TIMESTAMP'];
$signature = $_SERVER['HTTP_X_SIGNATURE'];
$body = file_get_contents('php://input');

$expected = hash_hmac('sha256', $timestamp . $body, $webhookSecret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    die('Invalid signature');
}

$payload = json_decode($body, true);
// Process payment...

Widget JavaScript

Intégrez un widget de paiement. Juste HTML + JS.

Démarrage rapide

<script src="https://soko.ai/widget.js"></script>
<script>
CryptoMerchant.init({ apiKey: 'YOUR_STORE_API_KEY' });

document.getElementById('pay-btn').addEventListener('click', function() {
    CryptoMerchant.pay({
        amount: 100.00,
        order_id: 'ORDER-123',

        // Or use fiat conversion:
        // fiat_amount: 5000,
        // fiat_currency: 'RUB',

        onSuccess: function(payment) {
            alert('Payment confirmed! TX: ' + payment.tx_hash);
        },
        onClose: function() {
            console.log('Widget closed');
        },
        onError: function(err) {
            console.error('Payment error:', err);
        }
    });
});
</script>

<button id="pay-btn">Pay with Crypto</button>
Le widget s'ouvre dans un overlay iframe.

Acceptez les dons en cryptomonnaie sur n\importe quel site. Aucune signature API requise — juste votre clĂ© API de boutique.

Comment ça marche

Activez les dons dans les paramĂštres de votre boutique, puis ajoutez le widget Ă  votre site. Les visiteurs peuvent donner en USDT, BTC ou ETH. Chaque don crĂ©e un paiement suivi — visible dans le Tableau de bord sous ❀ Dons.

DĂ©marrage rapide — Bouton

Ajoute un bouton "Donner" Ă  l\emplacement du script :

<script src="https://soko.ai/donate-widget.js"
        data-store-key="YOUR_STORE_API_KEY"></script>

Barre supérieure

Affiche une barre fixe de don en haut de la page :

<script src="https://soko.ai/donate-widget.js"
        data-store-key="YOUR_STORE_API_KEY"
        data-mode="topbar"></script>

En ligne

Affiche le bouton à l\intérieur d\un élément spécifique :

<div id="crypto-donate"></div>
<script src="https://soko.ai/donate-widget.js"
        data-store-key="YOUR_STORE_API_KEY"
        data-mode="inline"
        data-target="crypto-donate"></script>

Attributs de personnalisation

ParamĂštreDescription
data-store-keyClé API de boutique required
data-modebutton (par défaut), topbar ou inline
data-targetID d\élément pour le mode inline optional
data-textTexte personnalisé (remplace les paramÚtres de boutique) optional
data-amountsMontants prédéfinis, séparés par virgules : "5,10,25" optional
data-colorCouleur d\accent, ex. "#e11d48" optional

Page de don directe

Vous pouvez aussi créer un lien direct vers la page de don sans widget :

https://soko.ai/donate/YOUR_STORE_API_KEY

API : Créer un Don

POST/donate/create Public

Créez un don par programmation. Aucune signature requise.

ParamĂštreDescription
api_keyClé API de boutique required
fiat_amountMontant en fiat (ex. 10) required*
fiat_currencyCode de devise fiat (ex. USD) optional, default: USD
amountMontant crypto direct (alternative au fiat) optional
currencyUSDT_TRC20, BTC ou ETH required
donor_nameNom du donateur optional
donor_messageMessage du donateur (max 500 caractĂšres) optional
Les dons ne dĂ©clenchent pas de webhooks. Suivez-les dans Tableau de bord → ❀ Dons.

Gestion des erreurs

{
  "success": false,
  "error": "Description of what went wrong"
}
Code HTTPSignification
200SuccĂšs
400RequĂȘte invalide
401Auth manquante
403Signature invalide
404Non trouvé
500Erreur serveur

Exemples de code

PHP
Python
Node.js
cURL
<?php
$apiKey = 'your_api_key';
$apiSecret = 'your_api_secret';

$body = json_encode([
    'amount' => '100.00',
    'order_id' => 'ORDER-' . time(),
]);

$timestamp = (string) time();
$method = 'POST';
$path = '/api/v1/payment/create';

$signature = hash_hmac('sha256', $timestamp . $method . $path . $body, $apiSecret);

$ch = curl_init('https://soko.ai' . $path);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-Api-Key: ' . $apiKey,
        'X-Timestamp: ' . $timestamp,
        'X-Signature: ' . $signature,
    ],
]);

$response = json_decode(curl_exec($ch), true);
echo $response['data']['payment_url'];
import hmac, hashlib, time, json, requests

API_KEY = 'your_api_key'
API_SECRET = 'your_api_secret'
BASE_URL = 'https://soko.ai'

body = json.dumps({
    'amount': '100.00',
    'order_id': f'ORDER-{int(time.time())}'
})

timestamp = str(int(time.time()))
method = 'POST'
path = '/api/v1/payment/create'

payload = f'{timestamp}{method}{path}{body}'
signature = hmac.new(API_SECRET.encode(), payload.encode(), hashlib.sha256).hexdigest()

r = requests.post(f'{BASE_URL}{path}', data=body, headers={
    'Content-Type': 'application/json',
    'X-Api-Key': API_KEY,
    'X-Timestamp': timestamp,
    'X-Signature': signature,
})

print(r.json()['data']['payment_url'])
const crypto = require('crypto');
const https = require('https');

const API_KEY = 'your_api_key';
const API_SECRET = 'your_api_secret';

const body = JSON.stringify({
    amount: '100.00',
    order_id: `ORDER-${Date.now()}`
});

const timestamp = Math.floor(Date.now() / 1000).toString();
const method = 'POST';
const path = '/api/v1/payment/create';

const signature = crypto
    .createHmac('sha256', API_SECRET)
    .update(timestamp + method + path + body)
    .digest('hex');

fetch('https://soko.ai' + path, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-Api-Key': API_KEY,
        'X-Timestamp': timestamp,
        'X-Signature': signature,
    },
    body
})
.then(r => r.json())
.then(data => console.log(data.data.payment_url));
# Generate signature first (bash):
TIMESTAMP=$(date +%s)
BODY='{"amount":"100.00","order_id":"ORDER-1"}'
PAYLOAD="${TIMESTAMP}POST/api/v1/payment/create${BODY}"
SIGNATURE=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "your_api_secret" | cut -d' ' -f2)

curl -X POST https://soko.ai/api/v1/payment/create \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: your_api_key" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Signature: $SIGNATURE" \
  -d "$BODY"
English РуссĐșĐžĐč äž­æ–‡ Español Deutsch Français PortuguĂȘs æ—„æœŹèȘž