Die P2P Dash API
Deine P2P-Portfolio-Daten als JSON, für eine Tabelle, ein Skript oder dein eigenes Dashboard. Du legst in deinem Konto einen Token an, schickst ihn bei jeder Anfrage mit und bekommst genau die Zahlen zurück, die du auch in P2P Dash siehst.
Deine erste Anfrage
Drei Schritte im Terminal unter macOS oder Linux. Wenn du lieber in Google Sheets anfängst, findest du weiter unten ein Beispiel dafür.
Token anlegen
Öffne in P2P Dash das Benutzermenü und dort „API-Tokens“. Gib dem Token einen Namen, setz „Deine Daten“ auf „Lesen“ und wähl aus, wann er abläuft. Wir zeigen den Token nur ein einziges Mal, also kopier ihn gleich.
Halt ihn aus deinem Code raus
Leg ihn in eine Umgebungsvariable, hier P2PDASH_TOKEN, und nicht in eine Datei, die du teilst. Wer den Token hat, kann deine Zahlen lesen.
Anfrage schicken
Jede Anfrage trägt den Token im Header Authorization. Die Antwort ist JSON, deine Daten stehen unter data.
export P2PDASH_TOKEN="p2pdash_..."
curl https://app.p2pdash.com/api/v1/account/summary \
-H "Authorization: Bearer $P2PDASH_TOKEN"Unter Windows in der PowerShell setzt du den Token mit $env:P2PDASH_TOKEN = "p2pdash_...", schreibst curl.exe statt curl, schreibst die Anfrage in eine Zeile und nimmst im Header $env:P2PDASH_TOKEN.
{
"data": {
"platformCount": 4,
"firstDate": "2021-03-02",
"lastDate": "2026-11-09",
"interest": 1781.4,
"principalRepayment": 37443.05,
"fee": 12.4,
"tax": 0,
"bonus": 85,
"deposit": 12000,
"withdrawal": 1500,
"investment": 48210.33,
"defaultLoss": 120.5,
"internalTransfer": 0,
"transactionCount": 14873,
"totalBalance": 12233.5,
"availableBalance": 1586.72,
"investedBalance": 10646.78,
"netDeposits": 10500,
"netIncome": 1733.5
}
}Das sind Beispielzahlen. totalBalance ist, was dein Konto wert ist: Einzahlungen minus Auszahlungen plus alles, was du verdient hast, nach Gebühren, Steuern und Verlusten.
Beispiele
Vier Dinge, die du mit der API machen kannst. Kopier den Code, setz deinen Token ein und pass ihn von da aus an.
Dein Kontostand in Google Sheets
Öffne in deiner Tabelle Erweiterungen → Apps Script und füg diese Funktion ein. Unter Projekteinstellungen → Skripteigenschaften legst du P2PDASH_TOKEN mit deinem Token an. Dann schreibst du die Formel in eine Zelle. Jedes Feld der Zusammenfassung geht, zum Beispiel "netIncome".
function P2PDASH(field) {
const token = PropertiesService.getScriptProperties()
.getProperty("P2PDASH_TOKEN");
const res = UrlFetchApp.fetch(
"https://app.p2pdash.com/api/v1/account/summary",
{ headers: { Authorization: "Bearer " + token } },
);
return JSON.parse(res.getContentText()).data[field];
}=P2PDASH("totalBalance") → 12233.5Sheets merkt sich das Ergebnis und fragt erst wieder, wenn sich die Formel ändert. Zum Aktualisieren gibst du ein zweites Argument mit, etwa =P2PDASH("totalBalance", A1), und änderst A1. Jede Zelle ist eine Anfrage. Wer die Tabelle bearbeiten darf, kann in Apps Script auch den Token lesen, mach das also nicht in einer Tabelle, die andere bearbeiten können.
Zinsen pro Monat
Die Zeitreihe mit granularity=month liefert dir einen Punkt pro Monat mit Daten. Die Bibliothek installierst du einmal mit pip install requests.
import os
import requests
res = requests.get(
"https://app.p2pdash.com/api/v1/account/timeseries",
params={"granularity": "month", "from": "2026-08-01", "to": "2026-10-31"},
headers={"Authorization": f"Bearer {os.environ['P2PDASH_TOKEN']}"},
)
res.raise_for_status()
for point in res.json()["data"]:
print(point["date"][:7], f"{point['interest']:.2f}")2026-08 94.80
2026-09 96.42
2026-10 98.15XIRR pro Plattform
Speicher das als xirr.mjs und starte es mit node xirr.mjs (Node.js 18 oder neuer). Der XIRR kommt als Bruchzahl: 0.0984 heißt 9,84 % pro Jahr. Eine Plattform mit zu wenig Daten bekommt null.
const res = await fetch("https://app.p2pdash.com/api/v1/account/metrics", {
headers: { Authorization: `Bearer ${process.env.P2PDASH_TOKEN}` },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data } = await res.json();
for (const p of data.xirr.platforms) {
const xirr = p.allTimeXirr === null
? "-"
: (p.allTimeXirr * 100).toFixed(2) + "%";
console.log(p.name.padEnd(12), xirr);
}Platform A 9.84%
Platform B 10.37%
Platform C 11.20%
Platform D -Zahlen für die Steuererklärung
Zinsen und Boni pro Plattform für ein Jahr, mit jq gekürzt. Was davon als Einkommen zählt, hängt von den Regeln in deinem Land ab. Die API zeigt nur, was in P2P Dash steht.
curl -s "https://app.p2pdash.com/api/v1/account/tax?year=2025" \
-H "Authorization: Bearer $P2PDASH_TOKEN" \
| jq '.data[] | {name, interest: .years[0].interest, bonus: .years[0].bonus}'{
"name": "Platform A",
"interest": 412.37,
"bonus": 25
}
{
"name": "Platform B",
"interest": 288.9,
"bonus": 0
}Was du abfragen kannst
Dein ganzes Konto, jedes Portfolio und jede Plattform beantworten dieselben fünf Fragen. Einmal verstanden, kannst du sie auf jeder Ebene stellen.
Die fünf Ansichten
Jede Ansicht gibt es dreimal. Für eine einzelne Plattform holst du dir zuerst ihre ID aus /api/v1/platforms und setzt sie dann statt {id} ein. Bei Portfolios geht es genauso.
summarySummen über die ganze Zeit: Zinsen, Boni, Gebühren, Verluste, Einzahlungen, Auszahlungen und die Kontostände, die sich daraus ergeben.
- Ganzes Konto
- GET /api/v1/account/summary
- Ein Portfolio
- GET /api/v1/portfolios/{id}/summary
- Eine Plattform
- GET /api/v1/platforms/{id}/summary
timeseriesDieselben Werte im Zeitverlauf, pro Tag, Monat oder Jahr, mit dem Kontostand am Ende jedes Zeitraums. Gut für Diagramme.
- Ganzes Konto
- GET /api/v1/account/timeseries
- Ein Portfolio
- GET /api/v1/portfolios/{id}/timeseries
- Eine Plattform
- GET /api/v1/platforms/{id}/timeseries
metricsXIRR (gesamt und pro Jahr, mit und ohne Boni), Cash Drag, durchschnittlich investiertes Kapital und die Kapitalrückgewinnung, pro Plattform und insgesamt.
- Ganzes Konto
- GET /api/v1/account/metrics
- Ein Portfolio
- GET /api/v1/portfolios/{id}/metrics
- Eine Plattform
- GET /api/v1/platforms/{id}/metrics
income-projectionWas dein aktueller Kontostand pro Tag, Monat und Jahr bringen würde, wenn dein bisheriger XIRR ohne Boni so weiterläuft. Eine Hochrechnung, kein Versprechen.
- Ganzes Konto
- GET /api/v1/account/income-projection
- Ein Portfolio
- GET /api/v1/portfolios/{id}/income-projection
- Eine Plattform
- GET /api/v1/platforms/{id}/income-projection
taxZinsen, Boni, einbehaltene Steuern, Gebühren und Verluste pro Plattform und Kalenderjahr, das neueste Jahr zuerst.
- Ganzes Konto
- GET /api/v1/account/tax
- Ein Portfolio
- GET /api/v1/portfolios/{id}/tax
- Eine Plattform
- GET /api/v1/platforms/{id}/tax
Listen und Details
- GET /api/v1/account
- Welchen Token du gerade nutzt, seine Berechtigungen und wann er abläuft. Praktisch, um zu prüfen, ob ein Token noch funktioniert.
- GET /api/v1/platforms
- Alle deine Plattformen mit IDs, Portfolios und Summen. Hier fängst du an, um die IDs zu finden.
- GET /api/v1/platforms/{id}
- Eine Plattform, dasselbe Objekt wie in der Liste.
- GET /api/v1/platforms/{id}/intent-history
- Wann du deinen Plan für eine Plattform geändert hast (ausbauen, halten, aussteigen und so weiter).
- GET /api/v1/portfolios
- Alle deine Portfolios mit ihren Plattformen.
- GET /api/v1/portfolios/{id}
- Ein Portfolio.
- GET /api/v1/platform-types
- Fakten pro Plattformtyp: Land, Anlageklassen, Regulierung, Gründungsjahr. Für alle Nutzer gleich.
Query-Parameter
from, to- Nur für
timeseries. Tage im FormatYYYY-MM-DD, beide inklusive. Mitmonthoderyearwerden sie auf ganze Zeiträume erweitert. Die Kontostände zählen trotzdem ab deinem ersten Tag mit Daten, ein späteresfromsetzt sie also nicht zurück. granularity- Nur für
timeseries.day(Standard),monthoderyear. Das Datum eines Punkts ist der letzte Tag seines Zeitraums. Ein Tag oder Zeitraum ohne Daten hat gar keinen Punkt, rechne also nicht mit Nullen. year- Nur für
tax. Ein Kalenderjahr wie2025. Plattformen ohne Daten in diesem Jahr fehlen in der Antwort.
Jedes Feld jeder Antwort steht im OpenAPI-Dokument. Tools wie Postman oder Swagger UI können es lesen, und Codegeneratoren bauen dir daraus einen Client.
OpenAPI-Dokument öffnenGut zu wissen
Die Regeln, die für jeden Endpoint gelten.
Nur Lesezugriff
Die API liest deine Daten und ändert nichts. Importe und Einstellungen laufen weiter über die App.
So aktuell wie dein letzter Import
P2P Dash holt nichts von den Plattformen ab. Die API liefert, was du importiert oder von Hand eingetragen hast, und lastDate sagt dir den letzten Tag mit Daten.
60 Anfragen, dann eine Minute Pause
Pro Token. Der Zähler beginnt erst wieder bei null, wenn der Token eine volle Minute lang keine Anfrage bekommen hat. Auch ein Skript, das alle paar Sekunden fragt, stößt also an die Grenze. Dann kommt ein 429, und Retry-After sagt dir, wie viele Sekunden du warten sollst. Erfolgreiche Antworten zeigen in X-RateLimit-Remaining, wie viele noch übrig sind.
Beträge in EUR
Geldflüsse wie deposit, withdrawal oder fee sind immer positiv, die Richtung steckt im Namen. Kontostände und netIncome können unter null fallen. XIRR und Cash Drag sind Bruchzahlen (0.075 ist 7,5 %), die Kapitalrückgewinnung läuft von 0 bis 100.
Datumsangaben in UTC
Tage als YYYY-MM-DD, Zeitpunkte als ISO 8601. Ein Tag ist der Tag aus dem Export, ohne dass Zeitzonen ihn verschieben.
Tokens
Bis zu 10 aktive Tokens pro Konto. Als Ablauf wählst du „30 Tage“, „90 Tage“, „1 Jahr“ oder „Nie“. Klickst du auf der Token-Seite auf „Widerrufen“, funktioniert der Token sofort nicht mehr.
Wenn etwas schiefgeht
Fehler kommen als JSON mit einem festen error.code. Prüf den Code, nicht die Meldung: Die Meldung kann sich ändern, die Codes bleiben.
| Status | Code und Bedeutung |
|---|---|
| 400 | invalid_requestEin Parameter stimmt nicht. |
| 401 | unauthorizedDer Token fehlt, ist vertippt, widerrufen oder abgelaufen. |
| 403 | insufficient_scopeDer Token darf diesen Teil der API nicht lesen. |
| 404 | not_foundDen Pfad gibt es nicht, oder die ID gehört zu keiner deiner Plattformen oder Portfolios. |
| 429 | rate_limited60 Anfragen ohne eine Minute Pause. Warte so viele Sekunden, wie |
| 500 | internal_errorUnser Fehler. Versuch es später noch mal, und wenn es dabei bleibt, schreib uns. |
Es gibt noch zwei weitere 403-Codes, forbidden und plan_required. Mit einem normalen Konto begegnen sie dir nicht.
Beispiel: ein Datum, das es nicht gibt
curl "https://app.p2pdash.com/api/v1/account/timeseries?from=2025-02-30" \
-H "Authorization: Bearer $P2PDASH_TOKEN"{
"error": {
"code": "invalid_request",
"message": "Not a valid calendar date",
"details": [
{
"field": "from",
"message": "Not a valid calendar date"
}
]
}
}Fragen zur API
Bevor du die erste Anfrage schickst.
Kostet die API etwas?
Nein. Wie die App ist sie im Moment für jedes Konto kostenlos.
Kann ich Transaktionen über die API importieren?
Noch nicht. Die API liest nur. Deine Exporte lädst du weiter in der App hoch.
Muss ich programmieren können?
Nicht viel. Das Google-Sheets-Beispiel ist Kopieren und Einfügen, und die curl-Anfrage läuft im Terminal unter macOS und Linux. Für alles darüber hinaus hilft ein bisschen Python oder JavaScript.
Was passiert, wenn jemand an meinen Token kommt?
Er kann deine Zahlen in P2P Dash lesen, aber nichts ändern, und deine E-Mail-Adresse oder dein Passwort sieht er nie. Widerruf den Token auf der Token-Seite, dann funktioniert er sofort nicht mehr.
Wird sich die API ändern?
Ja, das kann passieren. Das ist die erste Version, und Felder oder Endpoints können sich noch ohne neue Versionsnummer ändern. Wenn du etwas darauf baust, rechne damit, dass du ab und zu nachbessern musst.
Komme ich an die Daten anderer Nutzer?
Nein. Ein Token liest immer nur die Daten des Kontos, das ihn angelegt hat. Die einzige Ausnahme ist die Liste der Plattformtypen, und die enthält öffentliche Fakten über die Plattformen.
Leg deinen ersten Token an
Log dich ein, öffne „API-Tokens“ im Benutzermenü und schick deine erste Anfrage.
Zu den API-TokensNoch kein Konto? Registrier dich kostenlos und importier zuerst einen Export, sonst hat die API nichts zu zeigen.