← Back to Skills Marketplace
gtkumar777

Granola Meeting Notes API

by gtkumar777 · GitHub ↗ · v1.0.3 · MIT-0
cross-platform ✓ Security Clean
122
Downloads
0
Stars
0
Active Installs
4
Versions
Install in OpenClaw
/install granola-direct-api
Description
Access Granola meeting notes, summaries, transcripts, and attendees via the official Granola public REST API (public-api.granola.ai/v1). Use this skill when...
README (SKILL.md)

Granola Meeting Notes API

Read-only access to meeting notes, summaries, transcripts, and attendee info from the official Granola REST API. See README.md for setup and API key configuration.

Security and Data Handling

This skill is read-only — it cannot create, edit, or delete any data in Granola.

Network access: HTTPS requests only to public-api.granola.ai. No other domains are contacted.

Credential handling: API key read from GRANOLA_API_KEY environment variable, passed only in the HTTP Authorization header. The skill itself does not write the key to disk at runtime. Credentials are handled securely via standard OpenClaw environment variables, and users should follow established best practices for secret management on their host environment.

No external code execution: Uses only curl and jq. No downloads, no scripts, no binaries.

Authentication

-H "Authorization: Bearer $GRANOLA_API_KEY"

If the user gets a 401 error, the key is missing or invalid. Direct them to README.md for setup instructions.

Base URL

https://public-api.granola.ai/v1

Rate Limits

Burst: 25 requests per 5 seconds. Sustained: 5 req/sec (300/min). On 429, back off a few seconds and retry.

Important Behaviors

  • Only notes with a completed AI summary and transcript are returned. Notes still processing or never summarized are excluded (List omits them; Get returns 404).
  • Note IDs follow the pattern not_[a-zA-Z0-9]{14} (e.g., not_1d3tmYTlCICgjy).

Endpoints

1. List Notes

GET /v1/notes

Query parameters:

Parameter Type Default Description
page_size integer (1–30) 10 Max notes per page
created_after ISO 8601 date/datetime Notes created after this date
created_before ISO 8601 date/datetime Notes created before this date
updated_after ISO 8601 date/datetime Notes updated after this date
cursor string Pagination cursor from previous response

Example:

curl -s "https://public-api.granola.ai/v1/notes?page_size=20&created_after=$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq .

On macOS, replace -d '7 days ago' with -v-7d.

Response:

{
  "notes": [
    {
      "id": "not_1d3tmYTlCICgjy",
      "object": "note",
      "title": "Weekly sync with engineering",
      "owner": { "name": "Jane Smith", "email": "[email protected]" },
      "created_at": "2026-04-14T15:30:00Z",
      "updated_at": "2026-04-14T16:45:00Z"
    }
  ],
  "hasMore": true,
  "cursor": "eyJjcmVkZW50aWFsfQ=="
}

When hasMore is true, pass the cursor value to fetch the next page.


2. Get a Single Note

GET /v1/notes/{note_id}

Path parameter: note_id (required, pattern: not_[a-zA-Z0-9]{14})

Query parameter:

Parameter Type Description
include "transcript" Include the full transcript in response

Example:

curl -s "https://public-api.granola.ai/v1/notes/not_1d3tmYTlCICgjy?include=transcript" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq .

Response:

{
  "id": "not_1d3tmYTlCICgjy",
  "object": "note",
  "title": "Weekly sync with engineering",
  "owner": { "name": "Jane Smith", "email": "[email protected]" },
  "created_at": "2026-04-14T15:30:00Z",
  "updated_at": "2026-04-14T16:45:00Z",
  "calendar_event": {
    "event_title": "Weekly sync with engineering",
    "invitees": [{ "email": "[email protected]" }],
    "organiser": "[email protected]",
    "scheduled_start_time": "2026-04-14T15:30:00Z",
    "scheduled_end_time": "2026-04-14T16:30:00Z"
  },
  "attendees": [
    { "name": "Jane Smith", "email": "[email protected]" },
    { "name": "Bob Chen", "email": "[email protected]" }
  ],
  "folder_membership": [
    { "id": "fol_4y6LduVdwSKC27", "object": "folder", "name": "Engineering" }
  ],
  "summary_text": "Discussed sprint progress and blockers. Decided to push the release to next week.",
  "summary_markdown": "## Weekly Sync\
\
- Sprint progress reviewed\
- Release pushed to next week",
  "transcript": [
    {
      "speaker": { "source": "microphone" },
      "text": "Let's start with the sprint update.",
      "start_time": "2026-04-14T15:30:12Z",
      "end_time": "2026-04-14T15:30:18Z"
    },
    {
      "speaker": { "source": "speaker" },
      "text": "We're about two days behind on the auth module.",
      "start_time": "2026-04-14T15:30:20Z",
      "end_time": "2026-04-14T15:30:28Z"
    }
  ]
}

Key response fields:

Field Description
summary_text Plain-text AI summary
summary_markdown Markdown-formatted AI summary (may be null)
attendees Array of { name, email } for meeting participants
calendar_event Calendar metadata: title, invitees, organiser, scheduled times
folder_membership Folders the note belongs to
transcript Speaker segments with text, start_time, end_time

Transcript speaker sources: "microphone" = local user, "speaker" = other participants via meeting audio.


Error Handling

Status Meaning Action
401 Invalid or missing API key Check GRANOLA_API_KEY is set and valid
404 Note not found Note may still be processing, or ID is wrong
429 Rate limit exceeded Wait a few seconds and retry
500 Server error Retry after a brief delay

Workflow Recipes

Find meetings from the last N days

DAYS=7
curl -s "https://public-api.granola.ai/v1/notes?page_size=30&created_after=$(date -u -d "${DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ)" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq '.notes[] | {id, title, created_at}'

Find meetings with a specific person

NOTE_IDS=$(curl -s "https://public-api.granola.ai/v1/notes?page_size=30&created_after=$(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ)" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq -r '.notes[].id')

for ID in $NOTE_IDS; do
  RESULT=$(curl -s "https://public-api.granola.ai/v1/notes/$ID" \
    -H "Authorization: Bearer $GRANOLA_API_KEY")
  if echo "$RESULT" | jq -e '.attendees[]? | select(.name // "" | test("Bob"; "i"))' > /dev/null 2>&1; then
    echo "$RESULT" | jq '{id, title, created_at, attendees: [.attendees[].name]}'
  fi
done

Get the AI summary

curl -s "https://public-api.granola.ai/v1/notes/not_XXXXXXXXXXXXXX" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq '.summary_markdown // .summary_text'

Get full transcript

Only request when the user needs verbatim content — transcripts are large.

curl -s "https://public-api.granola.ai/v1/notes/not_XXXXXXXXXXXXXX?include=transcript" \
  -H "Authorization: Bearer $GRANOLA_API_KEY" | jq '.transcript[] | "\(.speaker.source): \(.text)"'

Tips

  • Use summary_text / summary_markdown for overviews. Only use include=transcript when the user needs the full conversation.
  • The API has no search endpoint. To find meetings by topic, list recent notes and scan titles/summaries client-side.
Usage Guidance
This skill appears to do exactly what it claims: read-only access to Granola via the public API using an API key. Before installing, confirm you trust Granola and the environment where you store the key. Prefer a personal key with least privilege (not a broad workspace admin key) if possible, and store it using your platform's secret storage (OpenClaw config or environment) rather than committing it to files. You can verify behavior by checking network logs to confirm calls go only to public-api.granola.ai and by testing with a low-privilege key. Because this is an instruction-only skill with no downloads and no extra credentials, the risk is limited to what Granola’s API key provides (read access to notes/transcripts).
Capability Analysis
Type: OpenClaw Skill Name: granola-direct-api Version: 1.0.3 The skill provides a legitimate interface to the official Granola REST API (public-api.granola.ai) using standard system utilities like curl and jq. It follows security best practices by utilizing environment variables for authentication (GRANOLA_API_KEY), restricting network access to the official API domain, and explicitly defining a read-only scope. No evidence of malicious intent, unauthorized data exfiltration, or prompt-injection attacks was found in SKILL.md or README.md.
Capability Tags
requires-oauth-tokenrequires-sensitive-credentials
Capability Assessment
Purpose & Capability
Name/description, required binaries (curl, jq), and the declared primaryEnv (GRANOLA_API_KEY) all align with a read-only REST-API integration for meeting notes. Nothing requested appears unrelated to the stated purpose.
Instruction Scope
SKILL.md limits network calls to https://public-api.granola.ai, uses only curl/jq, and documents the Authorization header. Instructions do not ask the agent to read unrelated files or other environment variables. Setup steps reference OpenClaw config commands to store the API key, which is consistent with integration setup.
Install Mechanism
This is instruction-only with no install spec or downloads; no code is written to disk by the skill itself. Risk from installation artifacts is minimal.
Credentials
Only a single credential is declared (GRANOLA_API_KEY) and its use is justified by the API calls. The README and SKILL.md warn not to commit keys and show how to map the key into OpenClaw config; no unrelated secrets are requested.
Persistence & Privilege
always:false and no special privileges requested. It instructs the user to add the API key to OpenClaw configuration (expected for API-based skills) and to restart the gateway; it does not modify other skills or request system-wide credentials.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install granola-direct-api
  3. After installation, invoke the skill by name or use /granola-direct-api
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.3
Added explicit binary requirements (curl/jq), OS-agnostic setup instructions, and two-stage CLI verification for better reliability.
v1.0.2
Security alignment: Added explicit binary metadata and unified env-var persistence documentation.
v1.0.1
Security alignment: Corrected metadata declarations for env vars and updated security documentation to reflect standard environment variable persistence.
v1.0.0
Initial release: Uses direct REST endpoints for structured data. Optimized for VPS and headless environments. Bypasses MCP limitations.
Metadata
Slug granola-direct-api
Version 1.0.3
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 4
Frequently Asked Questions

What is Granola Meeting Notes API?

Access Granola meeting notes, summaries, transcripts, and attendees via the official Granola public REST API (public-api.granola.ai/v1). Use this skill when... It is an AI Agent Skill for Claude Code / OpenClaw, with 122 downloads so far.

How do I install Granola Meeting Notes API?

Run "/install granola-direct-api" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Granola Meeting Notes API free?

Yes, Granola Meeting Notes API is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Granola Meeting Notes API support?

Granola Meeting Notes API is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Granola Meeting Notes API?

It is built and maintained by gtkumar777 (@gtkumar777); the current version is v1.0.3.

💬 Comments