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/jsonmit 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
| Scope | Erlaubt |
|---|---|
notes:read | GET /me, GET /notes, GET /notes/find, GET /notes/{id}, GET /action-items, GET /hooks/sample |
notes:write | POST /notes |
hooks | POST /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.
| Situation | Antwort |
|---|---|
| Access token fehlt, ist unbekannt, abgelaufen oder widerrufen | 401 invalid_token, mit WWW-Authenticate: Bearer ... (nie 403) |
| Refresh token unbekannt, abgelaufen, wiederverwendet oder widerrufen | 400 {"error": "invalid_grant"} |
Code unbekannt, verwendet, abgelaufen oder eine andere redirect_uri | 400 {"error": "invalid_grant"} |
| Falsche client id oder falsches client secret am Token-Endpunkt | 401 {"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.
| Feld | Art | Was es ist |
|---|---|---|
id | string | Die ID der Notiz |
title | string | Der Titel der Notiz |
date_iso | string | Wann die Notiz aufgenommen oder erstellt wurde, ISO 8601 in UTC |
duration_min | integer | Länge in Minuten (0 bei einer Notiz, die nicht gesprochen wurde) |
occasion | string | Als was die Notiz aufgeschrieben wurde, zum Beispiel sales_call, standup, minutes, one_on_one |
summary_text | string | Die Zusammenfassung als reiner Text |
summary_html | string | Die Zusammenfassung als einfaches HTML (Absätze, Listen, Fett) |
share_url | string | Link, der die Notiz in Parley Notes öffnet (für ihren Eigentümer) |
participant_emails | string[] | E-Mail-Adressen der eingeladenen Personen, klein geschrieben |
participant_names | string[] | Namen der Personen, die gesprochen haben oder eingeladen waren |
action_items | object[] | Jeweils {text, owner_name, owner_email, due_date}; due_date ist YYYY-MM-DD |
decisions | string[] | Getroffene Entscheidungen |
next_steps | string[] | Zuerst der vereinbarte nächste Schritt (mit seinem Datum, wenn eines genannt wurde), dann die Follow-ups |
participant_emails_text | string | participant_emails verbunden mit , |
participant_names_text | string | participant_names verbunden mit , |
action_items_text | string | Eine Zeile pro Eintrag: - text (owner, email; due YYYY-MM-DD) |
decisions_text | string | Eine Zeile pro Entscheidung, beginnend mit - |
next_steps_text | string | Eine 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:
| Feld | Art | Was es ist |
|---|---|---|
id | string | noteId:itemId, stabil für dieselbe Aufgabe |
text, owner_name, owner_email, due_date | string | Wie im Notiz-Objekt |
priority | string | low, medium, high oder "", wenn das Gespräch nichts dazu sagte |
note_id, note_title, note_date_iso, share_url | string | Die 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.
| Query | Bedeutung |
|---|---|
since | Nur Notizen ab diesem Zeitpunkt: YYYY-MM-DD oder ISO 8601 |
until | Nur Notizen bis zu diesem Zeitpunkt (YYYY-MM-DD bedeutet das Ende dieses Tages) |
occasion | Nur Notizen, die für diesen Anlass aufgeschrieben wurden, zum Beispiel sales_call |
participant_email | Nur Notizen, bei denen diese Adresse eingeladen war |
q | Wörter, die im Titel, in der Zusammenfassung und in den Themen gesucht werden |
limit | 1 bis 100, Standard 25 |
cursor | Der 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.
| Query | Bedeutung |
|---|---|
title | Wörter im Titel (Groß- und Kleinschreibung egal) |
participant_email | Eine Adresse, die eingeladen war |
date | Der 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.
| Feld | Art | Bedeutung |
|---|---|---|
text | string | Ein Transkript, eine E-Mail oder beliebiger Text, bis zu 120.000 Zeichen |
audio_url | string | Ein http- oder https-Link zu einer Audiodatei oder einer Podcast-Folge (Apple Podcasts, Spotify, ein RSS-Feed oder eine Podcast-Seite) |
title | string | Optional. Ohne Titel gibt Parley Notes der Notiz einen Namen |
folder | string | Optional. 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.
| Ablehnung | Antwort |
|---|---|
Beides oder keines von text und audio_url, oder eine ungültige URL | 400 invalid_request |
text über 120.000 Zeichen | 413 too_large |
| Audio in einem kostenlosen Tarif ohne verbleibende kostenlose Importe | 402 plan_required |
| Das tägliche Importlimit des Kontos oder 30 neue Notizen in einer Stunde | 429 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.
| Query | Bedeutung |
|---|---|
since | Nur Einträge aus Notizen ab diesem Zeitpunkt |
owner_email | Nur Einträge, die dieser Adresse gehören |
limit, cursor | Wie 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.
| Ereignis | Wann | Body |
|---|---|---|
note.ready | Die erste Zusammenfassung einer Notiz ist geschrieben (nicht eine spätere erneute Zusammenfassung) | Das Notiz-Objekt |
action_item.created | Im selben Moment, einmal pro offener Aufgabe dieser Notiz | Die 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
POSTmitContent-Type: application/jsonundUser-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-Afterwiederholt. - 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
| Limit | Wert | Bei Überschreitung |
|---|---|---|
| Anfragen pro Verbindung | 120 pro Minute | 429 rate_limited mit Retry-After (Sekunden) |
| Neue Notizen pro Konto | 30 pro Stunde | 429 rate_limited mit Retry-After |
| Audio-Importe | das 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." } }
| Status | code | Bedeutung |
|---|---|---|
| 400 | invalid_request | Ein Parameter fehlt oder ist ungültig; message sagt, welcher |
| 401 | invalid_token | Kein Token, oder es ist unbekannt, abgelaufen oder widerrufen. Erneuere und versuche es noch einmal. Kommt mit WWW-Authenticate |
| 402 | plan_required | Der Tarif des Kontos enthält das nicht |
| 403 | insufficient_scope | Das Token ist gültig, hat aber nicht den Scope bekommen, den dieser Endpunkt braucht. Verbinde dich erneut mit diesem Scope |
| 404 | not_found | Keine solche Notiz oder kein solcher Endpunkt |
| 413 | too_large | Der Text ist zu lang |
| 429 | rate_limited, daily_limit, too_many_hooks | Ein Limit ist erreicht; siehe Retry-After |
| 500 | server_error | Bei 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.