Public API für Entwickler
Über diese API kann Ihre CRM-Software oder ein eigenes Skript Angebote in Ihrem Verkäuferkonto anlegen, aktualisieren und mit Fotos versehen – über dieselbe Geschäftslogik, die auch die manuelle Verkäufer-Oberfläche verwendet. Die API ist ausschließlich für Verkäufer gedacht, die bereits ein Konto auf diesem Marketplace haben.
Erste Schritte
- Erstellen Sie einen API-Schlüssel unter Einstellungen → API in Ihrem Verkäuferkonto. Der Schlüssel wird nur einmal vollständig angezeigt.
- Senden Sie ihn als
Authorization: Bearer-Header an/api/public/v1/....
curl -X POST "https://<ihre-domain>/api/public/v1/listings" \
-H "Authorization: Bearer mp_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"newProduct": { "categoryId": "...", "title": "BMW G30 Türgriff links" },
"title": "BMW G30 Türgriff links",
"condition": "used",
"priceCents": 4500,
"vatRate": 19
}'Basis-URL: /api/public/v1 – relativ zu Ihrer Marketplace-Domain, kein separater Host.
Authentifizierung
API-Schlüssel haben das Format mp_live_... (Produktion) bzw. mp_test_... (Test). Sie werden serverseitig nur als HMAC-Hash gespeichert und einmalig bei Erstellung angezeigt.
Beim Erstellen wählen Sie, welche Berechtigungen (Scopes) der Schlüssel erhält:
| Scope | Berechtigt zu |
|---|---|
| listings:read | Angebote lesen, Kategorien lesen, Validierung |
| listings:write | Angebote anlegen/ändern, Fotos-Liste, Kompatibilität |
| listings:submit | Angebot zur Prüfung einreichen |
| images:write | Fotos hochladen |
| keys:self-rotate | Der Schlüssel kann sich selbst vor Ablauf erneuern (optional, für unbeaufsichtigte Integrationen) |
Ein optionales Ablaufdatum können Sie beim Erstellen des Schlüssels selbst festlegen. Die Verwaltung von Schlüsseln (anlegen, rotieren, widerrufen) erfolgt ausschließlich über Ihre eingeloggte Sitzung unter Einstellungen → API, nicht über die Public API selbst – ein kompromittierter Schlüssel kann also nie einen anderen Schlüssel anlegen oder widerrufen.
Angebote (Listings)
Ein „Listing” entspricht genau dem, was die Verkäufer-Oberfläche ein „Angebot” nennt – dieselbe Datenbank, dieselbe Geschäftslogik.
| Methode | Pfad | Scope |
|---|---|---|
| GET | /listings | listings:read |
| GET | /listings/:id | listings:read |
| POST | /listings | listings:write |
| PATCH | /listings/:id | listings:write |
| POST | /listings/:id/photos | images:write |
| POST | /listings/:id/submit | listings:submit |
| POST | /listings/:id/archive | listings:write |
| POST | /listings/bulk | listings:write |
| PUT | /listings/upsert | listings:write |
Neue Angebote durchlaufen denselben zweistufigen Prozess wie in der Oberfläche: nach submit geht ein Angebot in die bestehende Moderationswarteschlange, bevor es sichtbar wird – ein direktes Veröffentlichen an der Prüfung vorbei ist über die API nicht möglich.
Änderungen per PATCH erfordern einen If-Match-Header mit der aktuellen Version (aus dem ETag einer vorherigen Antwort) – so verhindern wir, dass zwei gleichzeitige Änderungen sich gegenseitig überschreiben.
Ein optionaler Idempotency-Key-Header auf POST-Anfragen sorgt dafür, dass ein wiederholter Request (z. B. nach einem Netzwerkfehler) niemals doppelt anlegt. Für die Synchronisation mit Ihrem CRM können Sie externalId/externalSource mitgeben, oder direkt PUT /listings/upsert verwenden (legt an oder aktualisiert, je nachdem ob der Eintrag schon existiert).
Listen werden per Cursor paginiert, nicht per Seitenzahl:
GET /listings?status=active&limit=50&cursor=eyJjcmVhdGVkQXQiOi...Kategorien & Attribute
Bevor Sie ein Angebot anlegen, können Sie abfragen, welche Felder eine Kategorie erwartet – nützlich, um in Ihrem eigenen System automatisch das passende Formular zu erzeugen.
GET /categories
GET /categories/{id}
GET /categories/{id}/attributesDie meisten Kategorien haben kein zusätzliches Attribut-Schema – dort genügen Titel und (vor dem Einreichen) mindestens ein Foto, wie gewohnt. Nur einzelne Kategorien (z. B. Bremsbeläge) verlangen zusätzliche, strukturierte Angaben; diese werden beim Anlegen unter newProduct.attributes mitgeschickt und können später über PATCH /listings/:id/attributes nachgetragen werden.
Bilder
POST /listings/:id/photos
Content-Type: multipart/form-dataErlaubte Formate: JPEG, PNG, WebP. Maximal 8 MB pro Datei, 24 Fotos pro Angebot.
Der tatsächliche Dateiinhalt wird geprüft, nicht nur die angegebene Content-Type – ein falsch deklariertes Format wird abgelehnt.
Webhooks
Über Webhooks erfahren Sie in Echtzeit von Änderungen an Ihren Angeboten sowie von neuen Bestellungen und Verkäufen (listing.created, listing.published, order.created, offer.sold u. a.) – ohne dass Sie selbst regelmäßig abfragen müssen.
Webhook-Endpunkte richten Sie ausschließlich über Ihre eingeloggte Sitzung ein, nicht über einen API-Schlüssel:
Jede Zustellung ist per HMAC-SHA256 signiert (X-Marketplace-Signature). Prüfen Sie die Signatur über die exakten, unveränderten Rohdaten des Requests:
const signedPayload = `${timestamp}.${rawBody}`;
const expected = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
// mit dem hex-Teil von X-Marketplace-Signature (Format "v1=<hex>") vergleichenFehlerbehandlung
Jede Fehlerantwort hat dieselbe Struktur:
{
"error": {
"code": "SKU_ALREADY_EXISTS",
"message": "...",
"details": [ { "field": "inventory.sku", "message": "..." } ],
"requestId": "a73c6fbb-ed58-45d7-896d-1a9f3df27e56"
}
}requestId finden Sie auch im X-Request-Id-Response-Header jeder Antwort – geben Sie ihn bei Rückfragen an unseren Support an.
| Status | Bedeutung |
|---|---|
| 400 | Fehlerhafte Anfrage, fehlender If-Match-Header, zu viele Bulk-Items |
| 401 | API-Schlüssel fehlt, ungültig, widerrufen oder abgelaufen |
| 403 | Fehlende Berechtigung (Scope) |
| 404 | Ressource existiert nicht oder gehört nicht Ihnen |
| 409 | SKU-/Externe-ID-Konflikt, Idempotency-Key bereits verwendet |
| 412 | If-Match stimmt nicht mit aktueller Version überein |
| 422 | Fachliche Validierung fehlgeschlagen (z. B. Bild zu groß) |
| 429 | Rate-Limit erreicht |
Rate Limits
Begrenzt pro API-Schlüssel und Anfrageart, konfigurierbar serverseitig – Richtwerte:
| Art | Standard-Limit |
|---|---|
| Lesen (GET) | 300 Anfragen / 60 s |
| Schreiben (POST/PATCH) | 60 Anfragen / 60 s |
| Bild-Upload | 30 Anfragen / 60 s |
| Bulk-Import | 10 Anfragen / 60 s |
Bei Überschreitung antwortet die API mit 429 und dem Header Retry-After-publicApiKey.
Vollständige Referenz
Alle Endpunkte mit vollständigem Schema finden Sie in der interaktiven API-Dokumentation.
API-Dokumentation öffnen