‹ API-documentatie
API-documentatie · v1

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/json mee 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

ScopeStaat toe
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}

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.

SituatieAntwoord
Access token ontbreekt, is onbekend, verlopen of ingetrokken401 invalid_token, met WWW-Authenticate: Bearer ... (nooit 403)
Refresh token onbekend, verlopen, hergebruikt of ingetrokken400 {"error": "invalid_grant"}
Code onbekend, gebruikt, verlopen, of een andere redirect_uri400 {"error": "invalid_grant"}
Verkeerde client id of secret bij het token endpoint401 {"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.

VeldTypeWat het is
idstringDe id van de notitie
titlestringDe titel van de notitie
date_isostringWanneer de notitie is opgenomen of gemaakt, ISO 8601 in UTC
duration_minintegerLengte in minuten (0 voor een notitie die niet is ingesproken)
occasionstringAls wat de notitie is uitgewerkt, bijvoorbeeld sales_call, standup, minutes, one_on_one
summary_textstringDe samenvatting, platte tekst
summary_htmlstringDe samenvatting als eenvoudige HTML (alinea's, lijsten, vet)
share_urlstringLink die de notitie opent in Parley Notes (voor de eigenaar)
participant_emailsstring[]E-mailadressen van de uitgenodigde mensen, in kleine letters
participant_namesstring[]Namen van de mensen die spraken of waren uitgenodigd
action_itemsobject[]{text, owner_name, owner_email, due_date} per item; due_date is YYYY-MM-DD
decisionsstring[]Genomen besluiten
next_stepsstring[]Eerst de afgesproken volgende stap (met de datum als die is genoemd), daarna follow-ups
participant_emails_textstringparticipant_emails samengevoegd met ,
participant_names_textstringparticipant_names samengevoegd met ,
action_items_textstringEén regel per item: - text (owner, email; due YYYY-MM-DD)
decisions_textstringEén regel per besluit, beginnend met -
next_steps_textstringEé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:

VeldTypeWat het is
idstringnoteId:itemId, stabiel voor hetzelfde item
text, owner_name, owner_email, due_datestringZoals in het notitie-object
prioritystringlow, medium, high, of "" als het gesprek dat niet zei
note_id, note_title, note_date_iso, share_urlstringDe 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.

QueryBetekenis
sinceAlleen notities op of na dit tijdstip: YYYY-MM-DD of ISO 8601
untilAlleen notities op of vóór dit tijdstip (YYYY-MM-DD betekent het einde van die dag)
occasionAlleen notities die zijn uitgewerkt als deze gelegenheid, bijvoorbeeld sales_call
participant_emailAlleen notities waarvoor dit adres was uitgenodigd
qWoorden om te zoeken in de titel, samenvatting en onderwerpen
limit1 tot 100, standaard 25
cursorDe 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.

QueryBetekenis
titleWoorden in de titel (hoofdletters maken niet uit)
participant_emailEen adres dat was uitgenodigd
dateDe 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.

VeldTypeBetekenis
textstringEen transcript, een e-mail of een andere tekst, tot 120.000 tekens
audio_urlstringEen http- of https-link naar een audiobestand of een podcastaflevering (Apple Podcasts, Spotify, een RSS-feed of een podcastpagina)
titlestringOptioneel. Zonder titel geeft Parley Notes de notitie een naam
folderstringOptioneel. 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.

WeigeringAntwoord
Beide of geen van text en audio_url, of een ongeldige URL400 invalid_request
text met meer dan 120.000 tekens413 too_large
Audio bij een gratis abonnement zonder resterende gratis imports402 plan_required
De dagelijkse importlimiet van het account, of 30 nieuwe notities in een uur429 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.

QueryBetekenis
sinceAlleen items uit notities op of na dit tijdstip
owner_emailAlleen items die van dit adres zijn
limit, cursorZoals 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.

EventWanneerBody
note.readyDe eerste samenvatting van een notitie is geschreven (niet een latere nieuwe samenvatting)Het notitie-object
action_item.createdOp hetzelfde moment, één keer per open actiepunt van die notitieDe 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

  • POST met Content-Type: application/json en User-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

LimietWaardeDaarboven
Verzoeken per verbinding120 per minuut429 rate_limited met Retry-After (seconden)
Nieuwe notities per account30 per uur429 rate_limited met Retry-After
Audio-importsde 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." } }
StatuscodeBetekenis
400invalid_requestEen parameter ontbreekt of is ongeldig; message zegt welke
401invalid_tokenGeen token, of het is onbekend, verlopen of ingetrokken. Ververs en probeer opnieuw. Komt met WWW-Authenticate
402plan_requiredHet abonnement van het account bevat dit niet
403insufficient_scopeHet token is geldig maar kreeg niet de scope die dit endpoint nodig heeft. Koppel opnieuw met die scope
404not_foundZo'n notitie of zo'n endpoint bestaat niet
413too_largeDe tekst is te lang
429rate_limited, daily_limit, too_many_hooksEen limiet is bereikt; zie Retry-After
500server_errorEr 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.