Swapnoir
DE

Öffentliche API · v1 · Kostenlos

Swapnoir-API

Live-Wechselkurse, unterstützte Währungen und Auftragsverfolgung für Ihre Wallet, Ihren Bot oder Ihre Website. Nur lesend, kein API-Schlüssel, kein Konto.

Basis-URL
https://swapnoir.com/api/v1
Authentifizierung
Keine
Format
JSON, UTF-8
Fehler
RFC 9457

Überblick

Die Swapnoir-API liefert Ihrer App dieselben Live-Daten, die auch der Tauschdienst auf swapnoir.com nutzt. Sie ist eine kleine REST-API über HTTPS mit drei Endpunkten, gibt JSON zurück und ist in einer OpenAPI-3.1-Datei beschrieben, die Sie in Postman, Insomnia, Scalar oder einen Codegenerator laden können.

Live-Kurse anzeigen

Preis-Widgets, Rechner und Bots. Schätzungen enthalten bereits alle Gebühren für die Auszahlung.

Nutzer zu einem Tausch weiterleiten

Öffnen Sie mit einem Link aus Ihrer App einen vorausgefüllten Tausch auf swapnoir.com.

Aufträge verfolgen

Verfolgen Sie einen Tausch über seine Auftrags-ID und benachrichtigen Sie Ihre Nutzer, wenn er abgeschlossen ist.

Schnellstart

Keine Registrierung nötig. Führen Sie die Befehle in einem Terminal aus; jeder funktioniert für sich allein.

  1. Tauschbare Währungen auflisten. Verwenden Sie die id jeder Währung in weiteren Aufrufen.
    curl "https://swapnoir.com/api/v1/currencies"
  2. Live-Schätzung abrufen. Wie viel XMR erhalten Sie für 0.01 BTC nach Abzug der Gebühren?
    curl "https://swapnoir.com/api/v1/estimate?from=BTC&to=XMR&amount=0.01"
  3. Nutzer zum Tausch schicken und den Auftrag verfolgen. Der Nutzer schließt den Vorgang auf swapnoir.com ab und erhält eine Auftragsseite. Über deren ID können Sie den Auftrag verfolgen.
    curl "https://swapnoir.com/api/v1/orders/K7M2QX9PRT4B"

Live ausprobieren

GET /api/v1/estimate?from=BTC&to=XMR&amount=0.01&rate=float

Anfragen und Daten

Basis-URLhttps://swapnoir.com/api/v1. Nur HTTPS.
MethodenAlle Endpunkte verwenden GET. Parameter stehen im Query-String oder im Pfad.
Antwortenapplication/json, UTF-8. Fehler verwenden application/problem+json.
BeträgeDezimalzahlen als Strings, etwa "0.01", damit keine Genauigkeit verloren geht. Senden Sie Beträge mit Punkt und mit höchstens so vielen Nachkommastellen, wie decimals der Währung angibt.
Währungs-IDsWährung plus Netzwerk, zum Beispiel BTC, USDT-TRC20. In Anfragen ohne Beachtung der Groß- und Kleinschreibung; in Antworten immer in Großbuchstaben.
ZeitangabenISO 8601 in UTC, zum Beispiel 2026-10-05T12:00:00.000Z.
BrowserCORS ist offen (Access-Control-Allow-Origin: *), Sie können die API also von einer Webseite aus aufrufen. Es werden keine Cookies verwendet.
TorAuch über Tor erreichbar unter http://swapnoqyyp3mfh3hoypzmvpnau7gymt7c32tybx2qew3s7sw7bzz7aqd.onion/api/v1, mit denselben Endpunkten und Limits.
VersionierungDie Version steht im Pfad. Innerhalb von v1 fügen wir nur Neues hinzu: neue Endpunkte, neue optionale Parameter, neue Antwortfelder und neue Währungen. Ignorieren Sie daher Felder, die Sie nicht kennen. Alles, was eine Integration brechen würde, erscheint als neue Version, und v1 funktioniert parallel dazu weiter.

Authentifizierung

Keine. Es gibt keine API-Schlüssel, Konten oder Tokens, und Anfragen werden niemandem zugeordnet. Senden Sie niemals Zugangsdaten, Seed-Phrasen oder private Schlüssel an die API; sie wird nie danach fragen.

Rate-Limits

Limits werden pro Verbindung über eine gleitende Minute gezählt.

EndpunktAnfragen pro Minute
GET /currencies60
GET /estimate90
GET /orders/{id}30

Jede Antwort enthält die Standard-Header RateLimit-Policy (zum Beispiel 90;w=60) und RateLimit (zum Beispiel limit=90, remaining=89, reset=60). Bei Überschreitung des Limits erhalten Sie 429 mit einem Retry-After-Header in Sekunden.

  • Cachen Sie /currencies mindestens 5 Minuten lang; die Liste ändert sich selten.
  • Während ein Nutzer einen Betrag eingibt, warten Sie nach dem letzten Tastenanschlag etwa eine halbe Sekunde, bevor Sie eine Schätzung anfragen.
  • Fragen Sie einen Auftrag höchstens alle 10 Sekunden ab und hören Sie auf, sobald final den Wert true hat.

Fehler

Fehler verwenden das Standardformat RFC 9457 Problem Details. Prüfen Sie den HTTP-Status und verzweigen Sie dann anhand von code, der sich nie ändert. detail ist eine verständliche Meldung auf Englisch, die Sie dem Nutzer anzeigen können, und type verlinkt auf die passende Zeile unten.

422 Beispiel
{
  "type": "https://swapnoir.com/api#error-amount_too_small",
  "title": "Amount below minimum",
  "status": 422,
  "detail": "The minimum for this pair is 0.00005799 BTC.",
  "code": "amount_too_small",
  "min_amount": "0.00005799"
}
CodeHTTPBedeutung
invalid_parameter400Ein Query-Parameter fehlt oder ist fehlerhaft. param nennt ihn.
same_currency400from und to sind dieselbe Währung.
receive_not_supported400Die to-Währung kann nur gesendet werden (Lightning).
amount_too_small422Der Betrag liegt unter dem Mindestbetrag für dieses Paar. min_amount enthält den Mindestbetrag.
pair_not_supported422Dieses Paar aus Währungen und Netzwerken wird nicht angeboten.
pair_unavailable503Für dieses Paar ist gerade kein Kurs verfügbar. Versuchen Sie es später erneut oder mit einem anderen Betrag.
not_found404Kein Auftrag mit dieser ID, oder der Auftrag wurde gelöscht.
rate_limited429Sie haben das Rate-Limit erreicht. Warten Sie so viele Sekunden, wie Retry-After angibt.
internal_error500Bei uns ist etwas schiefgelaufen. Versuchen Sie es später erneut.

Referenz

Währungen auflisten

GET/api/v1/currencies

Alle Währungen und Netzwerke, die Swapnoir unterstützt. Ein Token in einem anderen Netzwerk ist eine eigene Währung, zum Beispiel USDT-TRC20 und USDT-ERC20. Die Liste ändert sich selten; cachen Sie sie für einige Minuten.

Das Beispiel zeigt drei der Währungen. Die Antwortfelder unten gelten pro Währung.

Anfrage

curl "https://swapnoir.com/api/v1/currencies"
const res = await fetch("https://swapnoir.com/api/v1/currencies");
const { currencies } = await res.json();

// Currencies a user can receive
const receivable = currencies.filter((c) => c.receive);
import requests

r = requests.get("https://swapnoir.com/api/v1/currencies", timeout=10)
r.raise_for_status()
currencies = r.json()["currencies"]

Antwort

200 OK
{
  "currencies": [
    {
      "id": "BTC",
      "ticker": "BTC",
      "name": "Bitcoin",
      "network": "Bitcoin",
      "decimals": 8,
      "send": true,
      "receive": true,
      "memo": null,
      "icon_url": "https://swapnoir.com/assets/coins/btc.svg"
    },
    {
      "id": "BTC-LN",
      "ticker": "BTC",
      "name": "Bitcoin",
      "network": "Lightning",
      "decimals": 8,
      "send": true,
      "receive": false,
      "memo": null,
      "icon_url": "https://swapnoir.com/assets/coins/btc.svg"
    },
    {
      "id": "XRP",
      "ticker": "XRP",
      "name": "XRP",
      "network": "XRP Ledger",
      "decimals": 6,
      "send": true,
      "receive": true,
      "memo": "Destination tag",
      "icon_url": "https://swapnoir.com/assets/coins/xrp.svg"
    }
  ]
}
Antwortfelder
FeldTypBeschreibung
idstringWährung und Netzwerk.
tickerstring
namestring
networkstring
decimalsintegerMaximale Anzahl an Nachkommastellen in Beträgen.
sendbooleanKann als from verwendet werden.
receivebooleanKann als to verwendet werden.
memostring or nullName des Zusatzfelds, das manche Netzwerke zusätzlich zur Adresse benötigen, etwa Destination tag; null, wenn nicht verwendet.
icon_urlstring

Schätzung abrufen

GET/api/v1/estimate

Wie viel to der Nutzer für amount from erhält, inklusive aller Tausch- und Netzwerkgebühren für die Auszahlung. Schätzungen sind live und nicht reserviert: Der endgültige Betrag wird beim Erstellen des Tauschs (fester Kurs) oder bei Bestätigung der Einzahlung (variabler Kurs) festgelegt.

Parameter

NameOrtBeschreibung
fromerforderlichqueryWährung, die der Nutzer sendet. Beispiel: BTC.
toerforderlichqueryWährung, die der Nutzer erhält. BTC-LN kann nur gesendet werden. Beispiel: XMR.
amounterforderlichqueryBetrag von from als Dezimalzahl mit Punkt und mit höchstens so vielen Nachkommastellen, wie decimals der Währung angibt. Beispiel: 0.01.
ratequeryfloat (Standard) folgt dem Markt, bis die Einzahlung bestätigt ist. fixed legt den Betrag beim Erstellen des Tauschs fest. Mögliche Werte: float, fixed. Beispiel: float.

Anfrage

curl "https://swapnoir.com/api/v1/estimate?from=BTC&to=XMR&amount=0.01&rate=float"
const params = new URLSearchParams({ from: "BTC", to: "XMR", amount: "0.01" });
const res = await fetch(`https://swapnoir.com/api/v1/estimate?${params}`);
const data = await res.json();

if (!res.ok) {
  // RFC 9457 problem, e.g. data.code === "amount_too_small"
  throw new Error(data.detail);
}
console.log(data.amount_to, data.to);
import requests

r = requests.get(
    "https://swapnoir.com/api/v1/estimate",
    params={"from": "BTC", "to": "XMR", "amount": "0.01"},
    timeout=10,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["code"] + ": " + data["detail"])
print(data["amount_to"], data["to"])

Antwort

200 OK
{
  "from": "BTC",
  "to": "XMR",
  "rate_type": "float",
  "amount_from": "0.01",
  "amount_to": "1.57166029",
  "rate": "157.166029",
  "usd_value": "866.32",
  "quoted_at": "2026-10-05T12:00:00.000Z"
}
422 Unter dem Mindestbetrag
{
  "type": "https://swapnoir.com/api#error-amount_too_small",
  "title": "Amount below minimum",
  "status": 422,
  "detail": "The minimum for this pair is 0.00005799 BTC.",
  "code": "amount_too_small",
  "min_amount": "0.00005799"
}
400 Ungültiger Parameter
{
  "type": "https://swapnoir.com/api#error-invalid_parameter",
  "title": "Invalid parameter",
  "status": 400,
  "detail": "Unknown currency `DOG`. See /api/v1/currencies.",
  "code": "invalid_parameter",
  "param": "from"
}
Antwortfelder
FeldTypBeschreibung
fromstringWährung und Netzwerk.
tostringJede Währung außer solchen, die nur gesendet werden können.
rate_typestringKursart
amount_fromstringDer angefragte Betrag.
amount_tostringWas der Nutzer nach Abzug aller Gebühren erhält.
ratestringBetrag von to pro 1 from, nach Gebühren.
usd_valuestring or nullUngefährer Wert von amount_from in US-Dollar, sofern bekannt.
quoted_atstring

Auftrag abrufen

GET/api/v1/orders/{id}

Live-Status und Details eines Tauschs. Die Auftrags-ID ist der letzte Teil der URL der Auftragsseite. Jeder mit der ID kann den Auftrag sehen, behandeln Sie sie also wie ein Passwort. Fragen Sie höchstens alle 10 Sekunden ab und hören Sie auf, sobald final true ist. Aufträge werden 7 Tage nach Abschluss gelöscht.

Parameter

NameOrtBeschreibung
iderforderlichpathAuftrags-ID, zum Beispiel K7M2QX9PRT4B.

Anfrage

curl "https://swapnoir.com/api/v1/orders/K7M2QX9PRT4B"
const res = await fetch(`https://swapnoir.com/api/v1/orders/${orderId}`);
if (res.status === 404) {
  // wrong ID, or the order was deleted
}
const order = await res.json();
console.log(order.status, order.final);
import time
import requests

while True:
    r = requests.get(f"https://swapnoir.com/api/v1/orders/{order_id}", timeout=10)
    if r.status_code == 404:
        break  # wrong ID, or the order was deleted
    order = r.json()
    print(order["status"])
    if order["final"]:
        break
    time.sleep(15)

Antwort

200 OK
{
  "id": "K7M2QX9PRT4B",
  "status": "confirming",
  "final": false,
  "rate_type": "float",
  "created_at": "2026-10-05T12:00:00.000Z",
  "updated_at": "2026-10-05T12:06:12.000Z",
  "from": {
    "currency": "BTC",
    "amount": "0.01"
  },
  "to": {
    "currency": "XMR",
    "amount": "1.57166029",
    "amount_is_final": false
  },
  "deposit": {
    "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
    "memo": null,
    "expires_at": null
  },
  "payout": {
    "address": "888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H",
    "memo": null
  },
  "refund": null,
  "transactions": {
    "deposit": {
      "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "url": "https://mempool.space/tx/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "payout": null
  },
  "links": {
    "order_page": "https://swapnoir.com/order/K7M2QX9PRT4B",
    "receipt": "https://swapnoir.com/order/K7M2QX9PRT4B/receipt.txt"
  }
}
404 Nicht gefunden
{
  "type": "https://swapnoir.com/api#error-not_found",
  "title": "Not found",
  "status": 404,
  "detail": "No order with this ID. Orders are deleted 7 days after they finish.",
  "code": "not_found"
}
Antwortfelder
FeldTypBeschreibung
idstringAuftrags-ID
statusstringAuftragsstatus
finalbooleanIst true bei done, expired, refunded und failed: Abfragen beenden.
rate_typestringKursart
created_atstring
updated_atstring
fromobject
from.currencystringWährung und Netzwerk.
from.amountstringEinzuzahlender Betrag.
toobject
to.currencystringWährung und Netzwerk.
to.amountstring or nullGeschätzte Auszahlung bzw. die endgültige Auszahlung, sobald amount_is_final true ist.
to.amount_is_finalboolean
depositobject
deposit.addressstring or nullWohin der Nutzer die Einzahlung sendet; null, solange der Status preparing ist.
deposit.memostring or nullMemo oder Destination Tag, falls gesetzt; muss bei der Einzahlung angegeben werden.
deposit.expires_atstring or nullVor diesem Zeitpunkt senden, sofern gesetzt.
payoutobject
payout.addressstring
payout.memostring or null
refundnull or object
refund.addressstring
refund.memostring or null
transactionsobject
transactions.depositnull or object
transactions.deposit.hashstring
transactions.deposit.urlstring or nullLink zum Block-Explorer, sofern bekannt.
transactions.payoutnull or object
transactions.payout.hashstring
transactions.payout.urlstring or nullLink zum Block-Explorer, sofern bekannt.
linksobject
links.order_pagestring
links.receiptstring

Anleitungen

Tausch erstellen

Tauschvorgänge werden auf swapnoir.com erstellt, sodass Ihr Nutzer immer eine eigene Auftragsseite erhält und die Kontrolle darüber behält. Ihre App schickt den Nutzer dorthin, mit bereits ausgefüllten Coins und Betrag:

LinkZiel
https://swapnoir.com/exchange?from=BTC&to=XMR&amount=0.01&rate=floatDer Tausch im Adressschritt, mit angezeigter Live-Schätzung. Am besten für „Jetzt tauschen“-Schaltflächen.
https://swapnoir.com/?from=BTC&to=XMR&amount=0.01Die Startseite mit ausgefülltem Tauschformular, sodass der Nutzer Coins und Betrag noch ändern kann.

Beide akzeptieren dieselben Parameter from, to, amount und das optionale rate wie „Schätzung abrufen“. Um die Seite in einer anderen Sprache zu öffnen, stellen Sie den Sprachcode voran, zum Beispiel /de/exchange?….

<a href="https://swapnoir.com/exchange?from=BTC&to=XMR&amount=0.01&rate=float" rel="noopener">
  Exchange BTC to XMR on Swapnoir
</a>
  1. Der Nutzer fügt seine Empfangsadresse und optional eine Rückerstattungsadresse ein, besteht eine kurze Sicherheitsprüfung und klickt auf Jetzt tauschen.
  2. Er landet auf seiner Auftragsseite, https://swapnoir.com/order/<ID>, mit Einzahlungsadresse und Betrag.
  3. Soll Ihre App den Auftrag verfolgen, bitten Sie den Nutzer, den Auftragslink oder die ID einzufügen, und fragen Sie dann regelmäßig „Auftrag abrufen“ ab.

Auftragsstatus

Ein normaler Tausch durchläuft awaiting → confirming → exchanging → sending → done. Zeigen Sie dem Nutzer den status in Ihren eigenen Worten an und beenden Sie die Abfragen, sobald final true ist.

StatusEndgültigBedeutung
preparingNeinDie Einzahlungsadresse wird vorbereitet. Sie erscheint meist innerhalb weniger Minuten.
awaitingNeinWarten auf die Einzahlung. Nur senden, solange der Auftrag diesen Status hat, und vor deposit.expires_at.
confirmingNeinDie Einzahlung wurde erkannt und wartet auf Netzwerkbestätigungen.
exchangingNeinDie Einzahlung ist bestätigt und wird getauscht.
sendingNeinDie getauschten Coins werden an die Auszahlungsadresse gesendet.
processingNeinIn Bearbeitung. Wird verwendet, wenn kein genauerer Status bekannt ist.
doneJaAbgeschlossen. Die Auszahlung wurde gesendet; siehe transactions.payout.
expiredJaEs ist keine Einzahlung rechtzeitig eingegangen. Eine verspätete Einzahlung kann über den Support noch getauscht oder zurückerstattet werden.
holdNeinFür eine Routineprüfung angehalten. Der Nutzer sollte sich mit der Auftrags-ID an den Support wenden.
attentionNeinEtwas muss geprüft werden, zum Beispiel eine Einzahlung mit falschem Betrag. Der Nutzer sollte den Support kontaktieren.
refundingNeinDie Einzahlung wird an die Rückerstattungsadresse zurückgesendet.
refundedJaDie Einzahlung wurde zurückgesendet.
failedJaDer Tausch konnte nicht abgeschlossen werden. Der Nutzer sollte den Support kontaktieren.

Unterstützte Währungen

Dieselbe Liste, die „Währungen auflisten“ zurückgibt. Mit der Zeit kommen neue Währungen hinzu, lesen Sie die Liste daher aus der API, statt sie fest einzuprogrammieren.

IDWährungNetzwerkDezimalstellenEmpfangenMemo
BTCBitcoinBitcoin8Ja–
XMRMoneroMonero12Ja–
ETHEthereumEthereum8Ja–
USDT-TRC20TetherTron (TRC20)6Ja–
USDT-ERC20TetherEthereum (ERC20)6Ja–
USDT-SOLTetherSolana6Ja–
USDC-ERC20USD CoinEthereum (ERC20)6Ja–
LTCLitecoinLitecoin8Ja–
SOLSolanaSolana9Ja–
BTC-LNBitcoin LightningLightning8Nur senden–
TRXTronTron6Ja–
BNBBNBBNB Smart Chain (BEP20)8Ja–
DOGEDogecoinDogecoin8Ja–
ZECZcashZcash8Ja–
BCHBitcoin CashBitcoin Cash8Ja–
DASHDashDash8Ja–
XRPXRPXRP Ledger6JaDestination Tag

Checkliste für die Integration

  1. Netzwerk anzeigenZeigen Sie das Netzwerk immer neben dem Coin an, z. B. USDT auf Tron. Wer im falschen Netzwerk sendet, kann Geld verlieren.
  2. Memo anzeigenWenn deposit.memo gesetzt ist, muss die Einzahlung es enthalten. Zeigen Sie es genauso deutlich an wie die Adresse.
  3. Feste Kurse erklärenEin Tausch zum festen Kurs zahlt den angegebenen Betrag nur aus, wenn der Nutzer genau from.amount vor deposit.expires_at sendet.
  4. Auftrags-IDs geheim haltenWer eine ID kennt, kann den zugehörigen Auftrag sehen. IDs gehören nicht in Analysetools, Logs oder öffentliche URLs.
  5. Fehler anhand des Codes behandelnVerzweigen Sie anhand von code, zeigen Sie detail an und beachten Sie Retry-After.
  6. Auf die echte Website verlinkenVerlinken Sie nur auf https://swapnoir.com. Fragen Sie Nutzer niemals nach Seed-Phrasen oder privaten Schlüsseln.

Änderungsprotokoll

  • v1 veröffentlicht. GET /currencies, GET /estimate, GET /orders/{id}, Fehler nach RFC 9457, RateLimit-Header und die OpenAPI-3.1-Beschreibung.

Support

Fragen, Ideen oder höhere Limits für Ihre Integration: Senden Sie uns eine Nachricht oder erreichen Sie uns unter info@swapnoir.com. Für die Nutzung der API gelten unsere Seiten Nutzungsbedingungen und Datenschutz.

Zuletzt aktualisiert am .