Sign in
Konwersje/Convert API

Convert API

Wymieniaj kryptowaluty bezpośrednio z salda sklepu — pobierz aktualną wycenę i zrealizuj po cenie rynkowej.

Convert API pozwala wymieniać waluty przechowywane w saldzie Twojego sklepu po aktualnej cenie rynkowej — ten sam mechanizm, który obsługuje zakładkę Swap w panelu sklepu, teraz dostępny z poziomu Twojego backendu.

Punkty końcowe Convert są podpisywane Twoim zwykłym kluczem API — tym samym, który jest używany do żądań Payment API, nie kluczem Payout API. Wykonanie konwersji natychmiast obciąża i uznaje saldo Twojego sklepu, więc traktuj ten klucz z taką samą ostrożnością jak każde dane uwierzytelniające przenoszące pieniądze.

Pobieranie wyceny konwersji

Zwraca orientacyjną wycenę konwersji po aktualnej cenie rynkowej — efektywny kurs oraz wynikowe kwoty. Nic nie jest obciążane ani rezerwowane; wywołuj tyle razy, ile potrzebujesz przed wykonaniem.

POST/v1/convert/price

Parametry żądania

PoleTypWymaganeOpisWartość
from_currencystringtakWaluta źródłowa
to_currencystringtakWaluta docelowa. Musi różnić się od from_currency
amountdecimaltakKwota do konwersji, większa niż 0
amount_typestringtakDo której strony odnosi się amount

amount_type=from wydaje dokładnie amount w from_currency. amount_type=to otrzymuje dokładnie amount w to_currency.

🟢 200 OK · application/json

JSON
{
  "state": 0,
  "result": {
    "success": true,
    "from_currency": "BTC",
    "to_currency": "USDT",
    "amount_type": "from",
    "from_amount": "0.01000000",
    "to_amount": "947.86690000",
    "effective_rate": "94786.69000000",
    "from_amount_usd": "947.87",
    "to_amount_usd": "947.87"
  }
}

Pola odpowiedzi

PoleTypOpis
successbooleanCzy wycena została poprawnie obliczona
from_currencystringWaluta źródłowa
to_currencystringWaluta docelowa
amount_typestringPowtarza amount_type z żądania
from_amountstringKwota, która zostałaby obciążona w from_currency
to_amountstringKwota, która zostałaby zaksięgowana w to_currency
effective_ratestringKurs zastosowany do tej wyceny — 1 jednostka from_currency w to_currency (już z uwzględnieniem wyceny platformy)
from_amount_usdstring | nullRównowartość from_amount w USD
to_amount_usdstring | nullRównowartość to_amount w USD
  • Wycena ma charakter wyłącznie orientacyjny — cena rynkowa może się zmienić między pobraniem wyceny a wywołaniem realizacji.
  • Ten wywołanie nie obciąża ani nie rezerwuje żadnego salda.
Credentials
RequestPOST/v1/convert/price
curl -X POST https://api.2328.io/api/v1/convert/price \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE"
Response
Click Try it to see the response here.

Realizacja konwersji

Realizuje konwersję po aktualnej cenie rynkowej i aktualizuje saldo Twojego sklepu. Nie ma osobnego kroku „potwierdzenia wyceny” — wywołaj ten punkt końcowy bezpośrednio z kwotą, którą chcesz przekonwertować.

POST/v1/convert

Idempotencja. Powtórzenie dokładnie tego samego żądania (te same from_currency, to_currency, amount, amount_type) w ciągu około minuty od pierwszego wywołania zwraca istniejącą konwersję zamiast tworzyć drugą. Po upływie tego okna identyczne żądanie jest traktowane jako nowa konwersja — nie ponawiaj żądania na ślepo po przekroczeniu czasu oczekiwania bez wcześniejszego sprawdzenia poprzedniego wyniku.

Ten punkt końcowy jest ograniczony do 10 żądań na minutę na wywołującego — bardziej restrykcyjnie niż ogólny limit API — ponieważ każde wywołanie porusza realnym saldem.

Parametry żądania

PoleTypWymaganeOpisWartość
from_currencystringtakWaluta źródłowa
to_currencystringtakWaluta docelowa. Musi różnić się od from_currency
amountdecimaltakKwota do konwersji, większa niż 0
amount_typestringtakDo której strony odnosi się amount

🟢 200 OK · application/json

JSON
{
  "state": 0,
  "result": {
    "id": 12345,
    "type": "manual",
    "status": "completed",
    "from_currency": "BTC",
    "to_currency": "USDT",
    "from_amount": "0.01000000",
    "requested_from_amount": "0.01000000",
    "refund_amount": null,
    "to_amount": "947.86690000",
    "exchange_rate": "94786.69000000",
    "fee_amount": "0.00000000",
    "from_amount_usd": "947.87",
    "to_amount_usd": "947.87",
    "processed_at": "2026-01-20T15:30:24Z",
    "created_at": "2026-01-20T15:30:22Z"
  }
}

Pola odpowiedzi

PoleTypOpis
idintID zlecenia konwersji nadane przez system
typestringZawsze manual dla tego API
statusstringBieżący status (patrz «Statusy konwersji» poniżej)
from_currencystringWaluta źródłowa
to_currencystringWaluta docelowa
from_amountstringKwota obciążona w from_currency
requested_from_amountstring | nullTwoja pierwotnie żądana kwota źródłowa, gdy amount_type = from. null, gdy amount_type = to
refund_amountstring | nullCzęść wcześniej obciążonej kwoty zwrócona Ci po częściowej realizacji. null, jeśli zlecenie zrealizowano w całości
to_amountstringKwota zaksięgowana w to_currency
exchange_ratestringKurs faktycznie zastosowany do tej konwersji — 1 jednostka from_currency w to_currency (już z uwzględnieniem wyceny platformy)
fee_amountstringOpłata platformy naliczona za tę konwersję, wyrażona w from_currency lub to_currency w zależności od kierunku transakcji. Już uwzględniona w exchange_rate — pokazana dla przejrzystości
from_amount_usdstring | nullRównowartość from_amount w USD
to_amount_usdstring | nullRównowartość to_amount w USD
processed_atstring (ISO 8601) | nullMoment zakończenia realizacji konwersji. null, dopóki jest w trakcie przetwarzania
created_atstring (ISO 8601)Moment utworzenia zlecenia konwersji

Statusy konwersji

StatusOpis
pendingUtworzone, jeszcze nie wysłane na rynek
processingSaldo zablokowane, zlecenie umieszczone na rynku
completedW pełni zrealizowane — to_amount zostało zaksięgowane na Twoim saldzie
failedNie udało się zrealizować — wcześniej obciążona kwota została automatycznie zwrócona
partially_completedTylko dla par walut bez bezpośredniego rynku (routing przez walutę pośrednią): pierwszy etap zakończył się powodzeniem, ale drugi nie. Zamiast to_currency otrzymujesz walutę pośrednią — przekonwertuj ją ponownie, aby osiągnąć pierwotny cel
RequestPOST/v1/convert
curl -X POST https://api.2328.io/api/v1/convert \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE"
Response
Click Try it to see the response here.

Błędy

W przypadku niepowodzenia odpowiedź ma state: 1 oraz error_code — wspólne dla /v1/convert/price i /v1/convert:

🔴 422 / 400 · application/json

JSON
{
  "state": 1,
  "error_code": "amount_too_small",
  "errors": {
    "amount": "Amount is too small for this conversion. Please increase the amount and try again."
  }
}
error_codeStatus HTTPOpis
validation_failed422Nieprawidłowe lub brakujące parametry albo odrzucenie z powodu reguły biznesowej (np. niewystarczające saldo) — szczegóły w polu errors
amount_too_small422amount jest poniżej minimalnej wielkości transakcji dla tej pary walut
convert_unavailable400Nie udało się w tej chwili zrealizować konwersji (dane rynkowe niedostępne lub brak trasy między dwiema walutami) — spróbuj ponownie wkrótce
internal_error400Nieoczekiwany wewnętrzny błąd serwera podczas przetwarzania żądania

Automatyczna konwersja wpływających płatności

Auto-konwersja jest ustawieniem projektu dla wpływających faktur i kredytów w portfelach statycznych. Konfiguruje się ją w panelu sprzedawcy, a nie przez dodawanie pól do /v1/payment. Każda reguła wybiera jedną lub więcej walut źródłowych i walutę docelową.

Po zakończeniu konwersji informacje o płatności i webhooks sprzedawcy mogą obejmować:

JSON
{
  "payment_amount": "0.14800000",
  "merchant_amount": "0.146520000000000000",
  "payer_currency": "XMR",
  "convert": {
    "to_currency": "USDT",
    "commission": "0.09000000",
    "rate": "323.21000000",
    "amount": "47.262015740000000000"
  }
}

Zakresy kwot są celowo oddzielne:

  • payment_amount — co zostało wykryte na łańcuchu w walucie płatności źródłowej;
  • merchant_amount — netto kwota źródłowa przypisana sprzedawcy przed konwersją;
  • convert.amount — kwota zaksięgowana w convert.to_currency;
  • convert.rate i convert.commission — wynik wykonanej konwersji, a nie cena, którą powinieneś przeliczać lokalnie.

Brak convert ma znaczenie: konwersja mogła nie zostać ukończona, może nie być skonfigurowana dla tego źródła lub mogła powrócić do kredytu w walucie źródłowej. Nigdy nie wymyślaj kwoty docelowej na podstawie /exchange-rates ani ceny rynkowej.

Nieudana automatyczna konwersja i przejście do

Konwersja następuje po otrzymaniu płatności w blockchain. Dostępność na rynku, minimalne wielkości zamówień, ograniczenia dokładności, limity czasowe wymiany i niewystarczająca wykonalna płynność mogą opóźnić lub uniemożliwić konwersję.

  • Wpłaty poniżej minimalnej wartości globalnej/projektowej omijają proces konwersji i są księgowane w walucie źródłowej.
  • Przejściowe awarie mogą być ponawiane asynchronicznie.
  • Duże lub niehandlowalne wpłaty mogą zostać przepięte na kredyt w walucie źródłowej po wyczerpaniu polityki ponawiania.
  • Płatność może być zatem ważna nawet wtedy, gdy żądana konwersja na walutę docelową nie nastąpiła.

Twoja integracja powinna najpierw zapisać zweryfikowaną płatność, a następnie uzgodnić faktycznie uznaną walutę z informacji o płatności, opcjonalnego bloku convert oraz sald handlowca. Nie blokuj potwierdzenia webhooka płatności podczas oczekiwania na własne systemy analityczne lub powiadomień.

Testy akceptacji automatycznej konwersji

Przetestuj co najmniej: pomyślna bezpośrednia konwersja, konwersja pośrednia/wieloetapowa, pył poniżej minimum, tymczasowa ponowna próba, powrót do waluty źródłowej, niedopłata, nadpłata, zduplikowany webhook, brak convert oraz uzgodnienie po niejednoznacznym przekroczeniu limitu czasu.

Ręczne przypadki krawędziowe konwersji

  • /v1/convert/price to poglądowa wskazówka; ruchy na rynku mogą zmienić wynik wykonania.
  • amount_type: from naprawia żądanie po stronie źródłowej, podczas gdy amount_type: to żąda kwoty po stronie docelowej. Nie zamieniaj znaczenia przy prezentowaniu interfejsu potwierdzenia.
  • Para bez bezpośredniego rynku może być skierowana przez walutę pośrednią. Jeśli tylko jedna część zostanie zakończona, partially_completed raportuje kredyt pośredni.
  • Jeśli wywołanie execute przekroczy limit czasu, przeprowadź uzgadnianie przed ponowną próbą. Zlecenie rynkowe może zostać zrealizowane nawet wtedy, gdy jego odpowiedź HTTP zostanie utracona.
  • Traktuj failed jako stan do uzgodnienia, a nie jako pozwolenie na zastosowanie lokalnej wpisu kompensacyjnego; platforma zarządza księgowością debetów/zwrotów.