Entwickler

Kunden-API
alles, was du klickst – per REST.

Server, Verträge, Domains, Freigaben und Bestellungen aus dem Guthaben steuern. JSON, Geld immer in Cent, Zeiten in ISO 8601, Fehler als application/problem+json.

94
Endpunkte
15
feine Rechte
120/min
je Schlüssel
Schnellstartin drei Schritten
  • 1Im Kundenbereich unter Konto › API-Schlüssel einen Schlüssel anlegen (Inhaber und Admins). Er wird nur einmal angezeigt. Die API braucht eine bestätigte E-Mail-Adresse, die Freischaltung für Neukunden und einen aktiven Vertrag.
  • 2Jede Anfrage mit „Authorization: Bearer zc_…“ an https://api-mam-jahn.de/v1 schicken.
  • 3Ändernde Anfragen mit eigener Kopfzeile Idempotency-Key – beim Bestellen Pflicht.
curl -H "Authorization: Bearer $TOKEN" https://api-mam-jahn.de/v1/account

curl -X POST https://api-mam-jahn.de/v1/orders \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"product_id":12,"term":12,"options":{"7":31},"hostname":"web-01","accept_terms":true,"accept_withdrawal":true}'
// PHP (Guzzle)
$api = new GuzzleHttp\Client(['base_uri' => 'https://api-mam-jahn.de/v1/', 'headers' => ['Authorization' => 'Bearer '.getenv('TOKEN')]]);
$konto = json_decode((string) $api->get('account')->getBody(), true);
// JavaScript (Node 18+)
const res = await fetch('https://api-mam-jahn.de/v1/account', { headers: { Authorization: `Bearer ${process.env.TOKEN}` } });
const konto = await res.json();
# Python (requests)
import os, requests
konto = requests.get("https://api-mam-jahn.de/v1/account", headers={"Authorization": f"Bearer {os.environ['TOKEN']}"}).json()
Konto und AngebotKonto, Guthaben, Hostsysteme und Betriebssysteme.
  • GET/account Konto, Guthaben, Verfügungsrahmen, verfügbarer Betrag, Restlaufzeit in StundenRecht: account:read
    curl
    curl https://api-mam-jahn.de/v1/account -H "Authorization: Bearer $TOKEN"
  • GET/host-lines Hostsysteme mit Grenzen, Preisen (Cent netto je Monat) und Vorlagen; cpu_model nur als öffentliche Bezeichnung (z. B. „AMD EPYC 3rd Gen“), ohne ModellnummerRecht: products:read
    curl
    curl https://api-mam-jahn.de/v1/host-lines -H "Authorization: Bearer $TOKEN"
  • GET/os-images Betriebssysteme (slug für Bestellung und Neuinstallation)Recht: products:read
    curl
    curl https://api-mam-jahn.de/v1/os-images -H "Authorization: Bearer $TOKEN"
SSH-SchlüsselSchlüssel für neue Server und Neuinstallationen (SSH-Manager). Höchstens 50 je Konto; ssh-ed25519, ssh-rsa (ab 2048 Bit), ecdsa und FIDO (sk-…) sind erlaubt, private Schlüssel werden abgelehnt.
  • GET/ssh-keys Alle Schlüssel mit apply_all (gilt für alle Server), last_used_at und target_count (Anzahl Server mit diesem Schlüssel)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/ssh-keys -H "Authorization: Bearer $TOKEN"
  • POST/ssh-keys Schlüssel hinzufügen: name, public_key, optional apply_allRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/ssh-keys -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"laptop","public_key":"ssh-ed25519 AAAA… du@laptop","apply_all":true}'
  • PATCH/ssh-keys/{id} Umbenennen und/oder apply_all setzen: gilt für alle Server des Kontos, auch künftige (cloud-init übernimmt neue Schlüssel beim nächsten Start; entfernte bleiben in authorized_keys bis zur Neuinstallation)Recht: services:manage
    curl
    curl -X PATCH https://api-mam-jahn.de/v1/ssh-keys/{id} -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"laptop-neu","apply_all":true}'
  • DELETE/ssh-keys/{id} Schlüssel entfernenRecht: services:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/ssh-keys/{id} -H "Authorization: Bearer $TOKEN"
ServerStundenweise abgerechnete Server: anlegen, steuern, neu installieren, löschen.
  • GET/servers Alle Server (Seiten: ?page, ?per_page bis 100)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers -H "Authorization: Bearer $TOKEN"
  • POST/servers Server bestellen – Idempotency-Key Pflicht, Antwort 202 mit job und einmaligem root_passwordRecht: orders:create
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"host_line":"de_epyc","plan_id":2,"os":"debian-13","name":"web-01","ssh_key_ids":[1]}'
  • GET/servers/{id} Ein Server mit IPs, Stand und laufendem AuftragRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id} -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/actions/{action} start, stop (hart), shutdown, reboot, reset (hart, nur laufend) – Antwort 202 mit job; dieselbe Aktion höchstens einmal je Minute und ServerRecht: services:power
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/actions/{action} -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/reinstall Neu installieren: os, ssh_key_ids (ohne Angabe: die dem Server zugewiesenen Schlüssel; Schlüssel mit apply_all kommen immer dazu) – löscht alle DatenRecht: services:reinstall
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/reinstall -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"os":"debian-13","ssh_key_ids":[1]}'
  • DELETE/servers/{id} Server löschen (Abrechnung endet mit der laufenden Stunde)Recht: services:reinstall
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id} -H "Authorization: Bearer $TOKEN"
  • GET/servers/{id}/media Eingelegtes ISO, Bootreihenfolge, Rettungssystem und alle einlegbaren ISOsRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/media -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/iso ISO einlegen: iso (Slug) oder iso_id – Antwort 202 mit jobRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/iso -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"iso":"debian-13-netinst"}'
  • DELETE/servers/{id}/iso ISO auswerfen – Antwort 202 mit jobRecht: services:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id}/iso -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/boot Bootreihenfolge: boot = disk | cdrom (greift beim nächsten Start)Recht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/boot -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"boot":"cdrom"}'
  • POST/servers/{id}/rescue Rettungssystem starten (Neustart von CD) – Antwort 202 mit jobRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/rescue -H "Authorization: Bearer $TOKEN"
  • DELETE/servers/{id}/rescue Rettungssystem beenden, vorherigen Stand wiederherstellenRecht: services:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id}/rescue -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/hostname Hostname ändern: hostname – DNS (A/AAAA, rDNS) wird nachgezogenRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/hostname -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"hostname":"web-01.example.de"}'
  • GET/jobs/{id} Stand eines Auftrags: queued, running, done, failedRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/jobs/{id} -H "Authorization: Bearer $TOKEN"
Server: Zustand und VerlaufLive-Werte, Verlauf, Traffic, Aufträge und laufende Proxmox-Aufgaben eines Servers.
  • GET/servers/{id}/status Live-Werte: state, uptime (s), cpu (%), mem/maxmem, netin/netout, diskread/diskwrite (Byte), disk_used/disk_total laut Gast-AgentRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/status -H "Authorization: Bearer $TOKEN"
  • GET/servers/{id}/metrics Verlauf ?range=hour|day|week|month|year: Punkte mit cpu (%), mem (Byte), Netz und Platte (Byte/s)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/metrics -H "Authorization: Bearer $TOKEN"
  • GET/servers/{id}/traffic Traffic je Tag ?days=14|30|90: rx, tx, Summen in Byte. status, metrics und traffic auch für Server, die dir mit Recht „monitor“ freigegeben sindRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/traffic -H "Authorization: Bearer $TOKEN"
  • GET/servers/{id}/jobs Aufträge dieses Servers, neueste zuerst (Seiten: ?page, ?per_page bis 100)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/jobs -H "Authorization: Bearer $TOKEN"
  • GET/servers/{id}/tasks Laufende Proxmox-Aufgaben der VM (Backup, Wiederherstellung, Umzug …): type, label, status, started_atRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/tasks -H "Authorization: Bearer $TOKEN"
Server: Zugang und NetzRoot-Passwort, SSH-Schlüssel, IPs mit rDNS und Firewall.
  • POST/servers/{id}/password-reset Neues Root-Passwort (Gast-Agent sofort, sonst Cloud-Init beim nächsten Start) – Antwort mit password, nur einmalRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/password-reset -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/ssh-keys SSH-Schlüssel aus dem Konto per Cloud-Init hinterlegen und dem Server zuweisen: ssh_key_ids[] (Schlüssel mit apply_all kommen immer dazu; neue greifen beim nächsten Start, entfernte bleiben in authorized_keys bis zur Neuinstallation)Recht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/ssh-keys -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"ssh_key_ids":[1,2]}'
  • GET/servers/{id}/network IPv4, IPv6-Netz und rDNS je IP (Name, Standardname, Stand)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/network -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/rdns rDNS setzen: ip, name (leer = Standardname) – der A/AAAA-Eintrag muss vorher auf die IP zeigenRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/rdns -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"ip":"192.0.2.5","name":"mail.example.de"}'
  • GET/servers/{id}/firewall Firewall: enabled, policy_in, policy_out und Regeln in ReihenfolgeRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/firewall -H "Authorization: Bearer $TOKEN"
  • PUT/servers/{id}/firewall Firewall einstellen: enabled, policy_in, policy_out (ACCEPT | DROP | REJECT)Recht: services:manage
    curl
    curl -X PUT https://api-mam-jahn.de/v1/servers/{id}/firewall -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"enabled":true,"policy_in":"DROP","policy_out":"ACCEPT"}'
  • POST/servers/{id}/firewall/rules Regel anlegen: direction (in|out), action (ACCEPT|DROP|REJECT), proto, dport, source, commentRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/firewall/rules -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"direction":"in","action":"ACCEPT","proto":"tcp","dport":"22","source":"203.0.113.0/24"}'
  • PATCH/servers/{id}/firewall/rules/{rule} Regel ändern (nur mitgeschickte Felder, auch enabled)Recht: services:manage
    curl
    curl -X PATCH https://api-mam-jahn.de/v1/servers/{id}/firewall/rules/{rule} -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"enabled":false}'
  • DELETE/servers/{id}/firewall/rules/{rule} Regel löschenRecht: services:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id}/firewall/rules/{rule} -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/firewall/rules/{rule}/move Regel verschieben: direction = up | downRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/firewall/rules/{rule}/move -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"direction":"up"}'
Server: Backups und SnapshotsSicherungen im Rahmen deines Tarifs (Anzahl siehe limit). Ändernde Aufrufe liefern 202 mit job.
  • GET/servers/{id}/backups Backups (neueste zuerst): volid, created_at, size, note, protected; limit und usedRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/backups -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/backups Backup anlegen: note (optional) – der Server läuft weiterRecht: services:backups
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/backups -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"note":"vor Update"}'
  • POST/servers/{id}/backups/restore Backup zurückspielen: volid, confirm=true – überschreibt den aktuellen StandRecht: services:backups
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/backups/restore -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"volid":"pbs:backup/vm/200/2026-10-25T03:00:00Z","confirm":true}'
  • DELETE/servers/{id}/backups Backup löschen: volid (im Body oder ?volid=)Recht: services:backups
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id}/backups -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"volid":"pbs:backup/vm/200/2026-10-25T03:00:00Z"}'
  • GET/servers/{id}/snapshots Snapshots (neueste zuerst): name, description, created_at, vmstate, rollback_possible; limitRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/servers/{id}/snapshots -H "Authorization: Bearer $TOKEN"
  • POST/servers/{id}/snapshots Snapshot anlegen: name (2–40, beginnt mit Buchstabe), description, vmstate (mit RAM)Recht: services:backups
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/snapshots -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"vor-update","description":"Kernel 6.12"}'
  • POST/servers/{id}/snapshots/{name}/rollback Auf Snapshot zurücksetzen: confirm=true – Änderungen seither gehen verlorenRecht: services:backups
    curl
    curl -X POST https://api-mam-jahn.de/v1/servers/{id}/snapshots/{name}/rollback -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"confirm":true}'
  • DELETE/servers/{id}/snapshots/{name} Snapshot löschenRecht: services:backups
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/servers/{id}/snapshots/{name} -H "Authorization: Bearer $TOKEN"
Verträge und GuthabenLaufzeit-Verträge, Zugangsdaten neuer Server, Guthaben aufladen.
  • GET/services Alle Verträge mit Produkt, Laufzeit, Stand und Verlängerung (Filter: ?whmcs_id= alte Vertrags-ID, ?server_id=, ?customer_id= Reseller)Recht: services:read
    curl
    curl https://api-mam-jahn.de/v1/services -H "Authorization: Bearer $TOKEN"
  • GET/services/{id} Ein Vertrag mit Optionen und ServerRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/services/{id} -H "Authorization: Bearer $TOKEN"
  • GET/services/{id}/credentials Zugangsdaten eines neuen Servers – nur einmal und höchstens 24 Stunden nach der BereitstellungRecht: services:credentials
    curl
    curl https://api-mam-jahn.de/v1/services/{id}/credentials -H "Authorization: Bearer $TOKEN"
  • POST/credit/topup Guthaben aufladen: amount_cents (oder amount in Euro), optional provider – Antwort mit Zahlungslink des ZahlungsanbietersRecht: credit:topup
    curl
    curl -X POST https://api-mam-jahn.de/v1/credit/topup -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"amount_cents":2000,"provider":"paypal"}'
  • GET/credit/topup/{id} Stand einer AufladungRecht: credit:topup
    curl
    curl https://api-mam-jahn.de/v1/credit/topup/{id} -H "Authorization: Bearer $TOKEN"
  • GET/credit/auto-topup Automatische Aufladung: enabled, threshold_cents, target_cents, monthly_cap_cents (brutto), diesen Monat genutzt, Pause, Standard-Zahlart, letzte AufladungenRecht: account:read
    curl
    curl https://api-mam-jahn.de/v1/credit/auto-topup -H "Authorization: Bearer $TOKEN"
  • PUT/credit/auto-topup Automatische Aufladung einschalten/ändern (enabled=true, Schwelle, Ziel, Monatsgrenze in Cent, consent=true – bestätigt den Einwilligungstext aus consent_text) oder abschalten (enabled=false). Nur Inhaber/Abrechnung, keine Partner-AppsRecht: credit:topup
    curl
    curl -X PUT https://api-mam-jahn.de/v1/credit/auto-topup -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"enabled":true,"threshold_cents":1000,"target_cents":5000,"monthly_cap_cents":15000,"consent":true}'
AbrechnungBuchungen, Verbrauch und Rechnungen.
  • GET/transactions Buchungen (Aufladungen, Verbrauch je Stunde, Erstattungen)Recht: account:read
    curl
    curl https://api-mam-jahn.de/v1/transactions -H "Authorization: Bearer $TOKEN"
  • GET/usage Verbrauch je Server im Monat (?period=JJJJ-MM)Recht: account:read
    curl
    curl https://api-mam-jahn.de/v1/usage -H "Authorization: Bearer $TOKEN"
  • GET/invoices RechnungenRecht: invoices:read
    curl
    curl https://api-mam-jahn.de/v1/invoices -H "Authorization: Bearer $TOKEN"
  • GET/invoices/{id} Eine Rechnung mit PositionenRecht: invoices:read
    curl
    curl https://api-mam-jahn.de/v1/invoices/{id} -H "Authorization: Bearer $TOKEN"
  • GET/invoices/{id}/xml E-Rechnung als CII-XML (EN 16931)Recht: invoices:read
    curl
    curl https://api-mam-jahn.de/v1/invoices/{id}/xml -H "Authorization: Bearer $TOKEN"
Produkte und BestellungFür die API freigegebene Produkte bestellen – nur aus dem Guthaben.
  • GET/products Für die API freigegebene Produkte mit Laufzeiten, Preisen (Cent netto und brutto für dein Konto), Optionen, Bestand und VorverkaufRecht: products:read
    curl
    curl https://api-mam-jahn.de/v1/products -H "Authorization: Bearer $TOKEN"
  • GET/products/{id} Ein Produkt mit Beschreibung, Bestellfeldern (customfields: id, label, type, required, options) und Addons mit Preisen; Konfiguratoren mit Grenzen (min/max) und Preis je Einheit (404, wenn nicht für die API freigegeben)Recht: products:read
    curl
    curl https://api-mam-jahn.de/v1/products/{id} -H "Authorization: Bearer $TOKEN"
  • POST/orders/quote Preis berechnen, ohne zu bestellen: product_id, term, options, domain, coupon – Summe, Steuer, FehlbetragRecht: products:read
    curl
    curl -X POST https://api-mam-jahn.de/v1/orders/quote -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"product_id":12,"term":12,"options":{"7":31}}'
  • POST/orders Bestellen aus dem Guthaben – Idempotency-Key Pflicht, accept_terms und accept_withdrawal; Zusatzfelder fields (Feld-ID => Wert, auch customfields) und addons[]; reicht das Guthaben nicht: 402, nichts bestelltRecht: orders:create
    curl
    curl -X POST https://api-mam-jahn.de/v1/orders -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"product_id":12,"term":12,"options":{"7":31},"hostname":"web-01","fields":{"4":"Projekt X"},"addons":[3],"accept_terms":true,"accept_withdrawal":true}'
  • GET/orders Deine Bestellungen (Seiten: ?page, ?per_page bis 100)Recht: orders:create
    curl
    curl https://api-mam-jahn.de/v1/orders -H "Authorization: Bearer $TOKEN"
  • GET/orders/{id} Eine Bestellung mit Positionen, Diensten und RechnungRecht: orders:create
    curl
    curl https://api-mam-jahn.de/v1/orders/{id} -H "Authorization: Bearer $TOKEN"
DomainsVerfügbarkeit, Preise, registrieren und umziehen mit Guthaben, Nameserver, Authcode, Whois-Schutz, DNSSEC.
  • GET/domains/check Verfügbarkeit und deine Preise (?domain=, Cent brutto, 1 Jahr): register, transfer, renew, restoreRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains/check -H "Authorization: Bearer $TOKEN"
  • GET/domains/pricing Alle Endungen mit deinen PreisenRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains/pricing -H "Authorization: Bearer $TOKEN"
  • GET/domains Deine Domains mit Stand, Registry-Ablauf, Fälligkeit und VerlängerungspreisRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains -H "Authorization: Bearer $TOKEN"
  • POST/domains Registrieren bzw. umziehen (type=transfer, auth_code) – Idempotency-Key Pflicht, accept_terms und accept_withdrawal, nur aus dem Guthaben (sonst 402)Recht: domains:order
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"domain":"mein-projekt.de","accept_terms":true,"accept_withdrawal":true}'
  • GET/domains/{id} Eine Domain mit NameservernRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains/{id} -H "Authorization: Bearer $TOKEN"
  • POST/domains/{id}/nameservers Nameserver setzen: nameservers[] (2–6) oder ours=trueRecht: domains:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains/{id}/nameservers -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"ours":true}'
  • POST/domains/{id}/authcode Auth-Code für den Umzug abrufenRecht: domains:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains/{id}/authcode -H "Authorization: Bearer $TOKEN"
  • POST/domains/{id}/renewal Verlängerung an/aus: auto_renew=true|falseRecht: domains:order
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains/{id}/renewal -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"auto_renew":false}'
  • GET/domains/{id}/privacy Whois-Schutz: StandRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains/{id}/privacy -H "Authorization: Bearer $TOKEN"
  • POST/domains/{id}/privacy Whois-Schutz an/aus: enabled=true|falseRecht: domains:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains/{id}/privacy -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"enabled":true}'
  • GET/domains/{id}/dnssec DNSSEC: Stand und hinterlegte SchlüsselRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domains/{id}/dnssec -H "Authorization: Bearer $TOKEN"
  • POST/domains/{id}/dnssec DNSSEC-Schlüssel setzen: records[] (keyTag, algorithm, digestType, digest) oder ds als TextRecht: domains:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/domains/{id}/dnssec -H "Authorization: Bearer $TOKEN"
  • DELETE/domains/{id}/dnssec DNSSEC ausschaltenRecht: domains:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/domains/{id}/dnssec -H "Authorization: Bearer $TOKEN"
  • GET/domain-profiles Deine Kontaktprofile für abweichende InhaberRecht: domains:read
    curl
    curl https://api-mam-jahn.de/v1/domain-profiles -H "Authorization: Bearer $TOKEN"
FreigabenDienste mit anderen Konten teilen. Verwalten dürfen Inhaber und Admins.
  • GET/shares Vergebene (outgoing), mit dir geteilte (incoming) und offene Einladungen an dich, dazu die möglichen RechteRecht: services:read
    curl
    curl https://api-mam-jahn.de/v1/shares -H "Authorization: Bearer $TOKEN"
  • POST/shares Dienst freigeben: service_id, email, permissions[] (view ist immer dabei)Recht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/shares -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"service_id":877,"email":"kollegin@example.de","permissions":["view","start","stop"]}'
  • PATCH/shares/{id} Rechte einer vergebenen Freigabe ändern: permissions[]Recht: services:manage
    curl
    curl -X PATCH https://api-mam-jahn.de/v1/shares/{id} -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"permissions":["view","reboot"]}'
  • DELETE/shares/{id} Vergebene Freigabe zurückziehen bzw. angenommene Freigabe verlassenRecht: services:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/shares/{id} -H "Authorization: Bearer $TOKEN"
  • POST/shares/{id}/accept Einladung annehmenRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/shares/{id}/accept -H "Authorization: Bearer $TOKEN"
  • POST/shares/{id}/decline Einladung ablehnenRecht: services:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/shares/{id}/decline -H "Authorization: Bearer $TOKEN"
ResellerEndkunden unter deinem Konto (White-Label) – nur für freigeschaltete Reseller-Konten, sonst 403.
  • GET/reseller Stufe und Rabatt in %, Warnschwelle, Guthaben, Monatskosten, Zahl der EndkundenRecht: reseller:manage
    curl
    curl https://api-mam-jahn.de/v1/reseller -H "Authorization: Bearer $TOKEN"
  • GET/reseller/report Kosten je Endkunde (Cent brutto je Laufzeit und Monat) und nicht zugeordnete DiensteRecht: reseller:manage
    curl
    curl https://api-mam-jahn.de/v1/reseller/report -H "Authorization: Bearer $TOKEN"
  • GET/reseller/customers Deine Endkunden mit zugeordneten Diensten (service_ids)Recht: reseller:manage
    curl
    curl https://api-mam-jahn.de/v1/reseller/customers -H "Authorization: Bearer $TOKEN"
  • POST/reseller/customers Endkunde anlegen: name, company, ref (deine Nummer), email, noteRecht: reseller:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/reseller/customers -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"Max Muster","ref":"K-1042"}'
  • GET/reseller/customers/{id} Ein Endkunde mit Diensten und KostenRecht: reseller:manage
    curl
    curl https://api-mam-jahn.de/v1/reseller/customers/{id} -H "Authorization: Bearer $TOKEN"
  • PATCH/reseller/customers/{id} Endkunde ändern (nur mitgeschickte Felder)Recht: reseller:manage
    curl
    curl -X PATCH https://api-mam-jahn.de/v1/reseller/customers/{id} -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"note":"zahlt jährlich"}'
  • DELETE/reseller/customers/{id} Endkunde löschen (Zuordnungen fallen weg, Dienste bleiben)Recht: reseller:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/reseller/customers/{id} -H "Authorization: Bearer $TOKEN"
  • POST/reseller/assignments Dienst zuordnen: service_id, customer_id (0 oder leer = Zuordnung lösen)Recht: reseller:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/reseller/assignments -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"service_id":877,"customer_id":3}'
  • GET/reseller/customers/{id}/domains Domains eines EndkundenRecht: reseller:manage
    curl
    curl https://api-mam-jahn.de/v1/reseller/customers/{id}/domains -H "Authorization: Bearer $TOKEN"
  • POST/reseller/customers/{id}/domains/{domain} Domain einem Endkunden zuordnenRecht: reseller:manage
    curl
    curl -X POST https://api-mam-jahn.de/v1/reseller/customers/{id}/domains/{domain} -H "Authorization: Bearer $TOKEN"
  • DELETE/reseller/customers/{id}/domains/{domain} Domain-Zuordnung lösenRecht: reseller:manage
    curl
    curl -X DELETE https://api-mam-jahn.de/v1/reseller/customers/{id}/domains/{domain} -H "Authorization: Bearer $TOKEN"
Partner-Apps (OAuth)Für Apps, die im Namen eines Kunden arbeiten (Freigabe unter /api/verbinden).
  • POST/oauth/token Code gegen App-Schlüssel tauschen: grant_type=authorization_code, code, client_id, client_secret, redirect_uri (ohne Bearer-Schlüssel)Recht: ohne Schlüssel
    curl
    curl -X POST https://api-mam-jahn.de/v1/oauth/token
Rechtefür Partner-Apps und übernommene Schlüssel

Schlüssel mit Rechteliste brauchen für jede Anfrage das passende Recht – unbekannte Wege sind gesperrt. Schlüssel ohne Liste dürfen lesen bzw. mit „lesen + schreiben“ alles, was deine Rolle im Konto darf.

  • account:readKonto und Guthaben lesen · lesend
  • invoices:readRechnungen lesen · lesend
  • credit:topupGuthaben aufladen (Zahlung über den Zahlungsanbieter starten) · schreibend
  • products:readProdukte und Preise lesen · lesend
  • orders:createBestellen und mit Guthaben bezahlen · schreibend
  • services:readVerträge und Server lesen · lesend
  • services:credentialsZugangsdaten neuer Server abholen (einmalig, 24 h) · lesend
  • services:powerServer starten, stoppen, neu starten · schreibend
  • services:manageServer einstellen (Hostname, SSH-Key, Passwort, rDNS, Firewall, ISO, Freigaben) · schreibend
  • services:backupsBackups und Snapshots anlegen, zurückspielen, löschen · schreibend
  • services:reinstallServer neu installieren oder löschen (löscht die Daten) · schreibend
  • domains:readDomains und Preise lesen, Verfügbarkeit prüfen · lesend
  • domains:orderDomains registrieren und umziehen (mit Guthaben) · schreibend
  • domains:manageNameserver, Authcode, Sperre ändern · schreibend
  • reseller:manageReseller: Endkunden verwalten, zuordnen, Abrechnung · schreibend
FehlerRFC 9457, mit request_id
  • 400Anfrage unvollständig, z. B. Idempotency-Key fehlt
  • 401Schlüssel fehlt, ungültig, abgelaufen oder widerrufen
  • 402Guthaben reicht nicht – nichts bestellt (missing_cents = Fehlbetrag)
  • 403IP nicht erlaubt oder gesperrt, Recht fehlt, nur Lesezugriff, Konto oder API gesperrt
  • 404nicht gefunden (oder gehört nicht zu deinem Konto bzw. nicht zu deiner App)
  • 409Aktion gerade nicht möglich, z. B. es läuft schon ein Auftrag
  • 410alte API mjapi.php – abgeschaltet, bitte diese API nutzen (bestehende Schlüssel gelten hier weiter)
  • 422Eingaben ungültig oder Bestellung nicht möglich (Grenzen, Pflichtfelder, Kapazität)
  • 429zu viele Anfragen – 120 je Minute und Schlüssel, siehe Retry-After
  • 500interner Fehler – bitte mit request_id melden
  • 503API abgeschaltet (Wartung) oder Proxmox gerade nicht erreichbar – später erneut versuchen

Jeder Fehler trägt zusätzlich das Feld code für Programme:

  • missing_scopeDem Schlüssel fehlt das Recht (required_scope) bzw. der Weg ist für Schlüssel mit Rechteliste nicht freigegeben
  • scope_disabledDas Recht ist für die API zurzeit global abgeschaltet
  • ip_not_allowedAufruf von dieser IP für Schlüssel oder App nicht erlaubt
  • ip_bannedIP nach vielen Fehlversuchen 24 Stunden gesperrt (until)
  • api_disabledDie API ist zurzeit abgeschaltet
  • account_blockedDie API ist für dieses Konto gesperrt
  • account_lockedDas Konto ist gesperrt
  • account_emailE-Mail des Kontoinhabers noch nicht bestätigt
  • account_approvalNeukunden: Freischaltung der API noch nicht erteilt
  • account_productKein aktiver Vertrag
  • read_onlySchlüssel nur mit Lesezugriff
  • role_not_allowedDeine Rolle im Konto darf das nicht
  • invalid_actionUnbekannte Server-Aktion
  • insufficient_creditGuthaben reicht nicht
  • unauthorizedSchlüssel fehlt oder ist ungültig
Umstiegfür Partner-Apps der alten API
  • AdresseStatt https://cp.mam-jahn.de/mjapi.php/v1/… jetzt https://api-mam-jahn.de/v1/… – die alte Adresse antwortet 410 mit Verweis (successor).
  • Antwort-HülleAntworten stehen in {"data": …}, Listen zusätzlich mit meta (page, per_page, total, last_page) statt einer reinen Liste.
  • FehlerFehler kommen als application/problem+json mit title, detail und dem Maschinen-Feld code (z. B. missing_scope) statt {"error":{"code","message"}}.
  • Vertrag oder ServerServer-Wege nutzen die Server-ID (/servers/{id}). Die alte Vertrags-ID findest du mit GET /services?whmcs_id=<alte ID> (Antwort: id und server_id); jeder Server nennt seinen Vertrag in service_id.
  • Wege/services/{id}/power → POST /servers/{id}/actions/{action}; /status → /servers/{id}/status; /backups, /snapshots, /network, /rdns, /firewall, /metrics, /traffic, /tasks, /password-reset gleichnamig unter /servers/{id}; /snapshots/rollback → /servers/{id}/snapshots/{name}/rollback; /me → /account.
  • GeldBeträge in Cent (…_cents) statt Euro mit Komma.
  • BestellenIdempotency-Key, accept_terms und accept_withdrawal sind Pflicht; options statt configoptions, fields statt customfields (customfields wird weiter angenommen), coupon statt promocode.
  • VerbindenDie Freigabe läuft über https://cp.mam-jahn.de/api/verbinden (OAuth mit PKCE); alte Schlüssel der App gelten weiter.
Alte APImjapi.php – 410 Gone

Die frühere API unter https://cp.mam-jahn.de/mjapi.php ist abgeschaltet. Jeder Aufruf dort antwortet mit 410 Gone und einem Verweis auf diese Seite. Bestehende Schlüssel gelten hier weiter – stell nur die Adresse auf https://api-mam-jahn.de/v1 und die Wege auf die Liste oben um.

Schlüssel lassen sich auf Lesen beschränken, an IP-Adressen binden und befristen. Wir speichern nur einen Prüfwert, nicht den Schlüssel selbst.