Skip to main content
NotesBot
NotesBot

NotesBot API / v1

Your meeting notes, in your own tools.

Every call NotesBot records for you, over a read-only REST API: the summary, the full transcript, and who was there. One key, plain JSON, two endpoints.

Methods
GET only
Format
JSON over HTTPS
Rate limit
60 req/min
Price
Included
GET/v1/calls?server_id=1187345520913620992
Authorization: Bearer nb_4f9c2e…
Press Run to send the request

Sample data from a demo server. With your key, the same request returns your calls.

The same notes, as data.

Everything in your Discord thread except the audio comes back in the response. Pick a part of the call to see where it lives.

In your Discord thread

product-syncAcme Studio
Aug 24 · 42 min call
Call Meeting Aug 24 - product-sync

NotesBot

📄 Transcript

transcript.txt

NotesBot

👥 Speakers: Maya, Sam, Ravi, Elena

Meeting Notes: Weekly Product Sync

🚀 Release Planning

  • Maya confirmed the v2 dashboard ships Thursday, once the billing fix is merged and tagged.
  • Ravi flagged that the onboarding emails still link to the old help center and need updating first.

🐛 Open Bugs

  • CSV export times out on files over 200 MB. Sam is adding pagination and will post load-test numbers.
  • Two users reported a blank screen on Safari after login. Elena will reproduce it and file a ticket.

+ Next Steps & Responsibilities

From GET /v1/calls/66c9f2…

{"data": {"id": "66c9f2a41e7b3d0012a4e8f1","server_name": "Acme Studio","server_id": "1187345520913620992","channel_name": "product-sync","channel_id": "1187345521458872401","duration": 2520,"participant_count": 4,"created_at": "2026-08-24T16:00:00.000Z","summary": "**Meeting Notes: Weekly Product Sync**\n\n" …+712 chars,"transcript": "Maya: Quick check on v2. Are we still go" …+344 chars,"participants": [{ "display_name": "Maya", "username": "maya.ships" },{ "display_name": "Sam", "username": "samdev" },{ "display_name": "Ravi", "username": "ravi_k" },{ "display_name": "Elena", "username": "elena.qa" }]}}

From key to first request in one paste.

No SDK to install and no OAuth flow. Set one environment variable and run it.

  1. 1

    Sign in with Discord

    Open the dashboard with the account that runs your recordings.

  2. 2

    Generate a key

    One key per account. It is shown once, so store it as NOTESBOT_API_KEY.

  3. 3

    Send a request

    Paste a snippet. Your calls come back as JSON, newest first.

// This week's calls from one serverconst res = await fetch(  "https://api.notesbot.io/v1/calls?server_id=1187345520913620992&from=2026-08-18",  { headers: { Authorization: `Bearer ${process.env.NOTESBOT_API_KEY}` } });const { data } = await res.json(); for (const call of data) {  const minutes = Math.floor(call.duration / 60);  console.log(call.created_at.slice(0, 10), call.channel_name, `${minutes} min`);}

Prints

2026-08-24 product-sync 42 min

2026-08-20 product-sync 28 min

Two endpoints. That is the whole API.

Small on purpose: list your calls, then open the one you want.

GET/v1/calls

Your calls, newest first. With q, ordered by relevance instead.

Query parameters for GET /v1/calls
pagePage number. Default 1.
per_page1 to 100. Default 20.
server_idOnly calls from this Discord server.
channel_idOnly calls from this voice channel.
from, toRecorded on or after / on or before.
qFull-text search across summaries.

Returns data[] and pagination. The summary here is the first 200 characters; open the call for the full text. A call whose processing failed is listed with a null summary.

$ curl "https://api.notesbot.io/v1/calls?q=onboarding"

GET/v1/calls/{id}

One call in full: notes, transcript and speakers.

Fields returned by GET /v1/calls/{id}
summaryThe full notes, as posted in Discord.
transcriptEvery line, labeled with the speaker.
participantsdisplay_name and username for each speaker.
…Plus every field from the list endpoint.

Asking for a call that is not yours returns 404, never 403, so call IDs reveal nothing.

$ curl "https://api.notesbot.io/v1/calls/66c9f2a41e7b3d0012a4e8f1"

What you can wire it into.

NotesBot does not ship these integrations. The API is what turns each one into a short script you own.

  • A weekly digest in Notion

    GET /v1/calls?from=<last monday>summaryone Notion page per week

  • Action items into your tracker

    GET /v1/calls/{id}Next Steps sectionLinear or Jira issues

  • Ask your meetings anything

    transcriptyour embeddings + model“what did we decide on pricing?”

  • A campaign wiki for your table

    ?channel_id=<the tavern>session recapsa page per session

The fine print, up front.

What the API leaves out matters as much as what it returns.

Access
Calls you are the billing owner of: recordings paid from your account. Calls billed to someone else are not included.
Methods
Read-only. Recording stays in Discord, managing calls stays on the dashboard.
Audio
Not available. Summaries, transcripts, participants and call details only.
Rate limit
60 requests per minute per key, the same on every plan. Past it: 429 with Retry-After.
Keys
One per account, shown once. Regenerate or revoke from the dashboard, effective immediately.
Auth
Authorization: Bearer nb_…
Price
Included with every NotesBot account. Requests never use recording hours.

Errors

Every error has the same envelope, so one handler covers them all.

{"error": {"code": "not_found","message": "Call not found","status": 404}}
Error codes
400invalid_requestThe call ID is not a valid ID.
401unauthorizedThe key is missing, malformed, revoked or regenerated.
404not_foundNo call with that ID belongs to you. Never a 403, so IDs do not leak.
429rate_limit_exceededOver 60 requests in a minute. Wait for Retry-After.
500internal_errorSomething broke on our side. Safe to retry.

Questions developers ask

No. The API is included with every NotesBot account, and reading your calls never uses recording hours. The rate limit is the same 60 requests per minute on every plan.

Make your first request.

Sign in with Discord, generate a key, and paste one of the snippets above.