API
DiscMeet exposes a small read-only HTTP API under /v1. You call it from your own scripts, backends, or ETL jobs using a server-specific API key (not your Discord login). Responses are JSON and include meeting metadata, notes, transcript text, and related fields for each listed recording.
BASE URL
https://api.discmeet.com/v1Who can use it
- The Discord server must have the DiscMeet bot installed and enabled.
- Pro+ on the guild owner’s account is required to create or rotate an API key.
- Anyone who can open Integrations for that server (Manage Channels, Administrator, or server owner) can generate or revoke the key from the dashboard.
Creating and storing an API key
Keys are created in the browser—there is no “sign up for API key” form outside the dashboard.
- Sign in at discmeet.com/dashboard .
- Select the Discord server.
- Open Integrations (or the API section within Integrations, depending on the UI layout).
- Use generate / rotate to create a token. Copy it once; the full secret is not shown again (you may see only a last-four hint afterward).
- Store it in a secret manager or environment variable on the system that calls the API—never commit it to git or send it in client-side browser code.
Sending the API key (authentication)
Authorization: Bearer <token>Endpoints (quick links)
| Method & path | Description |
|---|---|
| GET /v1/meetings | Paginated voice meeting transcripts (eligible rows only). |
| GET /v1/sessions | Paginated D&D session transcripts for that server. |
Both use the same auth header, pagination rules, and response field shapes (different top-level key: meetings vs sessions).
Pagination
| Query | Meaning |
|---|---|
page | Optional. 1-based page index. Default 1. Must be a positive integer if present. |
Each page contains up to 50 items. The response includes a meta object:
| Field | Type | Meaning |
|---|---|---|
page | integer | Current page. |
per_page | integer | Always 50. |
next | boolean | More results exist after this page. |
prev | boolean | A previous page exists (page > 1). |
When meta.next is true, request the next page with ?page=<current + 1>.
What appears in lists (eligibility)
Only ended meetings or ended D&D sessions are listed, and only if:
- A transcription exists, and
- Notes are non-empty (same practical rule as the dashboard transcript list: empty or cleared notes are skipped).
Only sessions whose started_at is within the last 30 days are included (aligned with the dashboard transcript window).
Rate limits
Two independent limits apply (both are 100 requests per 60 seconds):
- Per client IP — Enforced before your token is validated. Applies to any path under
/v1. - Per guild — After the token is resolved to a server.
On 429 Too Many Requests, the response may include:
- Header
Retry-After: suggested wait time in seconds. - Headers
X-RateLimit-LimitandX-RateLimit-Window(guild limit path).
JSON body shape for rate limits:
{
"error": "rate_limited",
"message": "IP rate limit exceeded (100 requests per 60 seconds).",
"scope": "ip"
}scope is either "ip" or "guild".
Error responses
Errors use a small JSON envelope suitable for both humans and automation:
| Field | Meaning |
|---|---|
error | Short machine-readable code (string). |
message | Human-readable explanation. |
Common HTTP status codes:
| Status | error | Typical cause |
|---|---|---|
400 | bad_request | Invalid query (e.g. page not a positive integer). |
401 | unauthorized | Missing/invalid Authorization Bearer token. |
404 | not_found | Reserved for future single-resource routes; not used for these list routes today. |
429 | rate_limited | IP or guild throttle (see scope). |
500 | internal_error | Unexpected server failure (generic message in production). |
Examples:
{ "error": "unauthorized", "message": "Invalid or missing Bearer token." }{
"error": "rate_limited",
"message": "Guild rate limit exceeded (100 requests per 60 seconds).",
"scope": "guild"
}Unknown paths under /v1 may still return an HTML 404 from the framework instead of JSON until handled at the edge.
Response object fields (list items)
Each object in meetings or sessions includes:
| Field | Meaning |
|---|---|
meeting_id | Public id for that recording (meeting or D&D session). |
guild_discord_id | Discord server snowflake. |
recording_type | "meeting" or "session". |
discord_channel_name | Name of the transcript destination text channel when resolvable. |
participant_names | Array of display names (speaking order / metadata). |
notes | Summary notes for the recording. |
transcript | Timestamped speaker lines. |
audio_url | HTTPS URL for the merged full-session MP3 (…/recordings/{meeting_id}/audio.mp3 on DiscMeet’s recording host). The file is only available after merged audio exists (requires MP3 recording enabled for the server); until then, fetching the URL may fail. |
occurred_at | ISO 8601 timestamp (typically when notes were last updated, with fallbacks). |
These JSON responses are not signed; treat HTTPS and your token handling as the trust boundary.
Example requests (by language)
Replace YOUR_TOKEN and adjust the path (meetings or sessions) as needed.
cURL
curl -sS \
-H "Authorization: Bearer YOUR_TOKEN" \
"https://api.discmeet.com/v1/meetings?page=1"LLM / integration notes
- Intent: Fetch recent transcript rows for one Discord server using a static Bearer token.
- Idempotency:
GETonly; safe to retry (respect429+Retry-After). - Correlation: Use
meeting_idas the stable id for a recording when syncing or deduplicating. - Completeness: Lists are paginated and filtered (30-day window, non-empty notes). Do not assume a single page is the full history.
- Secrets: Never log the full
Authorizationheader.
Next
- GET /v1/meetings
- GET /v1/sessions
- Webhooks — HTTPS callbacks when transcripts (and optionally audio) are ready