Ö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.
- Tauschbare Währungen auflisten. Verwenden Sie die
idjeder Währung in weiteren Aufrufen.curl "https://swapnoir.com/api/v1/currencies" - 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" - 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"
Anfragen und Daten
| Basis-URL | https://swapnoir.com/api/v1. Nur HTTPS. |
|---|---|
| Methoden | Alle Endpunkte verwenden GET. Parameter stehen im Query-String oder im Pfad. |
| Antworten | application/json, UTF-8. Fehler verwenden application/problem+json. |
| Beträge | Dezimalzahlen 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-IDs | Währung plus Netzwerk, zum Beispiel BTC, USDT-TRC20. In Anfragen ohne Beachtung der Groß- und Kleinschreibung; in Antworten immer in Großbuchstaben. |
| Zeitangaben | ISO 8601 in UTC, zum Beispiel 2026-10-05T12:00:00.000Z. |
| Browser | CORS ist offen (Access-Control-Allow-Origin: *), Sie können die API also von einer Webseite aus aufrufen. Es werden keine Cookies verwendet. |
| Tor | Auch über Tor erreichbar unter http://swapnoqyyp3mfh3hoypzmvpnau7gymt7c32tybx2qew3s7sw7bzz7aqd.onion/api/v1, mit denselben Endpunkten und Limits. |
| Versionierung | Die 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.
| Endpunkt | Anfragen pro Minute |
|---|---|
GET /currencies | 60 |
GET /estimate | 90 |
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
/currenciesmindestens 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
finalden Werttruehat.
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.
{
"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"
}| Code | HTTP | Bedeutung |
|---|---|---|
invalid_parameter | 400 | Ein Query-Parameter fehlt oder ist fehlerhaft. param nennt ihn. |
same_currency | 400 | from und to sind dieselbe Währung. |
receive_not_supported | 400 | Die to-Währung kann nur gesendet werden (Lightning). |
amount_too_small | 422 | Der Betrag liegt unter dem Mindestbetrag für dieses Paar. min_amount enthält den Mindestbetrag. |
pair_not_supported | 422 | Dieses Paar aus Währungen und Netzwerken wird nicht angeboten. |
pair_unavailable | 503 | Für dieses Paar ist gerade kein Kurs verfügbar. Versuchen Sie es später erneut oder mit einem anderen Betrag. |
not_found | 404 | Kein Auftrag mit dieser ID, oder der Auftrag wurde gelöscht. |
rate_limited | 429 | Sie haben das Rate-Limit erreicht. Warten Sie so viele Sekunden, wie Retry-After angibt. |
internal_error | 500 | Bei 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
{
"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
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Währung und Netzwerk. |
ticker | string | |
name | string | |
network | string | |
decimals | integer | Maximale Anzahl an Nachkommastellen in Beträgen. |
send | boolean | Kann als from verwendet werden. |
receive | boolean | Kann als to verwendet werden. |
memo | string or null | Name des Zusatzfelds, das manche Netzwerke zusätzlich zur Adresse benötigen, etwa Destination tag; null, wenn nicht verwendet. |
icon_url | string |
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
| Name | Ort | Beschreibung |
|---|---|---|
fromerforderlich | query | Währung, die der Nutzer sendet. Beispiel: BTC. |
toerforderlich | query | Währung, die der Nutzer erhält. BTC-LN kann nur gesendet werden. Beispiel: XMR. |
amounterforderlich | query | Betrag von from als Dezimalzahl mit Punkt und mit höchstens so vielen Nachkommastellen, wie decimals der Währung angibt. Beispiel: 0.01. |
rate | query | float (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
{
"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"
}{
"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"
}{
"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
| Feld | Typ | Beschreibung |
|---|---|---|
from | string | Währung und Netzwerk. |
to | string | Jede Währung außer solchen, die nur gesendet werden können. |
rate_type | string | Kursart |
amount_from | string | Der angefragte Betrag. |
amount_to | string | Was der Nutzer nach Abzug aller Gebühren erhält. |
rate | string | Betrag von to pro 1 from, nach Gebühren. |
usd_value | string or null | Ungefährer Wert von amount_from in US-Dollar, sofern bekannt. |
quoted_at | string |
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
| Name | Ort | Beschreibung |
|---|---|---|
iderforderlich | path | Auftrags-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
{
"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"
}
}{
"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
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Auftrags-ID |
status | string | Auftragsstatus |
final | boolean | Ist true bei done, expired, refunded und failed: Abfragen beenden. |
rate_type | string | Kursart |
created_at | string | |
updated_at | string | |
from | object | |
from.currency | string | Währung und Netzwerk. |
from.amount | string | Einzuzahlender Betrag. |
to | object | |
to.currency | string | Währung und Netzwerk. |
to.amount | string or null | Geschätzte Auszahlung bzw. die endgültige Auszahlung, sobald amount_is_final true ist. |
to.amount_is_final | boolean | |
deposit | object | |
deposit.address | string or null | Wohin der Nutzer die Einzahlung sendet; null, solange der Status preparing ist. |
deposit.memo | string or null | Memo oder Destination Tag, falls gesetzt; muss bei der Einzahlung angegeben werden. |
deposit.expires_at | string or null | Vor diesem Zeitpunkt senden, sofern gesetzt. |
payout | object | |
payout.address | string | |
payout.memo | string or null | |
refund | null or object | |
refund.address | string | |
refund.memo | string or null | |
transactions | object | |
transactions.deposit | null or object | |
transactions.deposit.hash | string | |
transactions.deposit.url | string or null | Link zum Block-Explorer, sofern bekannt. |
transactions.payout | null or object | |
transactions.payout.hash | string | |
transactions.payout.url | string or null | Link zum Block-Explorer, sofern bekannt. |
links | object | |
links.order_page | string | |
links.receipt | string |
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:
| Link | Ziel |
|---|---|
https://swapnoir.com/exchange?from=BTC&to=XMR&amount=0.01&rate=float | Der 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.01 | Die 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>- Der Nutzer fügt seine Empfangsadresse und optional eine Rückerstattungsadresse ein, besteht eine kurze Sicherheitsprüfung und klickt auf Jetzt tauschen.
- Er landet auf seiner Auftragsseite,
https://swapnoir.com/order/<ID>, mit Einzahlungsadresse und Betrag. - 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.
| Status | Endgültig | Bedeutung |
|---|---|---|
preparing | Nein | Die Einzahlungsadresse wird vorbereitet. Sie erscheint meist innerhalb weniger Minuten. |
awaiting | Nein | Warten auf die Einzahlung. Nur senden, solange der Auftrag diesen Status hat, und vor deposit.expires_at. |
confirming | Nein | Die Einzahlung wurde erkannt und wartet auf Netzwerkbestätigungen. |
exchanging | Nein | Die Einzahlung ist bestätigt und wird getauscht. |
sending | Nein | Die getauschten Coins werden an die Auszahlungsadresse gesendet. |
processing | Nein | In Bearbeitung. Wird verwendet, wenn kein genauerer Status bekannt ist. |
done | Ja | Abgeschlossen. Die Auszahlung wurde gesendet; siehe transactions.payout. |
expired | Ja | Es ist keine Einzahlung rechtzeitig eingegangen. Eine verspätete Einzahlung kann über den Support noch getauscht oder zurückerstattet werden. |
hold | Nein | Für eine Routineprüfung angehalten. Der Nutzer sollte sich mit der Auftrags-ID an den Support wenden. |
attention | Nein | Etwas muss geprüft werden, zum Beispiel eine Einzahlung mit falschem Betrag. Der Nutzer sollte den Support kontaktieren. |
refunding | Nein | Die Einzahlung wird an die Rückerstattungsadresse zurückgesendet. |
refunded | Ja | Die Einzahlung wurde zurückgesendet. |
failed | Ja | Der 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.
| ID | Währung | Netzwerk | Dezimalstellen | Empfangen | Memo |
|---|---|---|---|---|---|
BTC | Bitcoin | 8 | Ja | – | |
XMR | Monero | 12 | Ja | – | |
ETH | Ethereum | 8 | Ja | – | |
USDT-TRC20 | Tron (TRC20) | 6 | Ja | – | |
USDT-ERC20 | Ethereum (ERC20) | 6 | Ja | – | |
USDT-SOL | Solana | 6 | Ja | – | |
USDC-ERC20 | Ethereum (ERC20) | 6 | Ja | – | |
LTC | Litecoin | 8 | Ja | – | |
SOL | Solana | 9 | Ja | – | |
BTC-LN | Lightning | 8 | Nur senden | – | |
TRX | Tron | 6 | Ja | – | |
BNB | BNB Smart Chain (BEP20) | 8 | Ja | – | |
DOGE | Dogecoin | 8 | Ja | – | |
ZEC | Zcash | 8 | Ja | – | |
BCH | Bitcoin Cash | 8 | Ja | – | |
DASH | Dash | 8 | Ja | – | |
XRP | XRP Ledger | 6 | Ja | Destination Tag |
Checkliste für die Integration
- Netzwerk anzeigenZeigen Sie das Netzwerk immer neben dem Coin an, z. B. USDT auf Tron. Wer im falschen Netzwerk sendet, kann Geld verlieren.
- Memo anzeigenWenn
deposit.memogesetzt ist, muss die Einzahlung es enthalten. Zeigen Sie es genauso deutlich an wie die Adresse. - Feste Kurse erklärenEin Tausch zum festen Kurs zahlt den angegebenen Betrag nur aus, wenn der Nutzer genau
from.amountvordeposit.expires_atsendet. - Auftrags-IDs geheim haltenWer eine ID kennt, kann den zugehörigen Auftrag sehen. IDs gehören nicht in Analysetools, Logs oder öffentliche URLs.
- Fehler anhand des Codes behandelnVerzweigen Sie anhand von
code, zeigen Siedetailan und beachten SieRetry-After. - 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 .