Parley Notes API, versie 1.Lees notities, maak notities en hoor wanneer er een klaar is.
De Parley Notes API laat een app die je koppelt je vergadernotities lezen, notities maken van tekst of audio en melden zodra een notitie klaar is. Het is waar de Parley Notes-integratie voor Zapier op is gebouwd, en elke app die bij Parley Notes is geregistreerd kan het op dezelfde manier gebruiken.
- Basis-URL:
https://app.parleynotes.com/api/v1 - Formaat: JSON in en uit, UTF-8. Stuur
Content-Type: application/jsonmee met een body. - Authenticatie: OAuth 2.0, authorization code grant. Elke aanroep bevat
Authorization: Bearer <access token>. - Gezondheidsnotities worden nooit teruggegeven. Een notitie die als gezondheidsgesprek is uitgewerkt (een doktersbezoek, een therapiesessie, een notitie in een map die als medisch wordt geanalyseerd) wordt door geen enkel endpoint getoond, gevonden, gelezen of naar een hook gestuurd.
1. Authenticatie
Apps worden handmatig geregistreerd: Parley Notes geeft elke app een client id en een client secret (schrijf naar het Parley Notes-team om er een te registreren). Voor deze API is er geen zelfregistratie.
Scopes
| Scope | Staat toe |
|---|---|
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} |
Vraag meerdere scopes aan, gescheiden door spaties (komma's werken ook). Geen scope opgeven geeft alle drie.
Stap 1: stuur de persoon om toestemming te geven
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
De persoon logt in bij Parley Notes (met de gebruikelijke manier van inloggen) en ziet waar je app om vraagt. Als die toestemming geeft, stuurt Parley Notes door naar je redirect_uri met een code en je state precies zoals je die hebt gestuurd:
https://your.app/oauth/callback?code=pn_code_...&state=YOUR_STATE
Bij annuleren: ?error=access_denied&error_description=...&state=YOUR_STATE. De redirect_uri moet er een zijn die voor je app is geregistreerd. PKCE (code_challenge met code_challenge_method=S256) wordt ondersteund en gecontroleerd als je het meestuurt.
Stap 2: wissel de code in (binnen 5 minuten, één keer)
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
De client mag zich authenticeren met HTTP Basic in plaats van de twee body-velden. JSON-bodies worden ook geaccepteerd.
{
"access_token": "pn_at_...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "pn_rt_...",
"scope": "notes:read notes:write hooks"
}
Stap 3: roep de API aan
curl https://app.parleynotes.com/api/v1/me -H "Authorization: Bearer pn_at_..."
Verversen
Access tokens zijn één uur geldig. Als een aanroep 401 antwoordt, ververs dan en probeer het opnieuw:
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
Het antwoord is een nieuw paar. Refresh tokens roteren: bewaar het nieuwe refresh token en gooi het oude weg. Een oud refresh token hergebruiken meer dan een minuut nadat het is ingewisseld, beëindigt de verbinding (het wordt behandeld als een gestolen kopie); twee refreshes die binnen die minuut tegelijk plaatsvinden, lukken allebei. Een refresh token dat 90 dagen niet is gebruikt, verloopt.
| Situatie | Antwoord |
|---|---|
| Access token ontbreekt, is onbekend, verlopen of ingetrokken | 401 invalid_token, met WWW-Authenticate: Bearer ... (nooit 403) |
| Refresh token onbekend, verlopen, hergebruikt of ingetrokken | 400 {"error": "invalid_grant"} |
Code onbekend, gebruikt, verlopen, of een andere redirect_uri | 400 {"error": "invalid_grant"} |
| Verkeerde client id of secret bij het token endpoint | 401 {"error": "invalid_client"} |
Intrekken
curl -X POST https://app.parleynotes.com/api/v1/oauth/revoke -d token=pn_rt_...
Antwoordt altijd met 200; de verbinding eindigt. De persoon kan je app ook op elk moment loskoppelen in Parley Notes, onder Instellingen, Verbindingen, Verbonden apps; de tokens werken dan meteen niet meer en de hooks stoppen.
2. Het notitie-object
Elke notitie heeft elke onderstaande sleutel in elk antwoord. Een lege waarde is "" (tekst), [] (lijst) of 0 (duur), nooit null, zodat een veld dat in een workflow is gekoppeld nooit verdwijnt.
| Veld | Type | Wat het is |
|---|---|---|
id | string | De id van de notitie |
title | string | De titel van de notitie |
date_iso | string | Wanneer de notitie is opgenomen of gemaakt, ISO 8601 in UTC |
duration_min | integer | Lengte in minuten (0 voor een notitie die niet is ingesproken) |
occasion | string | Als wat de notitie is uitgewerkt, bijvoorbeeld sales_call, standup, minutes, one_on_one |
summary_text | string | De samenvatting, platte tekst |
summary_html | string | De samenvatting als eenvoudige HTML (alinea's, lijsten, vet) |
share_url | string | Link die de notitie opent in Parley Notes (voor de eigenaar) |
participant_emails | string[] | E-mailadressen van de uitgenodigde mensen, in kleine letters |
participant_names | string[] | Namen van de mensen die spraken of waren uitgenodigd |
action_items | object[] | {text, owner_name, owner_email, due_date} per item; due_date is YYYY-MM-DD |
decisions | string[] | Genomen besluiten |
next_steps | string[] | Eerst de afgesproken volgende stap (met de datum als die is genoemd), daarna follow-ups |
participant_emails_text | string | participant_emails samengevoegd met , |
participant_names_text | string | participant_names samengevoegd met , |
action_items_text | string | Eén regel per item: - text (owner, email; due YYYY-MM-DD) |
decisions_text | string | Eén regel per besluit, beginnend met - |
next_steps_text | string | Eén regel per volgende stap, beginnend met - |
Het e-mailadres van een eigenaar wordt alleen ingevuld als de eigenaar overeenkomt met iemand op de uitnodiging; het wordt nooit geraden.
{
"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"
}
De actiepuntrij
GET /action-items en de hook action_item.created geven één rij per open actiepunt:
| Veld | Type | Wat het is |
|---|---|---|
id | string | noteId:itemId, stabiel voor hetzelfde item |
text, owner_name, owner_email, due_date | string | Zoals in het notitie-object |
priority | string | low, medium, high, of "" als het gesprek dat niet zei |
note_id, note_title, note_date_iso, share_url | string | De notitie waar het vandaan komt |
{
"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. Endpoints
Lijsten en zoekopdrachten bestrijken de 500 nieuwste notities van het account. Een notitie die nog wordt geschreven, wordt pas teruggegeven als de samenvatting klaar is.
GET /me
Van wie het token is. Scope: elke.
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 is free, starter, regular of power.
GET /notes
De notities, nieuwste eerst. Scope: notes:read.
| Query | Betekenis |
|---|---|
since | Alleen notities op of na dit tijdstip: YYYY-MM-DD of ISO 8601 |
until | Alleen notities op of vóór dit tijdstip (YYYY-MM-DD betekent het einde van die dag) |
occasion | Alleen notities die zijn uitgewerkt als deze gelegenheid, bijvoorbeeld sales_call |
participant_email | Alleen notities waarvoor dit adres was uitgenodigd |
q | Woorden om te zoeken in de titel, samenvatting en onderwerpen |
limit | 1 tot 100, standaard 25 |
cursor | De next_cursor van de vorige pagina |
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 is "" op de laatste pagina. Cursors zijn ondoorzichtig; stuur ze ongewijzigd terug.
GET /notes/find
Zoek notities op titel, e-mailadres van een deelnemer of datum (minstens één). Antwoordt met een lijst, maximaal 10, nieuwste eerst, en [] als er niets overeenkomt. Scope: notes:read.
| Query | Betekenis |
|---|---|
title | Woorden in de titel (hoofdletters maken niet uit) |
participant_email | Een adres dat was uitgenodigd |
date | De dag van de notitie, 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}
Eén notitie. Scope: notes:read. 404 not_found voor een id dat niet bestaat, niet van dit account is, nog wordt geschreven of een gezondheidsnotitie is.
curl https://app.parleynotes.com/api/v1/notes/meet_1761213600000123 -H "Authorization: Bearer pn_at_..."
Antwoordt met het notitie-object.
POST /notes
Maak een notitie van tekst of van een audiolink. Scope: notes:write. Stuur precies één van text en audio_url.
| Veld | Type | Betekenis |
|---|---|---|
text | string | Een transcript, een e-mail of een andere tekst, tot 120.000 tekens |
audio_url | string | Een http- of https-link naar een audiobestand of een podcastaflevering (Apple Podcasts, Spotify, een RSS-feed of een podcastpagina) |
title | string | Optioneel. Zonder titel geeft Parley Notes de notitie een naam |
folder | string | Optioneel. De Parley Notes-map waarin de notitie wordt opgeslagen |
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"}'
Antwoordt binnen enkele seconden met 202 Accepted:
{ "id": "meet_1761213600000123", "status": "processing" }
Parley Notes transcribeert daarna (bij audio) en schrijft op de achtergrond de samenvatting, wat bij een lange opname een paar minuten kan duren. Als de notitie klaar is, verschijnt hij in Parley Notes van de persoon met deze id, en de hook note.ready wordt ermee afgevuurd. Imports tellen mee voor de limieten van het account, net als elke import in de app: een samenvatting gebruikt de ruimte van het abonnement, en voor een audiolink is een betaald abonnement nodig zodra de gratis imports van het account op zijn.
| Weigering | Antwoord |
|---|---|
Beide of geen van text en audio_url, of een ongeldige URL | 400 invalid_request |
text met meer dan 120.000 tekens | 413 too_large |
| Audio bij een gratis abonnement zonder resterende gratis imports | 402 plan_required |
| De dagelijkse importlimiet van het account, of 30 nieuwe notities in een uur | 429 daily_limit of rate_limited, met Retry-After |
Als de import zelf later mislukt (een onbereikbare link, geen spraak), wordt er geen notitie gemaakt en gaat er geen hook af. Als de samenvatting mislukt, wordt de notitie opgeslagen met het transcript en wacht hij in de app tot de persoon hem laat samenvatten.
GET /action-items
De open actiepunten uit alle notities, één rij per item, nieuwste notitie eerst. Scope: notes:read.
| Query | Betekenis |
|---|---|
since | Alleen items uit notities op of na dit tijdstip |
owner_email | Alleen items die van dit adres zijn |
limit, cursor | Zoals bij 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
In plaats van te pollen, abonneer je een URL en Parley Notes stuurt er een POST naartoe.
| Event | Wanneer | Body |
|---|---|---|
note.ready | De eerste samenvatting van een notitie is geschreven (niet een latere nieuwe samenvatting) | Het notitie-object |
action_item.created | Op hetzelfde moment, één keer per open actiepunt van die notitie | De actiepuntrij |
Abonneren: POST /hooks
Scope: hooks. target_url moet https zijn op een openbare host.
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" }
Een account heeft maximaal 100 abonnementen.
Afmelden: DELETE /hooks/{id}
Scope: hooks. Antwoordt 200 {"id": "hk_Q2x9...", "deleted": true}, of "deleted": false als hij al weg was (twee keer afmelden is geen fout).
Voorbeelddata: GET /hooks/sample?event=
Scope: notes:read. De laatste drie, precies in de vorm die de hook stuurt: notities voor note.ready, actiepuntrijen voor action_item.created. Zapier gebruikt het om voorbeelddata te tonen terwijl een Zap wordt ingesteld.
curl "https://app.parleynotes.com/api/v1/hooks/sample?event=action_item.created" -H "Authorization: Bearer pn_at_..."
Bezorging
POSTmetContent-Type: application/jsonenUser-Agent: ParleyNotes-Hooks/1; één event per verzoek.- Elke 2xx betekent bezorgd.
- 410 Gone verwijdert het abonnement; er wordt niets meer naartoe gestuurd.
- 429 wordt opnieuw geprobeerd na zijn
Retry-After. - 5xx, een time-out (10 seconden) of een netwerkfout wordt opnieuw geprobeerd na 2 seconden, 10 seconden en 60 seconden, en dan opgegeven.
- Elke andere 4xx wordt meteen opgegeven.
- Parley Notes stuurt nooit sneller dan 30 verzoeken per seconde of meer dan 10.000 in vijf minuten; daarboven wachten bezorgingen.
- Een gezondheidsnotitie laat nooit een hook afgaan. Als de persoon je app loskoppelt, stoppen de abonnementen meteen.
5. Rate limits
| Limiet | Waarde | Daarboven |
|---|---|---|
| Verzoeken per verbinding | 120 per minuut | 429 rate_limited met Retry-After (seconden) |
| Nieuwe notities per account | 30 per uur | 429 rate_limited met Retry-After |
| Audio-imports | de dagelijkse limiet van het account (gedeeld met de app) | 429 daily_limit met Retry-After |
Wacht de Retry-After seconden en probeer het dan opnieuw.
6. Fouten
Elke API-fout (buiten het OAuth token endpoint, dat zijn eigen OAuth-formaat volgt) is:
{ "error": { "code": "not_found", "message": "No note with that id, or it is still being written." } }
| Status | code | Betekenis |
|---|---|---|
| 400 | invalid_request | Een parameter ontbreekt of is ongeldig; message zegt welke |
| 401 | invalid_token | Geen token, of het is onbekend, verlopen of ingetrokken. Ververs en probeer opnieuw. Komt met WWW-Authenticate |
| 402 | plan_required | Het abonnement van het account bevat dit niet |
| 403 | insufficient_scope | Het token is geldig maar kreeg niet de scope die dit endpoint nodig heeft. Koppel opnieuw met die scope |
| 404 | not_found | Zo'n notitie of zo'n endpoint bestaat niet |
| 413 | too_large | De tekst is te lang |
| 429 | rate_limited, daily_limit, too_many_hooks | Een limiet is bereikt; zie Retry-After |
| 500 | server_error | Er ging iets mis aan onze kant. Probeer het opnieuw |
7. Versies
De versie staat in het pad: /api/v1. Binnen v1 mag Parley Notes endpoints, queryparameters, velden in antwoorden en hook-events toevoegen; je code moet negeren wat hij niet kent. Een veld verwijderen of hernoemen, het type wijzigen of veranderen wat een endpoint doet betekent een nieuwe versie (/api/v2), en v1 blijft dan minstens 12 maanden werken nadat v2 is aangekondigd.
Vragen of een client id voor je app: schrijf naar het Parley Notes-team via de supportpagina.