openapi.json ↗

API v1 · REST · JSON

Server per Code
bestellen und steuern.

Die Kunden-API von mam-jahn.de: Produkte und Preise abfragen, mit Guthaben bestellen, Zugangsdaten abholen, Server starten, neu installieren, sichern. Jeder Schlüssel hat nur die Rechte, die du wählst – auf Wunsch nur von deinen IPs aus.

54
Endpunkte in 11 Bereichen
60/min
Aufrufe je Schlüssel
Bearer
Schlüssel mit Rechten, IP-Sperre und Ablauf

Base URLhttps://mam-jahn.de/mjapi.php/v1

Schnellstart

In drei Schritten zum ersten Aufruf

  1. Schlüssel anlegenIm Kundenbereich unter Konto › API-Schlüssel: Name, Rechte, erlaubte IPs. Der Schlüssel wird genau einmal angezeigt.
  2. TestenOben „Dein Schlüssel“ eintragen und bei „Schlüssel prüfen“ auf „Anfrage senden“ – oder per curl:
    curl -s https://mam-jahn.de/mjapi.php/v1/ping -H "Authorization: Bearer $MJ_KEY"
  3. LoslegenErst mit „Sandbox“ ausprobieren – dann tut die API nur so und ändert nichts.

Schlüssel & Rechte

Ein Schlüssel, genau die Rechte, die er braucht

Jeder Aufruf schickt den Schlüssel im Header Authorization: Bearer mjk_…. Fehlt ein Recht, kommt 403 missing_scope. Ist eine IP-Liste hinterlegt, gilt der Schlüssel nur von dort (IPv4/IPv6, auch Netze wie /24 oder /64).

  • account:readKonto und Guthaben lesen
  • invoices:readRechnungen lesen
  • credit:topupGuthaben aufladen (Rechnung erstellen) · derzeit nicht freigegeben
  • products:readProdukte und Preise lesen
  • orders:createBestellen und mit Guthaben bezahlen · derzeit nicht freigegeben
  • services:readVerträge und Server lesen
  • services:credentialsZugangsdaten neuer Server abholen (einmalig, 24 h) · derzeit nicht freigegeben
  • services:powerServer starten, stoppen, neu starten · derzeit nicht freigegeben
  • services:manageServer einstellen (Hostname, SSH-Key, Passwort, rDNS, ISO) · derzeit nicht freigegeben
  • services:backupsBackups und Snapshots anlegen, zurückspielen, löschen · derzeit nicht freigegeben
  • services:reinstallServer neu installieren (löscht die Systemplatte) · derzeit nicht freigegeben
  • domains:readDomains und Preise lesen, Verfügbarkeit prüfen · derzeit nicht freigegeben
  • domains:orderDomains registrieren und umziehen (mit Guthaben) · derzeit nicht freigegeben
  • domains:manageNameserver, Authcode, Sperre ändern · derzeit nicht freigegeben
  • reseller:manageReseller: Endkunden verwalten, zuordnen, Abrechnung · derzeit nicht freigegeben

Fehler & Status

Klare Codes statt Rätselraten

Fehler kommen immer als {"error":{"code":"…","message":"…"}} – code ist fest, message ist für Menschen.

200 / 201 / 202
OK, angelegt, im Hintergrund gestartet
401
Schlüssel fehlt, falsch, widerrufen oder abgelaufen
402
Guthaben reicht nicht – nichts bestellt
403
Recht fehlt oder IP nicht erlaubt
404 / 405
unbekannt oder falsche Methode
409 / 410
gerade nicht möglich · schon abgeholt bzw. abgelaufen
422
Eingabe ungültig
429
zu viele Aufrufe – kurz warten
502 / 503
Server-Plattform antwortet nicht · API abgeschaltet

Sandbox

Ausprobieren, ohne etwas zu ändern

Mit dem Header X-MJ-Sandbox: 1 prüft die API Schlüssel, Rechte, IP und Bremse wie immer – führt aber nichts aus und antwortet mit dem Beispiel aus dieser Doku. Kein Server wird bestellt, neu installiert oder gelöscht. Der Schalter oben rechts setzt den Header für „Anfrage testen“.

Partner-Apps

„Mit mam-jahn verbinden“ in deiner App

  1. App anmeldenWir legen deine App an: Name, Rücksprung-Adresse, Server-IPs, optional Webhook. Du bekommst Client-ID, Client-Secret und Webhook-Secret.
  2. Kunden schickenhttps://mam-jahn.de/index.php?m=mj_api&a=connect&client_id=…&redirect_uri=…&state=…&scope=orders:create services:credentials
  3. Code tauschenDer Kunde bestätigt und kommt mit ?code=…&state=… zurück. Dein Server tauscht den Code mit POST /oauth/token gegen einen Schlüssel nur für diesen Kunden. App-Schlüssel sehen nur Server, die über die App bestellt wurden.
  4. Webhook service.readyZugangsdaten eines neuen Servers, genau einmal. Prüfen: X-MJ-Signature = HMAC-SHA256(X-MJ-Timestamp + "." + body, webhook-secret)

Allgemein

Schlüssel prüfen und die maschinenlesbare Beschreibung.

GET/ping

Schlüssel prüfen

Antwortet mit Kunden-ID und den Rechten des Schlüssels – ideal für einen ersten Test.

jeder Schlüssel 200

Mögliche Fehler

401
unauthorized Schlüssel fehlt, ist falsch oder widerrufen
403
ip_not_allowed Aufruf von einer nicht erlaubten IP
403
account_email E-Mail des Kontoinhabers nicht bestätigt
403
account_approval Neukunde, API noch nicht freigeschaltet
403
account_product kein aktiver Vertrag
curl -s "https://mam-jahn.de/mjapi.php/v1/ping" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "ok": true,
    "client_id": 42,
    "scopes": [
        "account:read",
        "services:read"
    ],
    "sandbox": false,
    "time": "2026-10-19T12:00:00+02:00"
}

Anfrage testenLive

GET/openapi.json

OpenAPI-Beschreibung

Alle Endpunkte als OpenAPI 3.1 – für Postman, Insomnia, Swagger UI oder Client-Generatoren. Ohne Schlüssel abrufbar.

ohne Schlüssel 200

curl -s "https://mam-jahn.de/mjapi.php/v1/openapi.json"

Antwort · 200

{
    "openapi": "3.1.0",
    "info": {
        "title": "mam-jahn.de API",
        "version": "1.0"
    },
    "paths": {
        "…": []
    }
}

Anfrage testenLive

POST/oauth/token

Partner-App: Code gegen Schlüssel

Nur für Partner-Apps: Nach „Mit mam-jahn verbinden“ kommt der Kunde mit ?code=… zurück. Diesen Code (10 Minuten, einmal) tauscht der Server der App gegen einen Schlüssel nur für diesen Kunden.

ohne Schlüssel 200 nur Partner-Apps

Parameter

grant_typeBody · Text · Pflicht
immer authorization_code
codeBody · Text · Pflicht
Code aus dem Rücksprung
client_idBody · Text · Pflicht
Client-ID der App
client_secretBody · Text · Pflicht
Client-Secret der App
redirect_uriBody · Text · Pflicht
dieselbe Rücksprung-Adresse wie beim Verbinden

Mögliche Fehler

401
invalid_client Client-ID oder Secret falsch
400
invalid_grant Code ungültig, abgelaufen oder benutzt
403
ip_not_allowed nicht von den Server-IPs der App
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/oauth/token" \
  -H "Content-Type: application/json" \
  -d '{"grant_type":"authorization_code","code":"Rk2…","client_id":"mja_1a2b3c4d5e6f","client_secret":"mjs_…","redirect_uri":"https://app.example.de/connect/callback"}'

Antwort · 200

{
    "access_token": "mjk_77be2210_…",
    "token_type": "Bearer",
    "scope": "account:read orders:create services:read services:credentials",
    "client_id": 42
}

Anfrage testenLive

Öffentlich (Website)

Katalog, Preise, Steuersätze, Status und Rechtstexte für Websites – ohne Schlüssel, nur öffentliche Daten.

GET/public/catalog

Öffentlicher Katalog

Alle Produktlinien mit Tarifen, Netto-Preisen je Laufzeit (1/3/6/12 Monate, Staffel 0/3/7/13 %), Merkmalen und Bestell-Links (order_url, seit v1.2 zusätzlich order_urls je Laufzeit), dazu Steuersätze, Betriebssysteme, Domainpreise, Kennzahlen, Status der Nodes, Netz und Links. Alle Beträge netto (*_net). Nur öffentliche Daten, ohne Schlüssel. Antwort 5 Minuten zwischengespeichert (Cache-Control, ETag; mit If-None-Match kommt 304). CORS nur für eingetragene Website-Herkünfte. Vertrag: version 1 (Erweiterungen v1.1 Info-Blöcke, v1.2 order_urls, v1.3 exchange = Angebote der KVM-Börse mit Streichpreis nur bei belegtem Normalpreis, v1.4 trial = Testserver, nur wenn eingeschaltet und die Sicherheitsgruppe geprüft vorhanden ist, v1.6 links.service_bot = Einladung des Discord-Service-Bots, nur wenn eingetragen), neue Felder sind abwärtskompatibel.

ohne Schlüssel 200

Mögliche Fehler

429
rate_limited Zu viele Anfragen von dieser IP
503
unavailable Daten gerade nicht verfügbar
curl -s "https://mam-jahn.de/mjapi.php/v1/public/catalog"

Antwort · 200

{
    "version": 1,
    "generated_at": "2026-11-01T12:00:00+01:00",
    "source": "whmcs",
    "currency": {
        "code": "EUR",
        "prefix": "",
        "suffix": " €",
        "decimals": 2,
        "format": "de"
    },
    "tax": {
        "prices_are": "net",
        "default_country": "DE",
        "rates": {
            "DE": 19,
            "AT": 20
        }
    },
    "terms": [
        {
            "months": 1,
            "discount_pct": 0
        },
        {
            "months": 3,
            "discount_pct": 3
        },
        {
            "months": 6,
            "discount_pct": 7
        },
        {
            "months": 12,
            "discount_pct": 13
        }
    ],
    "groups": [
        {
            "key": "server",
            "name": "Eigener Server"
        }
    ],
    "lines": [
        {
            "slug": "vps",
            "name": "VPS",
            "group": "server",
            "summary": "Geteilte Kerne, voller Root-Zugriff",
            "hardware": "AMD EPYC 7763",
            "virtualization": "KVM",
            "location": "Frankfurt am Main",
            "features": [
                "Laufzeit frei wählbar: 1, 3, 6 oder 12 Monate"
            ],
            "from_net": 7.9,
            "order_url": "https://mam-jahn.de/vps",
            "plans": [
                {
                    "id": 12,
                    "name": "VPS 8",
                    "popular": false,
                    "available": true,
                    "specs": [
                        {
                            "key": "vcores",
                            "value": 4
                        },
                        {
                            "key": "ram",
                            "value": 8,
                            "unit": "GB"
                        },
                        {
                            "key": "disk",
                            "value": 120,
                            "unit": "GB",
                            "note": "NVMe"
                        }
                    ],
                    "prices_net": {
                        "1": 13.9,
                        "3": 13.48,
                        "6": 12.93,
                        "12": 12.09
                    },
                    "setup_net": 0,
                    "order_url": "https://mam-jahn.de/cart.php?a=add&pid=12&billingcycle=monthly",
                    "order_urls": {
                        "1": "https://mam-jahn.de/cart.php?a=add&pid=12&billingcycle=monthly",
                        "3": "https://mam-jahn.de/cart.php?a=add&pid=12&billingcycle=quarterly",
                        "6": "https://mam-jahn.de/cart.php?a=add&pid=12&billingcycle=semiannually",
                        "12": "https://mam-jahn.de/cart.php?a=add&pid=12&billingcycle=annually"
                    }
                }
            ]
        }
    ],
    "os": [
        {
            "family": "Debian",
            "versions": [
                "12",
                "13"
            ]
        }
    ],
    "exchange": {
        "about": [
            "Jeden Abend entstehen neue Angebote aus freier Kapazität."
        ],
        "next_at": "2026-11-01T20:00:00+01:00",
        "offers": [
            {
                "id": "231",
                "line": "ryzen",
                "name": "Ryzen Deal #1",
                "hardware": "AMD Ryzen 9 9950X",
                "specs": [
                    {
                        "key": "vcores",
                        "value": 4,
                        "note": "geteilt"
                    },
                    {
                        "key": "ram",
                        "value": 8,
                        "unit": "GB",
                        "note": "DDR5 ECC"
                    },
                    {
                        "key": "disk",
                        "value": 150,
                        "unit": "GB",
                        "note": "NVMe SSD"
                    }
                ],
                "price_net": 7.5,
                "regular_net": 10,
                "discount_pct": 25,
                "order_url": "https://mam-jahn.de/cart.php?a=add&pid=231&billingcycle=monthly",
                "available": true,
                "until": "2026-11-01T20:00:00+01:00"
            }
        ]
    },
    "trial": {
        "enabled": true,
        "hours": 24,
        "specs": [
            {
                "key": "vcores",
                "value": 2
            },
            {
                "key": "ram",
                "value": 4,
                "unit": "GB"
            },
            {
                "key": "disk",
                "value": 40,
                "unit": "GB",
                "note": "NVMe"
            }
        ],
        "request_url": "https://mam-jahn.de/testen"
    },
    "domains": [
        {
            "tld": ".de",
            "register_net": 4.9,
            "renew_net": 4.9,
            "transfer_net": 0
        }
    ],
    "stats": {
        "threads": 228,
        "ram_gb": 1408,
        "nvme_tb": 73,
        "services_active": 62
    },
    "status": {
        "updated_at": "2026-11-01T11:58:00+01:00",
        "nodes_online": 5,
        "nodes_total": 5,
        "cpu_pct": 9,
        "nodes": [
            {
                "name": "EPYC 01",
                "online": true,
                "cpu_pct": 12
            }
        ]
    },
    "network": {
        "asn": "AS201687",
        "location": "Frankfurt am Main",
        "uplinks": [
            {
                "name": "EPYC 01",
                "gbit": 20
            }
        ]
    },
    "links": {
        "cart": "https://mam-jahn.de/cart.php?a=view",
        "login": "https://mam-jahn.de/login",
        "register": "https://mam-jahn.de/register.php",
        "status": "https://mam-jahn.de/status",
        "cancel": "https://mam-jahn.de/kuendigen",
        "contact": "https://mam-jahn.de/contact.php",
        "api_docs": "https://mam-jahn.de/api-docs",
        "discord": "https://discord.gg/E9wzeKCtQr"
    }
}

Anfrage testenLive

Konto

Konto, Guthaben, Rechnungen und deine API-Aufrufe.

GET/me

Konto abrufen

Name, E-Mail, Land, Währung und aktuelles Guthaben.

account:read 200

curl -s "https://mam-jahn.de/mjapi.php/v1/me" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "id": 42,
    "firstname": "Max",
    "lastname": "Muster",
    "company": "",
    "email": "max@example.de",
    "country": "DE",
    "currency": "EUR",
    "credit": 40
}

Anfrage testenLive

GET/invoices

Rechnungen auflisten

Rechnungen mit Bezahl-Link, neueste zuerst.

invoices:read 200

Parameter

statusQuery · Text
Paid, Unpaid, Cancelled oder Refunded
limitQuery · Zahl
1–200, Standard 50
curl -s "https://mam-jahn.de/mjapi.php/v1/invoices" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "invoices": [
        {
            "id": 1290,
            "number": "R-2026-0412",
            "date": "2026-10-19",
            "due": "2026-10-19",
            "paid": "",
            "total": 25,
            "status": "Unpaid",
            "pay_url": "https://mam-jahn.de/viewinvoice.php?id=1290"
        }
    ]
}

Anfrage testenLive

POST/credit/topup

Guthaben aufladen

Erstellt eine Aufladungs-Rechnung. Nach der Zahlung über den Link ist der Betrag als Guthaben da.

credit:topup 201

Parameter

amountBody · Zahl · Pflicht
Betrag in deiner Währung (Mindest- und Höchstbetrag wie im Kundenbereich)

Mögliche Fehler

422
invalid_amount Betrag außerhalb der Grenzen
409
topup_disabled Aufladen ist abgeschaltet
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/credit/topup" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount":25}'

Antwort · 201

{
    "invoice_id": 1291,
    "amount": 25,
    "pay_url": "https://mam-jahn.de/viewinvoice.php?id=1291"
}

Anfrage testenLive

GET/requests

Eigene Aufrufe

Die letzten API-Aufrufe deines Kontos (30 Tage) – mit Status, IP und Dauer. Schlüssel und Passwörter werden nie gespeichert.

account:read 200

Parameter

limitQuery · Zahl
1–500, Standard 100
curl -s "https://mam-jahn.de/mjapi.php/v1/requests" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "requests": [
        {
            "time": "2026-10-19 11:58:02",
            "method": "GET",
            "path": "/v1/services",
            "status": 200,
            "ip": "203.0.113.10",
            "ms": 38,
            "key": "mjk_3f9a01c2",
            "note": ""
        }
    ]
}

Anfrage testenLive

Bestellen

Produkte mit Preisen und Bestellen mit Guthaben.

GET/products

Produkte auflisten

Alle über die API bestellbaren Produkte mit Preisen je Laufzeit.

products:read 200

curl -s "https://mam-jahn.de/mjapi.php/v1/products" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "products": [
        {
            "id": 12,
            "name": "KVM S",
            "group": "KVM Server",
            "module": "mjpve",
            "currency": "EUR",
            "in_stock": true,
            "prices": {
                "monthly": {
                    "price": 9.9,
                    "setup": 0
                },
                "annually": {
                    "price": 99,
                    "setup": 0
                }
            }
        }
    ]
}

Anfrage testenLive

GET/products/{id}

Produkt abrufen

Ein Produkt mit Optionen (configoptions, z. B. Betriebssystem) und Feldern (customfields) für die Bestellung.

products:read 200

Parameter

idPfad · Zahl · Pflicht
Produkt-ID

Mögliche Fehler

404
not_found Produkt nicht über die API bestellbar
curl -s "https://mam-jahn.de/mjapi.php/v1/products/12" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "id": 12,
    "name": "KVM S",
    "group": "KVM Server",
    "module": "mjpve",
    "currency": "EUR",
    "in_stock": true,
    "prices": {
        "monthly": {
            "price": 9.9,
            "setup": 0
        }
    },
    "description": "2 vCores, 4 GB RAM, 40 GB NVMe",
    "configoptions": [
        {
            "id": 7,
            "name": "Betriebssystem",
            "type": "dropdown",
            "choices": [
                {
                    "id": 31,
                    "name": "Debian 12",
                    "prices": {
                        "monthly": {
                            "price": 0,
                            "setup": 0
                        }
                    }
                }
            ]
        }
    ],
    "customfields": [
        {
            "id": 5,
            "name": "SSH Key",
            "type": "textarea",
            "required": false,
            "description": ""
        }
    ]
}

Anfrage testenLive

POST/orders

Bestellen

Bestellt ein Produkt und bezahlt standardmäßig mit Guthaben. Reicht das Guthaben nicht, wird nichts bestellt. Der Server wird danach automatisch eingerichtet – Stand über GET /v1/services/{id}.

orders:create 201

Parameter

product_idBody · Zahl · Pflicht
Produkt-ID aus GET /v1/products
billingcycleBody · Text · Pflicht
monthly, quarterly, semiannually, annually (24/36 Monate nicht mehr bestellbar)
hostnameBody · Text
Hostname des Servers
configoptionsBody · Objekt
Option-ID => Auswahl-ID (bzw. Menge)
customfieldsBody · Objekt
Feld-ID => Wert
payBody · Text
credit (Standard) oder invoice (Rechnung offen lassen)
promocodeBody · Text
Gutscheincode
customer_idBody · Zahl
nur Reseller: Endkunde, dem der Server zugeordnet wird

Mögliche Fehler

402
insufficient_credit Guthaben reicht nicht – nichts bestellt
422
invalid_billingcycle Laufzeit nicht angeboten
422
invalid_configoption Option oder Auswahl unbekannt
409
out_of_stock nicht verfügbar
404
not_found Endkunde nicht gefunden (customer_id)
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/orders" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id":12,"billingcycle":"monthly","hostname":"node1.example.de","configoptions":{"7":31},"customfields":{"5":"ssh-ed25519 AAAA… user@pc"},"pay":"credit","customer_id":15}'

Antwort · 201

{
    "order_id": 512,
    "service_id": 877,
    "invoice_id": 1290,
    "total": 9.9,
    "payment": "paid",
    "pay_url": null,
    "next": "GET /v1/services/877 bis status Active, dann einmal GET /v1/services/877/credentials"
}

Anfrage testenLive

Verträge

Alle Verträge und die Zugangsdaten neuer Server.

GET/services

Verträge auflisten

Alle Verträge mit Status, Hostname und IPs. Schlüssel einer Partner-App sehen nur, was über die App bestellt wurde.

services:read 200

Parameter

customer_idQuery · Zahl
nur Reseller: nur Verträge dieses Endkunden
curl -s "https://mam-jahn.de/mjapi.php/v1/services" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "services": [
        {
            "id": 877,
            "product_id": 12,
            "product": "KVM S",
            "module": "mjpve",
            "status": "Active",
            "hostname": "node1.example.de",
            "ipv4": "203.0.113.25",
            "ips": [
                "2001:db8:25::1/64"
            ],
            "billingcycle": "monthly",
            "amount": 9.9,
            "registered": "2026-10-19",
            "next_due": "2026-11-19"
        }
    ]
}

Anfrage testenLive

GET/services/{id}

Vertrag abrufen

Ein Vertrag. credentials zeigt, ob die Zugangsdaten abholbar sind: ok, fetched, expired oder none.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "id": 877,
    "product": "KVM S",
    "status": "Active",
    "hostname": "node1.example.de",
    "ipv4": "203.0.113.25",
    "credentials": "ok"
}

Anfrage testenLive

GET/services/{id}/credentials

Zugangsdaten abholen

IPv4, Benutzer und Root-Passwort eines über die API bestellten Servers – genau einmal und höchstens 24 Stunden nach der Einrichtung.

services:credentials 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

409
not_ready Server noch nicht eingerichtet
410
credentials_fetched schon abgeholt
410
credentials_expired Abholzeit abgelaufen
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/credentials" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "service_id": 877,
    "hostname": "node1.example.de",
    "ipv4": "203.0.113.25",
    "ipv4_all": [
        "203.0.113.25"
    ],
    "ipv6": [
        "2001:db8:25::1/64"
    ],
    "username": "root",
    "password": "Xk7#q2…"
}

Anfrage testenLive

Server

Status, Power, Neuinstallation, Hostname, SSH-Key, Passwort.

GET/services/{id}/status

Server-Status

Läuft der Server? Dazu CPU, RAM, Platten, Laufzeit und ob der Gast-Agent antwortet.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/status" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "status": "running",
    "uptime": 86400,
    "cpus": 2,
    "cpu": 3.4,
    "mem": 1073741824,
    "maxmem": 4294967296,
    "disk": 0,
    "maxdisk": 42949672960,
    "netin": 1203391,
    "netout": 893221,
    "agent": true,
    "disks": [
        {
            "mount": "/",
            "used": 6442450944,
            "total": 42949672960
        }
    ]
}

Anfrage testenLive

POST/services/{id}/power

Starten, stoppen, neu starten

start, shutdown (sauber herunterfahren), stop (hart aus), reboot, reset (harter Neustart). Höchstens eine Aktion alle 8 Sekunden je Server.

services:power 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
actionBody · Text · Pflicht
start, shutdown, stop, reboot oder reset

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
429
too_fast zu schnell hintereinander
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/power" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"reboot"}'

Antwort · 200

{
    "ok": true,
    "action": "reboot",
    "upid": "UPID:n2:0012A3F1:…"
}

Anfrage testenLive

GET/services/{id}/os

Betriebssysteme und ISOs

Vorlagen für die Neuinstallation (kind template) und einlegbare ISO-Dateien (kind iso) für diesen Server.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/os" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "items": [
        {
            "key": "debian-12",
            "kind": "template",
            "name": "Debian 12",
            "windows": false
        },
        {
            "key": "local:iso/rescue.iso",
            "kind": "iso",
            "name": "Rettungssystem"
        }
    ]
}

Anfrage testenLive

POST/services/{id}/reinstall

Neu installieren

Installiert das gewählte Betriebssystem neu – alle Daten auf der Systemplatte gehen verloren. Läuft im Hintergrund; Stand über GET /v1/services/{id}/jobs/{job}. Neues Passwort danach über password-reset.

services:reinstall 202

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
templateBody · Text · Pflicht
key aus GET /v1/services/{id}/os (kind template)
hostnameBody · Text · Pflicht
Hostname nach der Installation
confirmBody · Text · Pflicht
zur Sicherheit: der aktuelle Hostname des Servers
sshkeyBody · Text
öffentlicher SSH-Schlüssel (nicht bei Windows)

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
confirm confirm passt nicht zum aktuellen Hostnamen
422
invalid_template Vorlage unbekannt
409
busy es läuft schon ein Auftrag
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/reinstall" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"template":"debian-12","hostname":"node1.example.de","confirm":"node1.example.de","sshkey":"ssh-ed25519 AAAA… user@pc"}'

Antwort · 202

{
    "job": 3051
}

Anfrage testenLive

GET/services/{id}/jobs/{job}

Auftrag abfragen

Stand einer Neuinstallation: queued, running, done oder error.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
jobPfad · Zahl · Pflicht
Auftrags-ID aus reinstall

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/jobs/3051" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "status": "running",
    "error": ""
}

Anfrage testenLive

POST/services/{id}/password-reset

Root-Passwort zurücksetzen

Setzt ein neues zufälliges Root-Passwort und gibt es zurück. Mit Gast-Agent sofort, sonst beim nächsten Start (reboot = true).

services:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
no_agent Gast-Agent nicht erreichbar
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/password-reset" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "pw": "Qm4!x9…",
    "method": "agent",
    "reboot": false
}

Anfrage testenLive

POST/services/{id}/hostname

Hostname ändern

Ändert den Hostnamen (auch im Kundenbereich und im DNS des Servernamens).

services:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
hostnameBody · Text · Pflicht
neuer Hostname

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
invalid_hostname Hostname ungültig
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/hostname" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"node2.example.de"}'

Antwort · 200

{
    "reboot": true
}

Anfrage testenLive

POST/services/{id}/sshkey

SSH-Schlüssel hinterlegen

Hinterlegt öffentliche SSH-Schlüssel per Cloud-Init (wirksam nach dem nächsten Start). Private Schlüssel erzeugen wir bewusst nicht.

services:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
keyBody · Text · Pflicht
ein oder mehrere öffentliche Schlüssel, je Zeile

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
invalid_sshkey Schlüssel ungültig
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/sshkey" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"ssh-ed25519 AAAA… user@pc"}'

Antwort · 200

{
    "reboot": true
}

Anfrage testenLive

Messwerte

Auslastung, Verlauf, Traffic und Aufgaben.

GET/services/{id}/metrics

Verlauf

Zeitreihen für CPU (%), RAM (Byte), Netz und Platte (Byte/s).

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
timeframeQuery · Text
hour, day, week, month oder year

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/metrics" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "t": [
        1760868000,
        1760868060
    ],
    "cpu": [
        2.1,
        3.4
    ],
    "mem": [
        1073741824,
        1081081856
    ],
    "maxmem": 4294967296,
    "netin": [
        1200,
        900
    ],
    "netout": [
        800,
        640
    ],
    "diskread": [
        0,
        4096
    ],
    "diskwrite": [
        12288,
        8192
    ]
}

Anfrage testenLive

GET/services/{id}/traffic

Traffic

Verkehr der letzten 24 Stunden (Grundlage der Fair-Use-Drossel) und Verlauf in Schritten.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
daysQuery · Zahl
1–31 Tage Verlauf, Standard 1
stepQuery · Zahl
Schritt in Sekunden (mind. 900), Standard 3600

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/traffic" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "last24h": {
        "rx": 0,
        "tx": 0,
        "total": 5368709120
    },
    "limit_gb": 1000,
    "throttle_mbit": 100,
    "series": [
        {
            "t": 1760868000,
            "rx": 104857600,
            "tx": 52428800
        }
    ]
}

Anfrage testenLive

GET/services/{id}/tasks

Letzte Aufgaben

Die letzten Aufgaben des Servers (Start, Backup, Snapshot …). Mit ?upid=… den Stand einer einzelnen Aufgabe.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
upidQuery · Text
eine Aufgabe, z. B. aus backups oder power

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/tasks" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "tasks": [
        {
            "upid": "UPID:n2:0012A3F1:…",
            "type": "vzdump",
            "status": "OK",
            "start": 1760868000,
            "end": 1760868120
        }
    ]
}

Anfrage testenLive

Backups & Snapshots

Sichern, wiederherstellen, löschen.

GET/services/{id}/backups

Backups auflisten

Alle Backups mit Größe, Notiz, Schutz und dem Limit des Tarifs.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/backups" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "items": [
        {
            "volid": "backup:backup/vm/1203/2026-10-19T02:00:00Z",
            "time": 1760839200,
            "size": 3221225472,
            "note": "vor Update",
            "protected": false
        }
    ],
    "limit": 3
}

Anfrage testenLive

POST/services/{id}/backups

Backup erstellen

Startet ein Backup im Hintergrund. Stand über GET /v1/services/{id}/tasks?upid=…

services:backups 202

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
noteBody · Text
Notiz zum Backup

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
limit Limit des Tarifs erreicht
409
busy es läuft schon ein Backup
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/backups" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"note":"vor Update"}'

Antwort · 202

{
    "upid": "UPID:n2:0012A3F1:…"
}

Anfrage testenLive

POST/services/{id}/backups/restore

Backup wiederherstellen

Spielt ein Backup zurück – der aktuelle Stand wird überschrieben.

services:backups 202

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
volidBody · Text · Pflicht
volid aus GET /v1/services/{id}/backups

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/backups/restore" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"volid":"backup:backup/vm/1203/2026-10-19T02:00:00Z"}'

Antwort · 202

{
    "upid": "UPID:n2:0012B001:…"
}

Anfrage testenLive

DELETE/services/{id}/backups

Backup löschen

Löscht ein Backup (geschützte Backups vorher freigeben).

services:backups 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
volidBody · Text · Pflicht
volid des Backups

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s -X DELETE "https://mam-jahn.de/mjapi.php/v1/services/877/backups" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"volid":"backup:backup/vm/1203/2026-10-19T02:00:00Z"}'

Antwort · 200

{
    "ok": true
}

Anfrage testenLive

GET/services/{id}/snapshots

Snapshots auflisten

Alle Snapshots, der aktuelle Stand und das Limit des Tarifs.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/snapshots" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "items": [
        {
            "name": "vor_update",
            "description": "",
            "time": 1760868000,
            "vmstate": false
        }
    ],
    "limit": 3,
    "current": "vor_update"
}

Anfrage testenLive

POST/services/{id}/snapshots

Snapshot erstellen

Legt einen Snapshot an (Name: Buchstaben, Ziffern, _ und -).

services:backups 202

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
nameBody · Text · Pflicht
Name des Snapshots
descriptionBody · Text
Beschreibung

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
invalid_name Name ungültig
422
limit Limit erreicht
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/snapshots" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"vor_update","description":"vor dem Kernel-Update"}'

Antwort · 202

{
    "upid": "UPID:n2:0012C9D0:…"
}

Anfrage testenLive

POST/services/{id}/snapshots/rollback

Snapshot zurückspielen

Setzt den Server auf den Snapshot zurück.

services:backups 202

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
nameBody · Text · Pflicht
Name des Snapshots

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/snapshots/rollback" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"vor_update"}'

Antwort · 202

{
    "upid": "UPID:n2:0012D1E4:…"
}

Anfrage testenLive

DELETE/services/{id}/snapshots

Snapshot löschen

Löscht einen Snapshot.

services:backups 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
nameBody · Text · Pflicht
Name des Snapshots

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s -X DELETE "https://mam-jahn.de/mjapi.php/v1/services/877/snapshots" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"vor_update"}'

Antwort · 200

{
    "upid": "UPID:n2:0012D2F0:…"
}

Anfrage testenLive

Netzwerk

IPs, rDNS, ISO-Laufwerk und Firewall.

GET/services/{id}/network

IPs und rDNS

Alle IPv4/IPv6 des Servers mit Gateway und rDNS-Eintrag.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/network" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "ips": [
        {
            "ip": "203.0.113.25",
            "version": 4,
            "gateway": "203.0.113.1",
            "rdns": "node1.example.de",
            "rdns_default": "static-203-0-113-25.clients.example.net"
        }
    ]
}

Anfrage testenLive

POST/services/{id}/rdns

rDNS setzen

Setzt den Reverse-DNS-Eintrag einer IP des Servers. Leerer Name = Standard.

services:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
ipBody · Text · Pflicht
IP des Servers
nameBody · Text · Pflicht
Name (FQDN)

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
invalid_ip IP gehört nicht zum Server
422
invalid_name Name ungültig
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/rdns" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ip":"203.0.113.25","name":"mail.example.de"}'

Antwort · 200

{
    "ok": true
}

Anfrage testenLive

POST/services/{id}/iso

ISO einlegen / auswerfen

Legt eine ISO-Datei ins virtuelle Laufwerk ein (key aus /os mit kind iso). Leer = auswerfen.

services:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services
volidBody · Text
ISO-key oder leer zum Auswerfen

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
422
invalid_iso ISO unbekannt
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/services/877/iso" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"volid":"local:iso/rescue.iso"}'

Antwort · 200

{
    "ok": true,
    "reboot": false
}

Anfrage testenLive

GET/services/{id}/firewall

Firewall lesen

Firewall-Status, Standard-Regeln und alle Regeln des Servers.

services:read 200

Parameter

idPfad · Zahl · Pflicht
ID des Vertrags (Dienst), z. B. aus GET /v1/services

Mögliche Fehler

404
not_found Vertrag nicht gefunden oder für diesen Schlüssel nicht sichtbar
409
not_supported Kein Proxmox-Server oder nicht aktiv
curl -s "https://mam-jahn.de/mjapi.php/v1/services/877/firewall" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "enable": true,
    "policy_in": "DROP",
    "policy_out": "ACCEPT",
    "rules": [
        {
            "pos": 0,
            "type": "in",
            "action": "ACCEPT",
            "proto": "tcp",
            "dport": "22",
            "source": "",
            "comment": "SSH",
            "enable": true
        }
    ]
}

Anfrage testenLive

Domains

Verfügbarkeit, Preise, registrieren und umziehen mit Guthaben, Nameserver, Authcode, Sperre.

GET/domains/check

Verfügbarkeit prüfen

Ist die Domain frei? Dazu deine Preise für Registrierung, Umzug und Verlängerung (1 Jahr).

domains:read 200

Parameter

domainQuery · Text · Pflicht
Domain mit Endung

Mögliche Fehler

422
invalid_domain Domain ungültig
429
rate_limited höchstens 30 Prüfungen je Minute
curl -s "https://mam-jahn.de/mjapi.php/v1/domains/check?domain=mein-projekt.de" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "domain": "mein-projekt.de",
    "available": true,
    "tld": ".de",
    "offered": true,
    "prices": {
        "register": 3.51,
        "transfer": 3.51,
        "renew": 3.51
    }
}

Anfrage testenLive

GET/domains/pricing

Domainpreise

Alle Endungen mit deinen Preisen für 1 Jahr (Registrierung, Umzug, Verlängerung).

domains:read 200

curl -s "https://mam-jahn.de/mjapi.php/v1/domains/pricing" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "currency": "EUR",
    "tlds": [
        {
            "tld": ".de",
            "register": 3.51,
            "transfer": 3.51,
            "renew": 3.51
        },
        {
            "tld": ".com",
            "register": 16.6,
            "transfer": 16.6,
            "renew": 16.6
        }
    ]
}

Anfrage testenLive

GET/domains

Domains auflisten

Alle Domains mit Status, Ablauf und Verlängerungspreis.

domains:read 200

Parameter

customer_idQuery · Zahl
nur Reseller: nur Domains dieses Endkunden
curl -s "https://mam-jahn.de/mjapi.php/v1/domains" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "domains": [
        {
            "id": 301,
            "domain": "mein-projekt.de",
            "status": "Active",
            "registered": "2026-10-19",
            "expires": "2027-10-19",
            "next_due": "2027-10-19",
            "years": 1,
            "renewal": 3.51,
            "auto_renew": true,
            "registrar": "example",
            "customer_id": 15
        }
    ]
}

Anfrage testenLive

GET/domains/{id}

Domain abrufen

Eine Domain mit aktuellen Nameservern und Transfersperre (live vom Registrar).

domains:read 200

Parameter

idPfad · Zahl · Pflicht
ID der Domain

Mögliche Fehler

404
not_found Domain nicht gefunden
curl -s "https://mam-jahn.de/mjapi.php/v1/domains/301" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "id": 301,
    "domain": "mein-projekt.de",
    "status": "Active",
    "expires": "2027-10-19",
    "nameservers": [
        "ns1.example.net",
        "ns2.example.net"
    ],
    "locked": true
}

Anfrage testenLive

POST/domains

Domain registrieren / umziehen

Bestellt die Domain und bezahlt mit Guthaben. Reicht es nicht, wird nichts bestellt.

domains:order 201

Parameter

domainBody · Text · Pflicht
Domain mit Endung
typeBody · Text
register (Standard) oder transfer
yearsBody · Zahl
1–10 Jahre, Standard 1
authcodeBody · Text
nur bei transfer
nameserversBody · Objekt
2–5 Nameserver als Liste
customer_idBody · Zahl
nur Reseller: Endkunde

Mögliche Fehler

402
insufficient_credit Guthaben reicht nicht
409
not_available Domain nicht frei
422
not_offered Endung/Laufzeit nicht im Angebot
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/domains" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain":"mein-projekt.de","type":"register","years":1,"nameservers":["ns1.example.net","ns2.example.net"],"customer_id":15}'

Antwort · 201

{
    "order_id": 513,
    "domain_id": 301,
    "invoice_id": 1295,
    "total": 3.51,
    "payment": "paid",
    "customer_id": 15
}

Anfrage testenLive

POST/domains/{id}/nameservers

Nameserver ändern

Setzt 2 bis 5 Nameserver beim Registrar.

domains:manage 200

Parameter

idPfad · Zahl · Pflicht
ID der Domain
nameserversBody · Objekt · Pflicht
Liste der Nameserver

Mögliche Fehler

422
invalid_nameservers 2–5 gültige Nameserver
502
registrar_error Registrar lehnt ab
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/domains/301/nameservers" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"nameservers":["ns1.example.net","ns2.example.net"]}'

Antwort · 200

{
    "ok": true,
    "nameservers": [
        "ns1.example.net",
        "ns2.example.net"
    ]
}

Anfrage testenLive

POST/domains/{id}/authcode

Authcode anfordern

Authcode für den Umzug zu einem anderen Anbieter. Manche Registrare schicken ihn per Mail an den Inhaber (emailed = true).

domains:manage 200

Parameter

idPfad · Zahl · Pflicht
ID der Domain

Mögliche Fehler

502
registrar_error Registrar lehnt ab
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/domains/301/authcode" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "authcode": "Xy7-…",
    "emailed": false
}

Anfrage testenLive

POST/domains/{id}/lock

Transfersperre

Sperre ein- oder ausschalten (nicht jede Endung kennt eine Sperre).

domains:manage 200

Parameter

idPfad · Zahl · Pflicht
ID der Domain
lockedBody · ja/nein · Pflicht
true oder false

Mögliche Fehler

502
registrar_error Registrar lehnt ab
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/domains/301/lock" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"locked":"true"}'

Antwort · 200

{
    "ok": true,
    "locked": true
}

Anfrage testenLive

Reseller

Endkunden unter deinem Konto (White-Label), Zuordnung, Abrechnung je Endkunde.

GET/reseller

Reseller-Konto

Rabatt, Guthaben, Warnschwelle und Anzahl Endkunden, Verträge und Domains.

reseller:manage 200

Mögliche Fehler

403
not_reseller Konto ist kein Reseller
curl -s "https://mam-jahn.de/mjapi.php/v1/reseller" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "reseller": true,
    "group": "Reseller 15 %",
    "discount_percent": 15,
    "credit": 240.5,
    "currency": "EUR",
    "low_credit_warning": 20,
    "customers": 12,
    "max_customers": null,
    "services": 31,
    "domains": 18
}

Anfrage testenLive

GET/reseller/customers

Endkunden auflisten

Deine Endkunden mit Anzahl Verträge und Domains. Suche mit ?q=.

reseller:manage 200

Parameter

qQuery · Text
Suche in Name, Firma, Referenz, E-Mail

Mögliche Fehler

403
not_reseller Konto ist kein Reseller
curl -s "https://mam-jahn.de/mjapi.php/v1/reseller/customers" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "customers": [
        {
            "id": 15,
            "ref": "K-1042",
            "name": "Max Muster",
            "company": "Muster GmbH",
            "email": "max@example.de",
            "note": "",
            "created": "2026-10-19",
            "services": 2,
            "domains": 1
        }
    ]
}

Anfrage testenLive

POST/reseller/customers

Endkunde anlegen

Legt einen Endkunden unter deinem Konto an. Er bekommt keine Mails und keinen Zugang bei uns.

reseller:manage 201

Parameter

nameBody · Text
Name (name oder company Pflicht)
companyBody · Text
Firma
refBody · Text
deine Kundennummer
emailBody · Text
E-Mail (nur für dich)
noteBody · Text
Notiz

Mögliche Fehler

422
missing_name name oder company fehlt
409
customer_limit Höchstzahl erreicht
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/reseller/customers" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Max Muster","company":"Muster GmbH","ref":"K-1042","email":"max@example.de"}'

Antwort · 201

{
    "id": 15,
    "ref": "K-1042",
    "name": "Max Muster",
    "company": "Muster GmbH",
    "email": "max@example.de",
    "note": "",
    "created": "2026-10-19"
}

Anfrage testenLive

GET/reseller/customers/{id}

Endkunde abrufen

Ein Endkunde mit seinen Verträgen, Domains und Monatskosten (dein Einkaufspreis).

reseller:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Endkunden

Mögliche Fehler

404
not_found Endkunde nicht gefunden
curl -s "https://mam-jahn.de/mjapi.php/v1/reseller/customers/15" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "id": 15,
    "ref": "K-1042",
    "name": "Max Muster",
    "services": [
        {
            "id": 877,
            "product": "KVM S",
            "status": "Active",
            "monthly": 8.42
        }
    ],
    "domains": [
        {
            "id": 301,
            "domain": "mein-projekt.de",
            "status": "Active"
        }
    ],
    "monthly_cost": 8.71
}

Anfrage testenLive

POST/reseller/customers/{id}

Endkunde ändern

Ändert nur die übergebenen Felder.

reseller:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Endkunden
nameBody · Text
Name
companyBody · Text
Firma
refBody · Text
deine Kundennummer
emailBody · Text
E-Mail
noteBody · Text
Notiz

Mögliche Fehler

404
not_found Endkunde nicht gefunden
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/reseller/customers/15" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Max Muster","ref":"K-1042","note":"zahlt jährlich"}'

Antwort · 200

{
    "id": 15,
    "ref": "K-1042",
    "name": "Max Muster",
    "company": "",
    "email": "",
    "note": "zahlt jährlich",
    "created": "2026-10-19"
}

Anfrage testenLive

DELETE/reseller/customers/{id}

Endkunde löschen

Nur ohne laufende Verträge. Zuordnungen beendeter Verträge werden gelöst.

reseller:manage 200

Parameter

idPfad · Zahl · Pflicht
ID des Endkunden

Mögliche Fehler

409
has_services hat noch laufende Verträge
curl -s -X DELETE "https://mam-jahn.de/mjapi.php/v1/reseller/customers/15" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "ok": true
}

Anfrage testenLive

POST/reseller/assign

Vertrag/Domain zuordnen

Ordnet einen bestehenden Vertrag oder eine Domain einem Endkunden zu (customer_id 0 = Zuordnung lösen).

reseller:manage 200

Parameter

customer_idBody · Zahl · Pflicht
Endkunde oder 0
service_idBody · Zahl
Vertrag (oder domain_id)
domain_idBody · Zahl
Domain (oder service_id)

Mögliche Fehler

422
invalid_target genau eins von service_id/domain_id
curl -s -X POST "https://mam-jahn.de/mjapi.php/v1/reseller/assign" \
  -H "Authorization: Bearer $MJ_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":15,"service_id":877}'

Antwort · 200

{
    "ok": true,
    "customer_id": 15
}

Anfrage testenLive

GET/reseller/report

Abrechnung je Endkunde

Alle laufenden Verträge und Domains je Endkunde mit deinem Einkaufspreis und Monatswert – Grundlage für deine eigene Rechnung.

reseller:manage 200

Mögliche Fehler

403
not_reseller Konto ist kein Reseller
curl -s "https://mam-jahn.de/mjapi.php/v1/reseller/report" \
  -H "Authorization: Bearer $MJ_KEY"

Antwort · 200

{
    "currency": "EUR",
    "monthly_total": 214.3,
    "discount_percent": 15,
    "customers": [
        {
            "customer_id": 15,
            "ref": "K-1042",
            "name": "Muster GmbH",
            "monthly_cost": 8.71,
            "items": [
                {
                    "type": "service",
                    "id": 877,
                    "name": "KVM S",
                    "hostname": "node1.example.de",
                    "amount": 8.42,
                    "billingcycle": "monthly",
                    "monthly": 8.42,
                    "next_due": "2026-11-19"
                }
            ]
        }
    ]
}

Anfrage testenLive