‹ API-Dokumentation
API-Dokumentation · v1

Parley Notes API, Version 1.Notizen lesen, Notizen erstellen und erfahren, wann eine fertig ist.

Mit der Parley Notes API kann eine App, die du verbindest, deine Meeting-Notizen lesen, Notizen aus Text oder Audio erstellen und sofort Bescheid bekommen, wenn eine Notiz fertig ist. Darauf baut die Parley Notes Integration für Zapier auf, und jede bei Parley Notes registrierte App kann sie genauso nutzen.

  • Basis-URL: https://app.parleynotes.com/api/v1
  • Format: JSON rein und raus, UTF-8. Sende Content-Type: application/json mit einem Body.
  • Authentifizierung: OAuth 2.0, Authorization-Code-Grant. Jeder Aufruf trägt Authorization: Bearer <access token>.
  • Gesundheitsnotizen werden nie zurückgegeben. Eine Notiz, die als Gesundheitsgespräch geschrieben wurde (ein Arztbesuch, eine Therapiesitzung, eine Notiz in einem Ordner, der medizinisch ausgewertet wird), wird von keinem Endpunkt aufgelistet, gefunden, gelesen oder an einen Hook gesendet.

1. Authentifizierung

Apps werden von Hand registriert: Parley Notes gibt jeder App eine client id und ein client secret (schreib dem Parley Notes Team, um eine zu registrieren). Für diese API gibt es keine Selbstregistrierung.

Scopes

ScopeErlaubt
notes:readGET /me, GET /notes, GET /notes/find, GET /notes/{id}, GET /action-items, GET /hooks/sample
notes:writePOST /notes
hooksPOST /hooks, DELETE /hooks/{id}

Fordere mehrere Scopes durch Leerzeichen getrennt an (Kommas gehen auch). Wer keinen anfordert, bekommt alle drei.

Schritt 1: die Person zur Autorisierung schicken

GET https://app.parleynotes.com/api/v1/oauth/authorize
    ?client_id=YOUR_CLIENT_ID
    &redirect_uri=https%3A%2F%2Fyour.app%2Foauth%2Fcallback
    &response_type=code
    &scope=notes%3Aread%20notes%3Awrite%20hooks
    &state=YOUR_STATE

Die Person meldet sich bei Parley Notes an (mit ihrer üblichen Anmeldung) und sieht, was deine App anfordert. Wenn sie zustimmt, leitet Parley Notes zu deiner redirect_uri weiter, mit einem Code und deinem state genau so, wie du ihn gesendet hast:

https://your.app/oauth/callback?code=pn_code_...&state=YOUR_STATE

Wenn sie abbricht: ?error=access_denied&error_description=...&state=YOUR_STATE. Die redirect_uri muss eine für deine App registrierte sein. PKCE (code_challenge mit code_challenge_method=S256) wird unterstützt und geprüft, wenn du es sendest.

Schritt 2: den Code eintauschen (innerhalb von 5 Minuten, einmal)

curl -X POST https://app.parleynotes.com/api/v1/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d grant_type=authorization_code \
  -d code=pn_code_... \
  -d redirect_uri=https://your.app/oauth/callback \
  -d client_id=YOUR_CLIENT_ID \
  -d client_secret=YOUR_CLIENT_SECRET

Der Client kann sich statt mit den beiden Body-Feldern auch mit HTTP Basic authentifizieren. JSON-Bodies werden ebenfalls akzeptiert.

{
  "access_token": "pn_at_...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "pn_rt_...",
  "scope": "notes:read notes:write hooks"
}

Schritt 3: die API aufrufen

curl https://app.parleynotes.com/api/v1/me -H "Authorization: Bearer pn_at_..."

Token erneuern

Access tokens gelten eine Stunde. Wenn ein Aufruf mit 401 antwortet, erneuere und versuche es noch einmal:

curl -X POST https://app.parleynotes.com/api/v1/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d grant_type=refresh_token \
  -d refresh_token=pn_rt_... \
  -d client_id=YOUR_CLIENT_ID \
  -d client_secret=YOUR_CLIENT_SECRET

Die Antwort ist ein neues Paar. Refresh tokens rotieren: Behalte das neue refresh token und verwirf das alte. Wer ein altes refresh token mehr als eine Minute nach dem Eintausch noch einmal verwendet, beendet die Verbindung (es wird als gestohlene Kopie behandelt); zwei Erneuerungen, die sich innerhalb dieser Minute überholen, gelingen beide. Ein refresh token, das 90 Tage nicht genutzt wird, läuft ab.

SituationAntwort
Access token fehlt, ist unbekannt, abgelaufen oder widerrufen401 invalid_token, mit WWW-Authenticate: Bearer ... (nie 403)
Refresh token unbekannt, abgelaufen, wiederverwendet oder widerrufen400 {"error": "invalid_grant"}
Code unbekannt, verwendet, abgelaufen oder eine andere redirect_uri400 {"error": "invalid_grant"}
Falsche client id oder falsches client secret am Token-Endpunkt401 {"error": "invalid_client"}

Widerrufen

curl -X POST https://app.parleynotes.com/api/v1/oauth/revoke -d token=pn_rt_...

Antwortet immer mit 200; die Verbindung endet. Die Person kann deine App auch jederzeit in Parley Notes trennen, unter Einstellungen, Verbindungen, Verbundene Apps; ihre Tokens funktionieren sofort nicht mehr und ihre Hooks stoppen.

2. Das Notiz-Objekt

Jede Notiz hat jeden Schlüssel unten in jeder Antwort. Ein leerer Wert ist "" (Text), [] (Liste) oder 0 (Dauer), nie null, damit ein in einem Workflow zugeordnetes Feld nie verschwindet.

FeldArtWas es ist
idstringDie ID der Notiz
titlestringDer Titel der Notiz
date_isostringWann die Notiz aufgenommen oder erstellt wurde, ISO 8601 in UTC
duration_minintegerLänge in Minuten (0 bei einer Notiz, die nicht gesprochen wurde)
occasionstringAls was die Notiz aufgeschrieben wurde, zum Beispiel sales_call, standup, minutes, one_on_one
summary_textstringDie Zusammenfassung als reiner Text
summary_htmlstringDie Zusammenfassung als einfaches HTML (Absätze, Listen, Fett)
share_urlstringLink, der die Notiz in Parley Notes öffnet (für ihren Eigentümer)
participant_emailsstring[]E-Mail-Adressen der eingeladenen Personen, klein geschrieben
participant_namesstring[]Namen der Personen, die gesprochen haben oder eingeladen waren
action_itemsobject[]Jeweils {text, owner_name, owner_email, due_date}; due_date ist YYYY-MM-DD
decisionsstring[]Getroffene Entscheidungen
next_stepsstring[]Zuerst der vereinbarte nächste Schritt (mit seinem Datum, wenn eines genannt wurde), dann die Follow-ups
participant_emails_textstringparticipant_emails verbunden mit ,
participant_names_textstringparticipant_names verbunden mit ,
action_items_textstringEine Zeile pro Eintrag: - text (owner, email; due YYYY-MM-DD)
decisions_textstringEine Zeile pro Entscheidung, beginnend mit -
next_steps_textstringEine Zeile pro nächstem Schritt, beginnend mit -

Die E-Mail eines Verantwortlichen wird nur gefüllt, wenn der Verantwortliche zu jemandem aus der Einladung passte; sie wird nie erraten.

{
  "id": "meet_1761213600000123",
  "title": "Acme renewal call",
  "date_iso": "2026-10-20T14:00:00.000Z",
  "duration_min": 30,
  "occasion": "sales_call",
  "summary_text": "Acme wants to renew for two years. Budget is approved; legal reviews the contract this week.",
  "summary_html": "<p>Acme wants to renew for two years. Budget is approved; legal reviews the contract this week.</p>",
  "share_url": "https://app.parleynotes.com/?note=Xk3pQ9vRt2LmN8wA",
  "participant_emails": ["dana@acme.example", "lee@acme.example"],
  "participant_names": ["Dana Reyes", "Lee Park"],
  "action_items": [
    { "text": "Send the renewal quote", "owner_name": "Bruno", "owner_email": "bruno@parleynotes.com", "due_date": "2026-10-24" },
    { "text": "Share the case study", "owner_name": "Dana Reyes", "owner_email": "dana@acme.example", "due_date": "" }
  ],
  "decisions": ["Renew for two years"],
  "next_steps": ["Quote to Dana (2026-10-24)", "Check in after the legal review"],
  "participant_emails_text": "dana@acme.example, lee@acme.example",
  "participant_names_text": "Dana Reyes, Lee Park",
  "action_items_text": "- Send the renewal quote (Bruno, bruno@parleynotes.com; due 2026-10-24)\n- Share the case study (Dana Reyes, dana@acme.example)",
  "decisions_text": "- Renew for two years",
  "next_steps_text": "- Quote to Dana (2026-10-24)\n- Check in after the legal review"
}

Die Aufgabenzeile

GET /action-items und der Hook action_item.created liefern eine Zeile pro offener Aufgabe:

FeldArtWas es ist
idstringnoteId:itemId, stabil für dieselbe Aufgabe
text, owner_name, owner_email, due_datestringWie im Notiz-Objekt
prioritystringlow, medium, high oder "", wenn das Gespräch nichts dazu sagte
note_id, note_title, note_date_iso, share_urlstringDie Notiz, aus der sie stammt
{
  "id": "meet_1761213600000123:ai_1761213600000_0",
  "text": "Send the renewal quote",
  "owner_name": "Bruno",
  "owner_email": "bruno@parleynotes.com",
  "due_date": "2026-10-24",
  "priority": "high",
  "note_id": "meet_1761213600000123",
  "note_title": "Acme renewal call",
  "note_date_iso": "2026-10-20T14:00:00.000Z",
  "share_url": "https://app.parleynotes.com/?note=Xk3pQ9vRt2LmN8wA"
}

3. Endpunkte

Listen und Suchen decken die 500 neuesten Notizen des Kontos ab. Eine Notiz, die noch geschrieben wird, wird erst zurückgegeben, wenn ihre Zusammenfassung fertig ist.

GET /me

Wem das Token gehört. Scope: beliebig.

curl https://app.parleynotes.com/api/v1/me -H "Authorization: Bearer pn_at_..."
{ "id": "Zr8kq2...", "email": "dana@example.com", "name": "Dana Reyes", "plan": "regular" }

plan ist free, starter, regular oder power.

GET /notes

Die Notizen, neueste zuerst. Scope: notes:read.

QueryBedeutung
sinceNur Notizen ab diesem Zeitpunkt: YYYY-MM-DD oder ISO 8601
untilNur Notizen bis zu diesem Zeitpunkt (YYYY-MM-DD bedeutet das Ende dieses Tages)
occasionNur Notizen, die für diesen Anlass aufgeschrieben wurden, zum Beispiel sales_call
participant_emailNur Notizen, bei denen diese Adresse eingeladen war
qWörter, die im Titel, in der Zusammenfassung und in den Themen gesucht werden
limit1 bis 100, Standard 25
cursorDer next_cursor der vorherigen Seite
curl "https://app.parleynotes.com/api/v1/notes?since=2026-10-01&participant_email=dana@acme.example&limit=10" \
  -H "Authorization: Bearer pn_at_..."
{
  "data": [ { "id": "meet_1761213600000123", "title": "Acme renewal call", "...": "every field of the note object" } ],
  "next_cursor": "MjAyNi0xMC0yMFQxNDowMDowMC4wMDBaAW1lZXRfMTc2MTIxMzYwMDAwMDEyMw"
}

next_cursor ist "" auf der letzten Seite. Cursors sind opak; sende sie unverändert zurück.

GET /notes/find

Finde Notizen nach Titel, E-Mail eines Teilnehmers oder Datum (mindestens eines). Antwortet mit einer Liste, höchstens 10, neueste zuerst, und [], wenn nichts passt. Scope: notes:read.

QueryBedeutung
titleWörter im Titel (Groß- und Kleinschreibung egal)
participant_emailEine Adresse, die eingeladen war
dateDer Tag der Notiz, YYYY-MM-DD
curl "https://app.parleynotes.com/api/v1/notes/find?title=renewal" -H "Authorization: Bearer pn_at_..."
[ { "id": "meet_1761213600000123", "title": "Acme renewal call", "...": "every field of the note object" } ]

GET /notes/{id}

Eine Notiz. Scope: notes:read. 404 not_found bei einer ID, die nicht existiert, nicht zu diesem Konto gehört, noch geschrieben wird oder eine Gesundheitsnotiz ist.

curl https://app.parleynotes.com/api/v1/notes/meet_1761213600000123 -H "Authorization: Bearer pn_at_..."

Antwortet mit dem Notiz-Objekt.

POST /notes

Erstelle eine Notiz aus Text oder aus einem Audio-Link. Scope: notes:write. Sende genau eines von text und audio_url.

FeldArtBedeutung
textstringEin Transkript, eine E-Mail oder beliebiger Text, bis zu 120.000 Zeichen
audio_urlstringEin http- oder https-Link zu einer Audiodatei oder einer Podcast-Folge (Apple Podcasts, Spotify, ein RSS-Feed oder eine Podcast-Seite)
titlestringOptional. Ohne Titel gibt Parley Notes der Notiz einen Namen
folderstringOptional. Der Parley Notes Ordner, in dem sie abgelegt wird
curl -X POST https://app.parleynotes.com/api/v1/notes \
  -H "Authorization: Bearer pn_at_..." \
  -H "Content-Type: application/json" \
  -d '{"text": "Dana: we can sign by Friday if legal agrees.\nBruno: I will send the quote today.", "title": "Call with Acme"}'

Antwortet innerhalb von Sekunden mit 202 Accepted:

{ "id": "meet_1761213600000123", "status": "processing" }

Parley Notes transkribiert dann (bei Audio) und schreibt die Zusammenfassung im Hintergrund, was bei einer langen Aufnahme ein paar Minuten dauern kann. Wenn die Notiz fertig ist, erscheint sie in Parley Notes der Person mit dieser id, und der Hook note.ready wird mit ihr ausgelöst. Importe zählen wie jeder Import in der App gegen die Limits des Kontos: Eine Zusammenfassung nutzt das Kontingent des Tarifs, und ein Audio-Link braucht einen Bezahltarif, sobald die kostenlosen Importe des Kontos aufgebraucht sind.

AblehnungAntwort
Beides oder keines von text und audio_url, oder eine ungültige URL400 invalid_request
text über 120.000 Zeichen413 too_large
Audio in einem kostenlosen Tarif ohne verbleibende kostenlose Importe402 plan_required
Das tägliche Importlimit des Kontos oder 30 neue Notizen in einer Stunde429 daily_limit oder rate_limited, mit Retry-After

Wenn der Import selbst später fehlschlägt (ein nicht erreichbarer Link, keine Sprache), wird keine Notiz erstellt und kein Hook ausgelöst. Wenn die Zusammenfassung fehlschlägt, wird die Notiz mit ihrem Transkript gespeichert und wartet in der App darauf, dass die Person sie zusammenfasst.

GET /action-items

Die offenen Aufgaben über alle Notizen, eine Zeile pro Eintrag, neueste Notiz zuerst. Scope: notes:read.

QueryBedeutung
sinceNur Einträge aus Notizen ab diesem Zeitpunkt
owner_emailNur Einträge, die dieser Adresse gehören
limit, cursorWie bei GET /notes
curl "https://app.parleynotes.com/api/v1/action-items?owner_email=bruno@parleynotes.com" -H "Authorization: Bearer pn_at_..."
{ "data": [ { "id": "meet_1761213600000123:ai_1761213600000_0", "text": "Send the renewal quote", "...": "every field of the action item row" } ], "next_cursor": "" }

4. REST hooks

Statt abzufragen, abonniere eine URL, und Parley Notes sendet per POST dorthin.

EreignisWannBody
note.readyDie erste Zusammenfassung einer Notiz ist geschrieben (nicht eine spätere erneute Zusammenfassung)Das Notiz-Objekt
action_item.createdIm selben Moment, einmal pro offener Aufgabe dieser NotizDie Aufgabenzeile

Abonnieren: POST /hooks

Scope: hooks. target_url muss https auf einem öffentlichen Host sein.

curl -X POST https://app.parleynotes.com/api/v1/hooks \
  -H "Authorization: Bearer pn_at_..." \
  -H "Content-Type: application/json" \
  -d '{"event": "note.ready", "target_url": "https://hooks.example.com/parley"}'

201 Created:

{ "id": "hk_Q2x9...", "event": "note.ready", "target_url": "https://hooks.example.com/parley", "created_at": "2026-10-23T10:00:00.000Z" }

Ein Konto hält höchstens 100 Abonnements.

Abbestellen: DELETE /hooks/{id}

Scope: hooks. Antwortet 200 {"id": "hk_Q2x9...", "deleted": true}, oder "deleted": false, wenn es schon weg war (zweimal abbestellen ist kein Fehler).

Beispieldaten: GET /hooks/sample?event=

Scope: notes:read. Die letzten drei, genau in der Form, die der Hook sendet: Notizen für note.ready, Aufgabenzeilen für action_item.created. Zapier nutzt es, um Beispieldaten zu zeigen, während ein Zap eingerichtet wird.

curl "https://app.parleynotes.com/api/v1/hooks/sample?event=action_item.created" -H "Authorization: Bearer pn_at_..."

Zustellung

  • POST mit Content-Type: application/json und User-Agent: ParleyNotes-Hooks/1; ein Ereignis pro Anfrage.
  • Jedes 2xx bedeutet zugestellt.
  • 410 Gone entfernt das Abonnement; danach wird nichts mehr dorthin gesendet.
  • 429 wird nach seinem Retry-After wiederholt.
  • 5xx, ein Timeout (10 Sekunden) oder ein Netzwerkfehler wird nach 2 Sekunden, 10 Sekunden und 60 Sekunden wiederholt, dann aufgegeben.
  • Jedes andere 4xx wird sofort aufgegeben.
  • Parley Notes sendet nie schneller als 30 Anfragen pro Sekunde oder mehr als 10.000 in fünf Minuten; darüber warten die Zustellungen.
  • Eine Gesundheitsnotiz löst nie einen Hook aus. Wenn die Person deine App trennt, stoppen ihre Abonnements sofort.

5. Rate Limits

LimitWertBei Überschreitung
Anfragen pro Verbindung120 pro Minute429 rate_limited mit Retry-After (Sekunden)
Neue Notizen pro Konto30 pro Stunde429 rate_limited mit Retry-After
Audio-Importedas tägliche Limit des Kontos (geteilt mit der App)429 daily_limit mit Retry-After

Warte die Retry-After Sekunden ab und versuche es dann noch einmal.

6. Fehler

Jeder API-Fehler (außer am OAuth-Token-Endpunkt, der dem eigenen Format von OAuth folgt) sieht so aus:

{ "error": { "code": "not_found", "message": "No note with that id, or it is still being written." } }
StatuscodeBedeutung
400invalid_requestEin Parameter fehlt oder ist ungültig; message sagt, welcher
401invalid_tokenKein Token, oder es ist unbekannt, abgelaufen oder widerrufen. Erneuere und versuche es noch einmal. Kommt mit WWW-Authenticate
402plan_requiredDer Tarif des Kontos enthält das nicht
403insufficient_scopeDas Token ist gültig, hat aber nicht den Scope bekommen, den dieser Endpunkt braucht. Verbinde dich erneut mit diesem Scope
404not_foundKeine solche Notiz oder kein solcher Endpunkt
413too_largeDer Text ist zu lang
429rate_limited, daily_limit, too_many_hooksEin Limit ist erreicht; siehe Retry-After
500server_errorBei uns ist etwas fehlgeschlagen. Versuche es noch einmal

7. Versionierung

Die Version steht im Pfad: /api/v1. Innerhalb von v1 darf Parley Notes Endpunkte, Query-Parameter, Felder in Antworten und Hook-Ereignisse hinzufügen; dein Code sollte ignorieren, was er nicht kennt. Ein Feld zu entfernen oder umzubenennen, seinen Typ zu ändern oder zu ändern, was ein Endpunkt tut, bedeutet eine neue Version (/api/v2), und v1 funktioniert dann noch mindestens 12 Monate nach der Ankündigung von v2 weiter.

Fragen oder eine client id für deine App: Schreib dem Parley Notes Team über die Support-Seite.