Partner-API-Integration
Die Partner-API ermoeglicht es externen Systemen, sich mit Levy Fleets zu integrieren und programmatischen Zugriff auf Fahrzeuge, Fahrten, Kunden, Zonen und Preisdaten zu ermoeglichen. Verwenden Sie Webhooks, um Echtzeit-Benachrichtigungen ueber Flottenereignisse zu erhalten.
Ueberblick
Die Partner-API bietet RESTful-Endpunkte zur programmatischen Verwaltung Ihrer Flotte. Alle Anfragen werden mit API-Schluesseln authentifiziert und basierend auf Ihrer Konfiguration ratenbegrenzt.
Hauptfunktionen
- RESTful-API - Standard-HTTP-Methoden und JSON-Antworten
- API-Schluessel-Authentifizierung - Sicherer Zugriff mit begrenzten Berechtigungen
- Ratenbegrenzung - Konfigurierbare Limits pro Minute, Stunde und Tag
- Webhooks - Echtzeit-Ereignisbenachrichtigungen mit Wiederholungslogik
- Anfrageprotokollierung - Vollstaendiger Audit-Trail der API-Nutzung
Basis-URL
https://app.levyelectric.com/api/partner/v1
Erste Schritte
API-Schluessel erstellen
Zu Integrationen navigieren
Gehen Sie zu Dashboard → Einstellungen → Integrationen.
API-Schluessel erstellen klicken
Klicken Sie auf die Schaltflaeche Neuer API-Schluessel.
Schluesseleinstellungen konfigurieren
- Geben Sie einen beschreibenden Namen ein (z.B. "Produktionsintegration")
- Waehlen Sie Berechtigungen fuer diesen Schluessel
- Setzen Sie Ratenlimits falls erforderlich
- Optional ein Ablaufdatum festlegen
Speichern und Schluessel kopieren
Klicken Sie auf Erstellen und kopieren Sie sofort den geheimen Schluessel.
Geheimen Schluessel speichern
Der geheime API-Schluessel wird nur einmal bei der Erstellung angezeigt. Speichern Sie ihn sicher - wenn er verloren geht, muessen Sie den Schluessel neu generieren.
API-Schluessel-Format
API-Schluessel verwenden das Format: lf_pk_<32 zufaellige Zeichen>
Beispiel: lf_pk_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
Nur die ersten 12 Zeichen (Praefix) werden zur Anzeige gespeichert. Der vollstaendige Schluessel wird mit SHA-256 gehasht zur sicheren Speicherung.
Authentifizierung
Anfrage-Header
Alle API-Anfragen muessen den API-Schluessel-Header enthalten:
curl -X GET "https://app.levyelectric.com/api/partner/v1/vehicles" \
-H "X-Partner-Api-Key: lf_pk_your_api_key_here" \
-H "Content-Type: application/json"
Optionale Header
| Header | Beschreibung |
|---|---|
X-Subaccount-Id | Bestimmtes Unterkonto anvisieren (fuer globale Schluessel) |
Content-Type | Immer application/json |
Authentifizierungsfehler
| Status | Code | Beschreibung |
|---|---|---|
| 401 | UNAUTHORIZED | Fehlender oder ungueltiger API-Schluessel |
| 403 | FORBIDDEN | Schluessel hat nicht die erforderliche Berechtigung |
Berechtigungen
API-Schluesseln werden spezifische Berechtigungen erteilt, die steuern, welche Vorgaenge sie ausfuehren koennen.
Verfuegbare Berechtigungen
| Berechtigung | Beschreibung |
|---|---|
vehicles:read | Fahrzeuge auflisten und anzeigen |
vehicles:write | Fahrzeugstatus aktualisieren |
rides:read | Fahrten auflisten und anzeigen |
rides:write | Fahrten starten, pausieren, fortsetzen, beenden |
customers:read | Kunden auflisten und anzeigen |
customers:write | Kunden sperren/entsperren |
wallet:read | Kunden-Wallet-Guthaben anzeigen |
wallet:write | Kunden-Wallets gutschreiben/belasten |
zones:read | Zonen auflisten und anzeigen |
pricing:read | Preiskonfiguration anzeigen |
webhooks:read | Webhooks auflisten und anzeigen |
webhooks:write | Webhooks erstellen, aktualisieren, loeschen |
Standardberechtigungen
Neue API-Schluessel erhalten standardmaessig Lesezugriff:
vehicles:readrides:readcustomers:readzones:readpricing:read
Schluesselumfaenge
| Umfang | Beschreibung |
|---|---|
subaccount | Zugriff auf ein Unterkonto beschraenkt |
global | Zugriff auf mehrere Unterkonten (in allowed_subaccount_ids angeben) |
Ratenbegrenzung
API-Anfragen sind ratenbegrenzt, um Missbrauch zu verhindern und faire Nutzung zu gewaehrleisten.
Standard-Limits
| Zeitfenster | Standard-Limit |
|---|---|
| Pro Minute | 60 Anfragen |
| Pro Stunde | 1.000 Anfragen |
| Pro Tag | 10.000 Anfragen |
Antwort-Header
Ratenlimit-Status ist in Antwort-Headern enthalten:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 2025-01-15T10:31:00Z
Ratenlimit ueberschritten
Wenn Limits ueberschritten werden, erhalten Sie eine 429-Antwort:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded for minute window. Retry after 2025-01-15T10:31:00Z",
"details": {
"limit": 60,
"window": "minute",
"retry_after": 45
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2025-01-15T10:30:15Z"
}
}
API-Endpunkte
Fahrzeuge
Fahrzeuge auflisten
GET /api/partner/v1/vehicles
GET /api/partner/v1/vehicles?status=available&limit=50
Fahrzeug abrufen
GET /api/partner/v1/vehicles/{id}
Fahrzeugstatus aktualisieren
PATCH /api/partner/v1/vehicles/{id}
{
"status": "maintenance"
}
Fahrzeuge in der Naehe
GET /api/partner/v1/vehicles/nearby?lat=40.7128&lng=-74.0060&radius=500
Fahrten
Fahrten auflisten
GET /api/partner/v1/rides
GET /api/partner/v1/rides?status=active
Fahrt abrufen
GET /api/partner/v1/rides/{id}
Fahrt starten (erfordert rides:write)
POST /api/partner/v1/rides
{
"customer_id": "uuid",
"vehicle_id": "uuid"
}
Fahrt pausieren
POST /api/partner/v1/rides/{id}/pause
Fahrt fortsetzen
POST /api/partner/v1/rides/{id}/resume
Fahrt beenden
POST /api/partner/v1/rides/{id}/end
{
"end_latitude": 40.7128,
"end_longitude": -74.0060
}
Kunden
Kunden auflisten
GET /api/partner/v1/customers
GET /api/partner/v1/customers?email=user@example.com
Kunden abrufen
GET /api/partner/v1/customers/{id}
Wallet-Guthaben abrufen
GET /api/partner/v1/customers/{id}/wallet
Wallet gutschreiben (erfordert wallet:write)
POST /api/partner/v1/customers/{id}/wallet
{
"action": "credit",
"amount_cents": 1000,
"description": "Aktionsguthaben"
}
Zonen
Zonen auflisten
GET /api/partner/v1/zones
GET /api/partner/v1/zones?type=parking
Preise
Preise abrufen
GET /api/partner/v1/pricing
Antwortformat
Erfolgsantwort
{
"data": {
"id": "uuid",
"vehicle_number": "V001",
"status": "available"
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2025-01-15T10:30:00Z"
}
}
Listenantwort
{
"data": [
{ "id": "uuid-1", "vehicle_number": "V001" },
{ "id": "uuid-2", "vehicle_number": "V002" }
],
"pagination": {
"page": 1,
"limit": 50,
"total": 125,
"has_next": true,
"has_prev": false
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2025-01-15T10:30:00Z"
}
}
Fehlerantwort
{
"error": {
"code": "NOT_FOUND",
"message": "Vehicle not found",
"details": {
"vehicle_id": "uuid"
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2025-01-15T10:30:00Z"
}
}
Webhooks
Webhooks senden Echtzeit-HTTP-POST-Anfragen an Ihren Server, wenn Ereignisse auftreten.
Webhooks einrichten
Zu Webhooks navigieren
Gehen Sie zu Dashboard → Einstellungen → Integrationen → Webhooks.
Webhook erstellen
Klicken Sie auf Neuer Webhook.
Endpunkt konfigurieren
- Geben Sie Ihre Webhook-URL ein (HTTPS erforderlich)
- Waehlen Sie Ereignisse, die Sie abonnieren moechten
- Fuegen Sie bei Bedarf benutzerdefinierte Header hinzu
Speichern und testen
Speichern Sie den Webhook, verwenden Sie dann Testen, um die Zustellung zu ueberpruefen.
Webhook-Ereignisse
| Ereignis | Ausloeser |
|---|---|
ride.started | Kunde entsperrt ein Fahrzeug |
ride.ended | Fahrt wird abgeschlossen |
ride.paused | Fahrt wird pausiert |
ride.resumed | Pausierte Fahrt wird fortgesetzt |
customer.created | Neuer Kunde registriert sich |
customer.updated | Kundenprofil aktualisiert |
customer.blocked | Kunde wird gesperrt |
customer.unblocked | Kunde wird entsperrt |
vehicle.status_changed | Fahrzeugstatus aendert sich |
vehicle.battery_low | Batterie faellt unter Schwellenwert |
vehicle.location_updated | Fahrzeug bewegt sich signifikant |
Webhook-Payload
{
"event": "ride.ended",
"event_id": "evt_abc123def456",
"timestamp": "2025-01-15T10:30:00Z",
"data": {
"ride_id": "uuid",
"customer_id": "uuid",
"customer_number": 12345,
"vehicle_id": "uuid",
"vehicle_number": "V001",
"start_time": "2025-01-15T10:00:00Z",
"end_time": "2025-01-15T10:30:00Z",
"duration_minutes": 30,
"distance_km": 5.2,
"pricing": {
"total_cents": 850,
"unlock_cents": 100,
"time_cents": 750,
"distance_cents": 0,
"discount_cents": 0
},
"payment_status": "paid",
"subaccount_id": "uuid"
}
}
Webhook-Signatur
Webhooks werden mit HMAC-SHA256 zur Sicherheitsverifizierung signiert.
Signatur-Header:
X-Levy-Signature: t=1705312200,v1=abc123...
Verifizierung (Node.js-Beispiel):
const crypto = require('crypto')
function verifyWebhook(payload, signature, secret) {
const parts = signature.split(',')
const timestamp = parts.find(p => p.startsWith('t=')).substring(2)
const expectedSig = parts.find(p => p.startsWith('v1=')).substring(3)
// Pruefen, ob Zeitstempel aktuell ist (innerhalb von 5 Minuten)
const age = Math.floor(Date.now() / 1000) - parseInt(timestamp)
if (age > 300) return false
// Signatur berechnen
const signedPayload = `${timestamp}.${JSON.stringify(payload)}`
const computedSig = crypto
.createHmac('sha256', secret)
.update(signedPayload)
.digest('hex')
return computedSig === expectedSig
}
Wiederholungslogik
Fehlgeschlagene Webhook-Zustellungen werden automatisch wiederholt:
| Versuch | Verzoegerung |
|---|---|
| 1 | Sofort |
| 2 | 1 Sekunde |
| 3 | 2 Sekunden |
| 4 | 4 Sekunden |
| 5 | 8 Sekunden |
Nach 5 fehlgeschlagenen Versuchen wird die Zustellung als fehlgeschlagen markiert.
API-Schluessel-Verwaltung
Schluessel neu generieren
Wenn ein Schluessel kompromittiert ist:
- Gehen Sie zu Einstellungen → Integrationen
- Finden Sie den API-Schluessel
- Klicken Sie auf Neu generieren
- Aktualisieren Sie Ihre Systeme mit dem neuen Schluessel
- Der alte Schluessel wird sofort ungueltig
Schluessel deaktivieren
Schluessel voruebergehend deaktivieren, ohne ihn zu loeschen:
- Finden Sie den API-Schluessel
- Schalten Sie Aktiv auf aus
- Alle Anfragen mit diesem Schluessel geben 401 zurueck
Nutzung anzeigen
API-Schluessel-Aktivitaet ueberwachen:
- Zuletzt verwendet - Wann der Schluessel zuletzt verwendet wurde
- Anfragen heute - Anzahl der heutigen Anfragen
- Anfragen diese Woche/diesen Monat - Historische Nutzung
Best Practices
Sicherheit
- Schluessel sicher speichern - Umgebungsvariablen verwenden, nicht im Code
- HTTPS verwenden - Alle API-Aufrufe muessen HTTPS verwenden
- Webhooks verifizieren - Webhook-Signaturen immer validieren
- Schluessel rotieren - Schluessel regelmaessig neu generieren
- Minimale Berechtigungen - Nur notwendige Berechtigungen erteilen
Leistung
- Paginierung verwenden - Kleinere Seiten fuer grosse Listen anfordern
- Antworten cachen - Nur-Lesen-Daten angemessen cachen
- Ratenlimits behandeln - Exponentielles Backoff implementieren
- Webhooks verwenden - Webhooks statt Polling bevorzugen
Fehlerbehandlung
- Antwortcodes pruefen - 4xx- und 5xx-Fehler behandeln
- Request-IDs verwenden - request_id fuer Debugging protokollieren
- Transiente Fehler wiederholen - 5xx-Fehler mit Backoff wiederholen
- Fehler ueberwachen - Bei wiederholten Webhook-Fehlern alarmieren
Fehlerbehebung
Authentifizierungsfehler
| Fehler | Loesung |
|---|---|
| Fehlender Header | X-Partner-Api-Key-Header hinzufuegen |
| Ungueltiger Schluessel | Ueberpruefen, ob Schluessel korrekt und aktiv ist |
| Abgelaufener Schluessel | Neu generieren oder Ablaufdatum entfernen |
| Falsche Berechtigungen | Schluesselberechtigungen aktualisieren |
Webhook-Probleme
| Problem | Loesung |
|---|---|
| Keine Ereignisse empfangen | Pruefen, ob Webhook aktiv und URL erreichbar ist |
| Signaturverifizierung schlaegt fehl | Ueberpruefen, ob korrektes Geheimnis verwendet wird |
| Timeout-Fehler | Auf Webhooks innerhalb von 30 Sekunden antworten |
| Fehlende Ereignisse | Pruefen, ob Sie den Ereignistyp abonniert haben |
Ratenlimit-Probleme
| Problem | Loesung |
|---|---|
| Haeufiges Erreichen der Limits | Caching implementieren und Anfragefrequenz reduzieren |
| Hoehere Limits benoetigt | Support kontaktieren, um Limiterhebungen zu besprechen |
| Burst-Nutzung | Anfragen ueber Zeit verteilen |
SDK-Beispiele
Node.js
const axios = require('axios')
const api = axios.create({
baseURL: 'https://app.levyelectric.com/api/partner/v1',
headers: {
'X-Partner-Api-Key': process.env.LEVY_API_KEY,
'Content-Type': 'application/json'
}
})
// Verfuegbare Fahrzeuge auflisten
const { data } = await api.get('/vehicles', {
params: { status: 'available' }
})
console.log(data.data) // Array von Fahrzeugen
Python
import requests
import os
API_KEY = os.environ['LEVY_API_KEY']
BASE_URL = 'https://app.levyelectric.com/api/partner/v1'
headers = {
'X-Partner-Api-Key': API_KEY,
'Content-Type': 'application/json'
}
# Ein bestimmtes Fahrzeug abrufen
response = requests.get(
f'{BASE_URL}/vehicles/uuid-here',
headers=headers
)
vehicle = response.json()['data']
print(f"Fahrzeug {vehicle['vehicle_number']}: {vehicle['status']}")
Bereit zur Integration
Mit der Partner-API koennen Sie leistungsstarke Integrationen erstellen, die Levy Fleets mit Ihren bestehenden Systemen verbinden. Beginnen Sie mit Lesezugriff, testen Sie gruendlich, dann aktivieren Sie Schreibberechtigungen fuer den Produktionseinsatz.