Sign in
Conversioni/Convert API

Convert API

Converti tra criptovalute direttamente dal saldo del tuo negozio — ottieni una quotazione in tempo reale ed esegui al prezzo di mercato.

La Convert API ti permette di scambiare le valute detenute nel saldo del tuo negozio al prezzo di mercato attuale — lo stesso motore che alimenta la scheda Swap nella dashboard del negozio, ora richiamabile dal tuo backend.

Gli endpoint Convert vengono firmati con la tua chiave API abituale — la stessa usata per le richieste della Payment API, non la chiave Payout API. Eseguire una conversione addebita e accredita immediatamente il saldo del tuo negozio, quindi tratta questa chiave con la stessa cautela di qualsiasi credenziale che muove denaro.

Ottenere una quotazione di conversione

Restituisce una quotazione indicativa per una conversione al prezzo di mercato attuale — il tasso effettivo e gli importi risultanti. Nulla viene addebitato o riservato; chiamala tutte le volte che ti serve prima di eseguire.

POST/v1/convert/price

Parametri della richiesta

CampoTipoObbligatorioDescrizioneValore
from_currencystringValuta di origine
to_currencystringValuta di destinazione. Deve essere diversa da from_currency
amountdecimalImporto da convertire, maggiore di 0
amount_typestringA quale lato si riferisce amount

amount_type=from spende esattamente amount di from_currency. amount_type=to riceve esattamente amount di 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"
  }
}

Campi della risposta

CampoTipoDescrizione
successbooleanSe la quotazione è stata calcolata con successo
from_currencystringValuta di origine
to_currencystringValuta di destinazione
amount_typestringRiporta l'amount_type della richiesta
from_amountstringImporto che verrebbe addebitato in from_currency
to_amountstringImporto che verrebbe accreditato in to_currency
effective_ratestringTasso applicato a questa quotazione — 1 unità di from_currency in to_currency (include già il prezzo della piattaforma)
from_amount_usdstring | nullEquivalente in USD di from_amount
to_amount_usdstring | nullEquivalente in USD di to_amount
  • La quotazione è solo indicativa — il prezzo di mercato può cambiare tra la quotazione e la chiamata di esecuzione.
  • Questa chiamata non addebita né riserva alcun saldo.
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.

Eseguire una conversione

Esegue una conversione al prezzo di mercato attuale e aggiorna il saldo del tuo negozio. Non esiste un passaggio separato per "confermare una quotazione" — chiama direttamente questo endpoint con l'importo che vuoi convertire.

POST/v1/convert

Idempotenza. Ripetere esattamente la stessa richiesta (stessi from_currency, to_currency, amount, amount_type) entro circa un minuto dalla prima chiamata restituisce la conversione esistente invece di crearne una seconda. Superata questa finestra, una richiesta identica viene trattata come una nuova conversione — non ritentare alla cieca dopo un timeout senza prima verificare il risultato precedente.

Questo endpoint è limitato a 10 richieste al minuto per chiamante — più restrittivo del limite generale dell'API — perché ogni chiamata movimenta saldo reale.

Parametri della richiesta

CampoTipoObbligatorioDescrizioneValore
from_currencystringValuta di origine
to_currencystringValuta di destinazione. Deve essere diversa da from_currency
amountdecimalImporto da convertire, maggiore di 0
amount_typestringA quale lato si riferisce 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"
  }
}

Campi della risposta

CampoTipoDescrizione
idintID dell'ordine di conversione assegnato dal sistema
typestringSempre manual per questa API
statusstringStato attuale (vedi «Stati di conversione» qui sotto)
from_currencystringValuta di origine
to_currencystringValuta di destinazione
from_amountstringImporto addebitato in from_currency
requested_from_amountstring | nullIl tuo importo di origine originariamente richiesto quando amount_type = from. null quando amount_type = to
refund_amountstring | nullParte dell'importo pre-addebitato rimborsata dopo un'esecuzione parziale. null se l'ordine è stato eseguito completamente
to_amountstringImporto accreditato in to_currency
exchange_ratestringTasso effettivamente applicato a questa conversione — 1 unità di from_currency in to_currency (include già il prezzo della piattaforma)
fee_amountstringCommissione della piattaforma applicata a questa conversione, denominata in from_currency o to_currency a seconda della direzione dell'operazione. Già riflessa in exchange_rate — mostrata per trasparenza
from_amount_usdstring | nullEquivalente in USD di from_amount
to_amount_usdstring | nullEquivalente in USD di to_amount
processed_atstring (ISO 8601) | nullMomento in cui la conversione ha terminato l'esecuzione. null mentre è ancora in elaborazione
created_atstring (ISO 8601)Momento in cui è stato creato l'ordine di conversione

Stati di conversione

StatoDescrizione
pendingCreato, non ancora inviato al mercato
processingSaldo bloccato e ordine collocato sul mercato
completedEseguito completamente — to_amount è stato accreditato sul tuo saldo
failedImpossibile eseguire — qualsiasi importo pre-addebitato è stato rimborsato automaticamente
partially_completedSolo per coppie di valute senza mercato diretto (instradate tramite una valuta intermedia): il primo passaggio è stato completato ma il secondo è fallito. Ti viene accreditata la valuta intermedia invece di to_currency — converti di nuovo da lì per raggiungere l'obiettivo originale
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.

Errori

In caso di errore, la risposta ha state: 1 e un error_code — condiviso da /v1/convert/price e /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_codeStato HTTPDescrizione
validation_failed422Parametri non validi o mancanti, oppure rifiuto per regola di business (es. saldo insufficiente) — vedi il campo errors per i dettagli
amount_too_small422amount è inferiore alla dimensione minima negoziabile per questa coppia di valute
convert_unavailable400La conversione non ha potuto essere eseguita in questo momento (dati di mercato non disponibili o nessuna rotta tra le due valute) — riprova a breve
internal_error400Errore interno del server imprevisto durante l'elaborazione della richiesta

Conversione automatica dei pagamenti in arrivo

La conversione automatica è un'impostazione del progetto per le fatture in arrivo e i crediti del portafoglio statico. Viene configurata nel cruscotto del commerciante, non aggiungendo campi a /v1/payment. Ogni regola seleziona una o più valute di origine e una valuta di destinazione.

Al termine della conversione, le informazioni sul pagamento e i webhook del commerciante possono includere:

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"
  }
}

I domini dell'importo sono intenzionalmente separati:

  • payment_amount — quanto è stato rilevato on-chain nella valuta di pagamento di origine;
  • merchant_amount — l'importo netto di origine attribuibile al commerciante prima della conversione;
  • convert.amount — l'importo accreditato in convert.to_currency;
  • convert.rate e convert.commission — il risultato della conversione eseguita, non un prezzo che dovresti ricalcolare localmente.

L'assenza di convert ha significato: la conversione potrebbe non essere completata, potrebbe non essere configurata per quella fonte, o potrebbe essere ricaduta sul credito in valuta di origine. Non inventare mai un importo target da /exchange-rates o da un prezzo di mercato pubblico.

Errore di conversione automatica e fallback

La conversione avviene a valle della ricezione del pagamento in blockchain. La disponibilità di mercato, le quantità minime d'ordine, i limiti di precisione, i timeout degli exchange e la liquidità eseguibile insufficiente possono ritardare o impedire la conversione.

  • I depositi al di sotto del minimo globale o del progetto bypassano il flusso di conversione e accreditano la valuta di origine.
  • I guasti transitori possono essere riprovati in modo asincrono.
  • Depositi grandi o non commerciabili possono ritornare a un credito nella valuta di origine dopo che la politica di ritentativo è esaurita.
  • Un pagamento può quindi essere valido anche quando la conversione nella valuta desiderata non è avvenuta.

La tua integrazione dovrebbe prima memorizzare il pagamento verificato, quindi riconciliare la valuta effettivamente accreditata dalle informazioni sul pagamento, dal blocco opzionale convert e dai saldi del commerciante. Non bloccare il riconoscimento del webhook del pagamento mentre si attendono i tuoi sistemi di analisi o notifiche.

Test di accettazione della conversione automatica

Testare almeno: conversione diretta riuscita, conversione tramite ponte/multi-hop, polvere sotto il minimo, tentativo transitorio, ritorno alla valuta di origine, sotto pagamento, sovrapagamento, webhook duplicato, convert mancante e riconciliazione dopo un timeout ambiguo.

Casi limite di conversione manuale

  • /v1/convert/price è un'anteprima indicativa; il movimento del mercato può cambiare il risultato dell'esecuzione.
  • amount_type: from fissa la richiesta lato sorgente, mentre amount_type: to richiede un importo lato destinazione. Non invertire il significato durante la presentazione dell'interfaccia di conferma.
  • Una coppia senza un mercato diretto può essere instradata attraverso una valuta intermedia. Se viene completata solo una fase, partially_completed segnala il credito intermedio.
  • Se una chiamata execute scade, riconciliare prima di riprovare. Un ordine di mercato può essere eseguito anche quando la sua risposta HTTP va persa.
  • Trattare failed come uno stato da riconciliare, non come permesso di applicare una registrazione contabile compensativa locale; la piattaforma possiede la contabilità di addebito/rimborso.