Granola Meeting Notes API

v1.0.3

Access Granola meeting notes, summaries, transcripts, and attendees via the official Granola public REST API (public-api.granola.ai/v1). Use this skill when...

0· 119·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for gtkumar777/granola-direct-api.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Granola Meeting Notes API" (gtkumar777/granola-direct-api) from ClawHub.
Skill page: https://clawhub.ai/gtkumar777/granola-direct-api
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install granola-direct-api

ClawHub CLI

Package manager switcher

npx clawhub@latest install granola-direct-api
Security Scan
Capability signals
Requires OAuth tokenRequires sensitive credentials
These labels describe what authority the skill may exercise. They are separate from suspicious or malicious moderation verdicts.
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
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.
Assessment
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).

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

Primary envGRANOLA_API_KEY
latestvk972pf5neghh7ks7qghtjefyb5858r69
119downloads
0stars
4versions
Updated 6d ago
v1.0.3
MIT-0

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:

ParameterTypeDefaultDescription
page_sizeinteger (1–30)10Max notes per page
created_afterISO 8601 date/datetimeNotes created after this date
created_beforeISO 8601 date/datetimeNotes created before this date
updated_afterISO 8601 date/datetimeNotes updated after this date
cursorstringPagination 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": "jane@example.com" },
      "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:

ParameterTypeDescription
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": "jane@example.com" },
  "created_at": "2026-04-14T15:30:00Z",
  "updated_at": "2026-04-14T16:45:00Z",
  "calendar_event": {
    "event_title": "Weekly sync with engineering",
    "invitees": [{ "email": "bob@example.com" }],
    "organiser": "jane@example.com",
    "scheduled_start_time": "2026-04-14T15:30:00Z",
    "scheduled_end_time": "2026-04-14T16:30:00Z"
  },
  "attendees": [
    { "name": "Jane Smith", "email": "jane@example.com" },
    { "name": "Bob Chen", "email": "bob@example.com" }
  ],
  "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\n\n- Sprint progress reviewed\n- 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:

FieldDescription
summary_textPlain-text AI summary
summary_markdownMarkdown-formatted AI summary (may be null)
attendeesArray of { name, email } for meeting participants
calendar_eventCalendar metadata: title, invitees, organiser, scheduled times
folder_membershipFolders the note belongs to
transcriptSpeaker segments with text, start_time, end_time

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


Error Handling

StatusMeaningAction
401Invalid or missing API keyCheck GRANOLA_API_KEY is set and valid
404Note not foundNote may still be processing, or ID is wrong
429Rate limit exceededWait a few seconds and retry
500Server errorRetry 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.

Comments

Loading comments...