Přeskočit obsah

PHP Průvodce: Účet a zůstatky

Autentizované endpointy pro správu peněženek a audit transakcí.


1. Kontrola zůstatků

use RevolutX\Client;

$client = new Client(apiKey: '...', privateKeyPath: 'keys/private.pem');

// Zůstatky všech měn na účtu
$balances = $client->getBalances();

foreach ($balances as $b) {
    if ((float)$b['total'] > 0) {
        echo "Měna: {$b['currency']} | Dostupné: {$b['available']} | Rezervováno: {$b['reserved']}\n";
    }
}

// Rychlé zjištění jedné měny
$eur = $client->getBalance('EUR');
echo "Disponibilní EUR: {$eur['available']}\n";

2. Transakční historie (Ledger)

Endpoint vrací vklady, výběry, směny měn a vypořádání obchodů s podporou kurzorového stránkování.

Každá transakce je modelována jako převod mezi dvěma stranami: source (co odešlo) a destination (co přišlo). Pole amount na nejvyšší úrovni neexistuje — částka je vždy uvnitř source/destination, protože obě strany mohou být v různých měnách (např. buy odesílá EUR a přijímá BTC).

$result = $client->getTransactions(limit: 20);
$transactions = $result['transactions'];
$nextCursor = $result['next_cursor'];

foreach ($transactions as $tx) {
    echo "ID: {$tx['id']} | Typ: {$tx['type']} | Stav: {$tx['status']}\n";
    echo "  Odesláno: {$tx['source']['amount']} {$tx['source']['currency']}\n";
    echo "  Přijato:  {$tx['destination']['amount']} {$tx['destination']['currency']}\n";
}

Struktura transakce

Pole Typ Popis
id string Unikátní identifikátor transakce (UUID).
status string Stav zpracování, např. completed.
type string Typ transakce: buy, sell, receive, send.
source.amount string Částka odepsaná ze zdrojové strany.
source.currency string Měna zdrojové strany (např. EUR, BTC).
source.account.type string Zdrojový účet: revolut_x (burza) nebo revolut (hlavní aplikace Revolut).
destination.amount string Částka připsaná na cílovou stranu.
destination.currency string Měna cílové strany.
destination.account.type string Cílový účet: revolut_x nebo revolut.
created_date int Čas vytvoření — Unix timestamp v milisekundách.
processed_date int Čas vypořádání — Unix timestamp v milisekundách.

Ukázka surové transakce typu sell (0.00001 BTC → 0.74 EUR):

[
    'id' => '6aca5f93-3529-a8dd-a88b-7fd105c824d5',
    'status' => 'completed',
    'type' => 'sell',
    'source' => [
        'amount' => '0.00001000',
        'currency' => 'BTC',
        'account' => ['type' => 'revolut_x'],
    ],
    'destination' => [
        'amount' => '0.74',
        'currency' => 'EUR',
        'account' => ['type' => 'revolut_x'],
    ],
    'created_date' => 1791647635654,
    'processed_date' => 1791647642966,
]

Jak číst strany podle typu

U buy je zdrojem fiat a cílem krypto, u sell je to naopak. receive se source.account.type = revolut znamená dobití z hlavního Revolut účtu na Revolut X.

Časové údaje jsou v milisekundách, před formátováním je proto vyděl:

$processedAt = (new DateTimeImmutable())->setTimestamp(intdiv($tx['processed_date'], 1000));
echo $processedAt->format('Y-m-d H:i:s');

3. Historie vlastních obchodů (Private Trades)

Private trades jsou tvoje vlastní exekuce (fills), každá navázaná na objednávku, která ji vytvořila.

Zkrácené názvy polí

Tento endpoint vrací zkrácené klíče (p, q, s, tid, …) — nikoli plné názvy použité jinde v API. Klíče side, price ani quantity neexistují; použij s, p a q.

$history = $client->getAccountTrades('BTC-EUR', limit: 50);

foreach ($history['trades'] as $trade) {
    echo "Strana: {$trade['s']} | Cena: {$trade['p']} {$trade['pc']} | Objem: {$trade['q']} {$trade['qc']}\n";

    // Hodnota exekuce
    $notional = (float)$trade['p'] * (float)$trade['q'];
    echo "  Hodnota: " . number_format($notional, 2) . " {$trade['pc']}\n";
}

Struktura private trade

Pole Typ Popis
tid string Identifikátor obchodu (fillu).
oid string ID objednávky, která exekuci vytvořila — odpovídá venue_order_id z placeOrder().
s string Strana: buy nebo sell.
p float Realizovaná cena, vyjádřená v pc.
pc string Měna ceny — kótovaná měna (např. EUR).
q string Realizované množství, vyjádřené v qc.
qc string Měna množství — základní měna (např. BTC).
aid string ID základního aktiva (např. BTC).
anm string Čitelný název aktiva (např. Bitcoin).
tdt int Čas obchodu — Unix timestamp v milisekundách.
pdt int Čas zpracování — Unix timestamp v milisekundách.
pn string Notace ceny, např. MONE (peněžní).
qn string Notace množství, např. UNIT.
ve string Místo exekuce (venue), např. REVX.
vp string Poskytovatel venue, např. REVX.
im string Maker příznak: 1 pokud byla exekuce Maker, prázdné pokud Taker.

Ukázka surové exekuce typu buy:

[
    'tdt' => 1791647668224,
    'aid' => 'BTC',
    'anm' => 'Bitcoin',
    'p' => 74059.5,
    'pc' => 'EUR',
    'pn' => 'MONE',
    'q' => '0.00006751',
    'qc' => 'BTC',
    'qn' => 'UNIT',
    've' => 'REVX',
    'pdt' => 1791647668224,
    'vp' => 'REVX',
    'tid' => '01fe035493603ee083af048511364379',
    's' => 'buy',
    'oid' => 'de238453-7ac1-41dd-9ab9-e631f01ca4c6',
    'im' => '1',
]

Poplatek v odpovědi není

Odpověď neobsahuje výši poplatku. Očekávaný poplatek spočítej pomocí FeeCalculator z p, q a role Maker/Taker (im), případně dopočítej ze zůstatků.

Čitelné časy a označení role Maker/Taker:

foreach ($history['trades'] as $trade) {
    $when = (new DateTimeImmutable())->setTimestamp(intdiv($trade['tdt'], 1000));
    $role = !empty($trade['im']) ? 'Maker' : 'Taker';

    echo "{$when->format('Y-m-d H:i:s')} | {$role} | {$trade['s']} {$trade['q']} {$trade['qc']}"
       . " @ {$trade['p']} {$trade['pc']}\n";
}