Granite provides an encrypted knowledge base and second brain for teams, offering plain Markdown notes, live co‑editing, SSO, audit logs, and secure AI access via the Model Context Protocol. It supports granular permissions, compliance features, and integrates with Claude, ChatGPT, and other AI assistants, targeting both individuals and enterprises.
Granite publishes 19 API contracts indexed on the APIs.io network, including Auth API, Billing API, Comments API, and 16 more. Tagged areas include Knowledge Base, Artificial Intelligence, Collaboration, Security, and Encryption.
The Granite catalog on APIs.io includes 1 JSON-LD context and 1 Spectral governance ruleset.
Granite’s developer surface includes CLI, changelog, authentication, support, getting-started guide, documentation, pricing, and 22 more developer resources.
Regulatory Posture applies to this provider. Its tags matched the
Horizontal (data, software, accessibility, platform) regime, so
Regulatory Posture carries 15 points of the composite.
If this regime is wrong for your business, say so on your
provider repo — the
applicability map is public and we will correct it.
Create-or-Update Ergonomics could not be measured. We hold no machine-readable contract for
this provider to read, so there is nothing to measure a write surface against. Excluded rather than scored zero:
never-measured and measured-empty are different facts. Publishing an OpenAPI is what makes this facet — and
several others — scorable at all.
The six quality facets above are damped to 85 points between them,
because the conditional facet above carries the other
15. That is why each facet's contribution is shown against a damped
maximum: raising a quality facet moves the composite by 85% of its nominal
weight, not 100%. The full arithmetic is at apis.io/rating/.
Show this score on your site.
It updates itself when the score changes. Paste this where you link to your API docs:
<a href="https://apis.io/providers/granite-md/"><img src="https://apis.io/badge/granite-md/card.svg" alt="Granite on APIs.io — Kin Score by API Evangelist"></a>
Other styles, a README pill and a shields.io endpoint are on the badge page.
Raise your score.
Agent readiness — checks not met, largest first (exact, from this profile):
MCP Server+12 pts — deployment.mode + probe verdict on the mcp/ manifest, not the pointer; an unprobed slug falls back to authorship Ask about this →
Typed Event Surface+6 pts — AsyncAPI document, OR webhooks/callbacks objects in the as-published OpenAPI, OR common[].type includes Webhooks Ask about this →
Pagination+5 pts — share of collection GETs (an array, or one wrapped in data/items/results ...) that declare a page/limit/offset/cursor parameter, a Link header or a next/cursor field; na with no collection GETs Ask about this →
4 more unmet checks in the Agent Readiness table above.
Kin Score — facets with the most composite points still available (weight × headroom):
Each check links to what satisfies it. Publish the artifact, or tell us where it already lives, and the score moves on the next scoring run.
Not sure how this applies to your stack? Ask about any one item. Kin Lane reads every question, looks at your profile and your situation, and replies with what a fix would take — scoped to that one area, priced up front, yours whether you ship it or not. Ask a question →
Standards this provider implements or carries. De facto ones are profiled and measured by the API Commons; formal ones come from the standards directory and are linked by the provider's own tags. The evidence column says how each claim was established — not that it was made.
Plans and payments (PLAN.md 1.2, Phase 7). A person buys Pro, with its first 30 days free once per person; a workspace buys Business per seat (members above Guest, at least 2) a...
Comments on notes, kept outside the Markdown file. A thread's first comment is anchored to a quote of the text with a little context before and after; clients find the quote aga...
Google Drive references (PLAN.md Phase 11). A person connects their Google account (only the files they pick are visible to Granite), picks files, and each becomes a reference i...
Create, rename, move, and delete folders. A folder is a path prefix, there while it holds a file; moving or deleting one changes all its files in one commit.
Retrieval for AI tools (Pro and Business). Granite has no built-in assistant: tools search the knowledge base and get ranked passages with citations, then answer with their own ...
Read and change single notes by their text, for scripts and integrations. Each change is an ordinary commit that synced devices, history, and search see.
The consent page and connected apps of Granite's OAuth 2.1 server. The protocol endpoints themselves (`/.well-known/oauth-authorization-server`, `/oauth/register`, `/oauth/autho...
Signed HTTP callbacks for vault events, and integrations built on them. Granite posts a JSON `WebhookEvent` to your URL within seconds of each change. Integrations connect a ser...
Company workspaces (Business plan): members with roles (owner, admin, member, guest), invitations by email or link, and verified email domains that let colleagues join. Anyone w...
aid: granite-md
name: Granite
accessModel:
pricing: freemium
onboarding: self-serve
trial: false
try_now: true
public: false
gated: none
gated_source:
- onboarding
label: Freemium · Self-serve signup
confidence: medium
source:
- plans
- authentication
- security
generated: '2026-11-13'
method: derived
image: https://granite.md/og.png
description: Granite provides an encrypted knowledge base and second brain for teams, offering plain Markdown notes, live
co‑editing, SSO, audit logs, and secure AI access via the Model Context Protocol. It supports granular permissions, compliance
features, and integrates with Claude, ChatGPT, and other AI assistants, targeting both individuals and enterprises.
url: https://artifacts.apis.io/granite-md/apis.yml
x-type: company
x-source: harvest:mcp-registry
x-tier: profiled
x-tier-reason: enrichment pass 2026-11-10 (modular-v1; was harvest)
specificationVersion: '0.20'
created: '2026-11-10'
modified: '2026-11-10'
tags:
- Knowledge Base
- Artificial Intelligence
- Collaboration
- Security
- Encryption
tags_raw:
- KnowledgeBase
- AI
- Collaboration
- Security
- Encryption
maintainers:
- FN: Kin Lane
email: kin@apievangelist.com
- FN: APIs.json
email: info@apis.io
common:
- type: AgenticAccess
url: agentic-access/granite-md-agentic-access.yml
- type: Plans
url: plans/granite-md-plans-pricing.yml
- type: Spectral
url: rules/granite-md-rules.yml
- type: JSONLD
url: json-ld/granite-md-context.jsonld
- type: Vocabulary
url: vocabulary/granite-md-vocabulary.yml
- type: AgentSkill
url: skills/_index.yml
- type: DataModel
url: data-model/granite-md-data-model.yml
- type: CLI
url: cli/granite-md-cli.yml
- type: ChangeLog
url: changelog/granite-md-changelog.yml
- type: Idempotency
url: conventions/granite-md-conventions.yml
- type: Conventions
url: conventions/granite-md-conventions.yml
- type: Authentication
url: authentication/granite-md-authentication.yml
- type: ErrorCatalog
url: errors/granite-md-problem-types.yml
- type: Conformance
url: conformance/granite-md-conformance.yml
- type: LLMsTxt
url: llms/granite-md-llms.txt
- type: WellKnown
url: well-known/granite-md-well-known.yml
- type: Hosts
url: hosts/granite-md-hosts.yml
- type: Vendors
url: vendors/granite-md-vendors.yml
- type: TermsOfService
url: https://granite.md/terms
- type: Support
url: https://granite.md/help
- type: Security
url: https://granite.md/security
- type: PrivacyPolicy
url: https://granite.md/privacy
- type: ChangeLog
url: https://granite.md/changelog
- type: GettingStarted
url: https://granite.md/help/getting-started
- type: VulnerabilityDisclosure
url: security/granite-md-vulnerability-disclosure.yml
- type: DomainSecurity
url: security/granite-md-domain-security.yml
- type: Website
url: https://granite.md/
- type: Documentation
url: https://docs.granite.md/
- type: Pricing
url: https://granite.md/pricing
apis:
- aid: granite-md:granite-md-auth-api
name: Granite Auth API
description: Sign-up, login, sessions, and password reset.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Authentication
tags_raw:
- auth
properties:
- type: OpenAPI
url: openapi/granite-md-auth-api-openapi.yml
- type: JSONSchema
url: json-schema/granite-md-social-login-request-schema.json
- aid: granite-md:granite-md-billing-api
name: Granite Billing API
description: 'Plans and payments (PLAN.md 1.2, Phase 7). A person buys Pro, with its first 30 days free
once per person; a workspace buys Business per seat (members above Guest, at least 2)
after its 30-day trial. Payments run through
Stripe Checkout and Stripe''s customer portal. A failed payment keeps the plan for 7 days;
after that, or when a subscription ends, the owner is on Free''s limits: nothing is
deleted, but uploads over the quota are refused. Pass `workspace_id` for a workspace''s
billing (its owner and admins only).'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Billing
tags_raw:
- billing
properties:
- type: OpenAPI
url: openapi/granite-md-billing-api-openapi.yml
- type: JSONSchema
url: json-schema/granite-md-billing-status-schema.json
- aid: granite-md:granite-md-comments-api
name: Granite Comments API
description: 'Comments on notes, kept outside the Markdown file. A thread''s first comment is anchored
to a quote of the text with a little context before and after; clients find the quote
again after edits. Mentioned people who can read the note are notified.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Comments
tags_raw:
- comments
properties:
- type: OpenAPI
url: openapi/granite-md-comments-api-openapi.yml
- aid: granite-md:granite-md-drive-api
name: Granite Drive API
description: 'Google Drive references (PLAN.md Phase 11). A person connects their Google account
(only the files they pick are visible to Granite), picks files, and each becomes a
reference in a vault and a Markdown link in a note. Content is fetched from Google
when read, converted in memory, and never stored. Everyone who can read the vault can
read a referenced file through the connection of the person who added it.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Drives
tags_raw:
- drive
properties:
- type: OpenAPI
url: openapi/granite-md-drive-api-openapi.yml
- aid: granite-md:granite-md-folders-api
name: Granite Folders API
description: 'Create, rename, move, and delete folders. A folder is a path prefix, there while it
holds a file; moving or deleting one changes all its files in one commit.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Folders
tags_raw:
- folders
properties:
- type: OpenAPI
url: openapi/granite-md-folders-api-openapi.yml
- aid: granite-md:granite-md-knowledge-base-api
name: Granite knowledge base API
description: 'Retrieval for AI tools (Pro and Business). Granite has no built-in assistant: tools
search the knowledge base and get ranked passages with citations, then answer with
their own model. Only vaults the caller may read are searched.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Knowledge Base
tags_raw:
- knowledge base
properties:
- type: OpenAPI
url: openapi/granite-md-knowledge-base-api-openapi.yml
- aid: granite-md:granite-md-me-api
name: Granite Me API
description: The signed-in user.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Me
tags_raw:
- me
properties:
- type: OpenAPI
url: openapi/granite-md-me-api-openapi.yml
- aid: granite-md:granite-md-meta-api
name: Granite Meta API
description: Service information.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Meta
tags_raw:
- meta
properties:
- type: OpenAPI
url: openapi/granite-md-meta-api-openapi.yml
- aid: granite-md:granite-md-note-shares-api
name: Granite Note Shares API
description: One note shared for editing with someone, by email.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- note-shares
properties:
- type: OpenAPI
url: openapi/granite-md-note-shares-api-openapi.yml
- aid: granite-md:granite-md-notes-api
name: Granite Notes API
description: 'Read and change single notes by their text, for scripts and integrations. Each change
is an ordinary commit that synced devices, history, and search see.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Notes
tags_raw:
- notes
properties:
- type: OpenAPI
url: openapi/granite-md-notes-api-openapi.yml
- aid: granite-md:granite-md-oauth-api
name: Granite OAuth API
description: 'The consent page and connected apps of Granite''s OAuth 2.1 server. The protocol endpoints
themselves (`/.well-known/oauth-authorization-server`, `/oauth/register`,
`/oauth/authorize`, `/oauth/token`, `/oauth/revoke`) follow the OAuth RFCs and are not
part of this API.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- OAuth
tags_raw:
- oauth
properties:
- type: OpenAPI
url: openapi/granite-md-oauth-api-openapi.yml
- aid: granite-md:granite-md-publish-api
name: Granite Publish API
description: Public pages of published notes.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Publish
tags_raw:
- publish
properties:
- type: OpenAPI
url: openapi/granite-md-publish-api-openapi.yml
- aid: granite-md:granite-md-search-api
name: Granite Search API
description: Full-text search over notes.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Search
tags_raw:
- search
properties:
- type: OpenAPI
url: openapi/granite-md-search-api-openapi.yml
- aid: granite-md:granite-md-shopify-api
name: Granite Shopify API
description: Shopify stores connected with the Granite for Shopify app.
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Shopify
tags_raw:
- shopify
properties:
- type: OpenAPI
url: openapi/granite-md-shopify-api-openapi.yml
- aid: granite-md:granite-md-sync-api
name: Granite Sync API
description: The sync protocol (PLAN.md Appendix B).
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Sync
tags_raw:
- sync
properties:
- type: OpenAPI
url: openapi/granite-md-sync-api-openapi.yml
- aid: granite-md:granite-md-templates-api
name: Granite Templates API
description: 'The vault''s note templates (Markdown notes in its templates folder), and notes made
from them.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Templates
tags_raw:
- templates
properties:
- type: OpenAPI
url: openapi/granite-md-templates-api-openapi.yml
- aid: granite-md:granite-md-vaults-api
name: Granite Vaults API
description: Vaults (folders of notes that sync).
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Vault
tags_raw:
- vaults
properties:
- type: OpenAPI
url: openapi/granite-md-vaults-api-openapi.yml
- aid: granite-md:granite-md-webhooks-api
name: Granite Webhooks API
description: "Signed HTTP callbacks for vault events, and integrations built on them. Granite posts a\nJSON `WebhookEvent`\
\ to your URL within seconds of each change.\n\nIntegrations connect a service to one vault so it can act on notes and\
\ folders. Chat\napps (`slack`, `teams`, `mattermost`, `discord`, `telegram`, `rocket_chat`, `zulip`)\ntake commands;\
\ automation tools (`n8n`, `pipedream`, `zapier`, `make`, `ifttt`,\n`activepieces`, `power_automate`, `webhook`) and `shortcuts`\
\ take actions. Automation\ntools can, optionally, start a workflow when a note is added, moved, or deleted\n(`note.created`,\
\ `note.moved`, `note.deleted`): the signed `WebhookEvent` JSON described\nbelow, posted to their `url`. Edits never start\
\ an integration's workflow; only a custom\n`webhook` may subscribe to `note.updated` or `*`. Chat apps get no events.\
\ Which kinds a plan may use, and\nhow many per vault, is in `GET /v1/me/entitlements` (`integrations`,\n`integrations_per_vault`);\
\ custom webhooks need a paid plan. An integration's\naddresses and secrets are stored encrypted and never shown again.\n\
\nCommands and actions go to the integration's `inbound_url`\n(`POST /v1/integrations/{id}/inbound`) and run as the person\
\ who installed it, in its\nvault only, limited to its `actions`. Chat commands: `new <title or path>` (a line break\n\
or ` | ` starts the text), `append <note> | <text>`, `daily <text>`, `search <words>`,\n`list <folder>`, `read <note>`,\
\ `replace <note> | <text>`, `move <note or folder> |\n<new name or path>`, `delete <note>` (a folder with a trailing\
\ `/`), and plain text,\nwhich is captured to `<folder>/Inbox.md`. Each service proves itself its own way:\nSlack's signing\
\ secret, Discord's Ed25519 key, Telegram's secret token (and only the\nconnected chat), Teams' HMAC, or the token of\
\ a Mattermost, Rocket.Chat, or Zulip\nwebhook. Automation tools send JSON with the `action_key` as `Authorization: Bearer\
\ …`\n(or `?key=`): `{\"action\": \"create\", \"title\": \"…\", \"content\": \"…\", \"folder\": \"…\"}`, and\nlikewise\
\ `append`, `daily`, `capture`, `search` (`query`), `list` (`folder`), `read`,\n`update`, `move` (`path` or `folder`,\
\ and `to`), `delete` (`path` or `folder`). A change\nmade this way is not sent back to the same integration as a trigger.\
\ Until its secrets\nare saved (`ready`), an integration answers nothing.\n\nAI meeting notetakers send each finished\
\ meeting to `inbound_url` with their own\nwebhook, and Granite saves it as a note in the integration's `folder` (default\n\
`Meetings`): summary, action items as tasks, attendees, a link to the recording, and the\ntranscript in a folded callout;\
\ YAML frontmatter has `type: meeting`, `source`, `date`,\n`attendees`, and `meeting_id`. The same meeting sent again\
\ replaces its own note.\nRequests are checked with the service's signing secret (`signing_secret`): Read.ai's\n`X-Read-Signature`,\
\ Fathom's and Granola's Standard Webhooks signature (`whsec_…`),\nFireflies' `X-Hub-Signature`, Circleback's `X-Signature`,\
\ Avoma's `X-Avoma-Signature`,\nor MeetGeek's `X-MG-Signature`. tl;dv sends the `action_key` as a header, Otter as\n`?key=`.\
\ Fireflies, Granola, and MeetGeek send only the meeting's ID; Granite fetches it\nwith the API key saved as `inbound_token`.\n\
\nAnswer with any 2xx status within 10 seconds; other answers and timeouts are retried after 1 min, 5 min, 30 min,\n2\
\ h, 6 h, and 24 h, then the delivery is marked failed (`410 Gone` stops retries at\nonce). Every attempt is in the delivery\
\ log and any delivery can be replayed. Delivery\nis at least once: skip event `id`s you have already handled.\n\nEvents:\
\ `note.created`, `note.updated`, `note.moved`, `note.deleted`; `vault.shared`\nand `member.added`/`member.removed`/`member.role_changed`\
\ start with sharing.\nSubscribe with exact names, `note.*`, `member.*`, or `*`.\n\nHeaders: `Granite-Event`, `Granite-Delivery`,\
\ `Granite-Webhook`, and\n`Granite-Signature: t=<unix seconds>,v1=<signature>`, where the signature is the hex\nHMAC-SHA256\
\ of `<t>.<raw body>` keyed with the webhook secret (`whsec_...`). Check it\nagainst the raw body before parsing, and\
\ reject timestamps more than 5 minutes old.\n\nNode.js:\n\n```js\nimport { createHmac, timingSafeEqual } from \"node:crypto\"\
;\n\nfunction verify(secret, header, rawBody) {\n const parts = Object.fromEntries(header.split(\",\").map((p) => p.split(\"\
=\")));\n if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;\n const want = createHmac(\"sha256\"\
, secret).update(`${parts.t}.${rawBody}`).digest(\"hex\");\n return timingSafeEqual(Buffer.from(want), Buffer.from(parts.v1\
\ ?? \"\"));\n}\n```\n\nPython:\n\n```python\nimport hashlib, hmac, time\n\ndef verify(secret: str, header: str, raw_body:\
\ bytes) -> bool:\n parts = dict(p.split(\"=\", 1) for p in header.split(\",\"))\n if abs(time.time() - int(parts[\"\
t\"])) > 300:\n return False\n want = hmac.new(secret.encode(), parts[\"t\"].encode() + b\".\" + raw_body, hashlib.sha256).hexdigest()\n\
\ return hmac.compare_digest(want, parts.get(\"v1\", \"\"))\n```\n\nGo:\n\n```go\nfunc verify(secret, header string,\
\ body []byte) bool {\n var t, sig string\n for _, p := range strings.Split(header, \",\") {\n k, v, _ :=\
\ strings.Cut(p, \"=\")\n if k == \"t\" { t = v } else if k == \"v1\" { sig = v }\n }\n ts, err := strconv.ParseInt(t,\
\ 10, 64)\n if err != nil || math.Abs(time.Since(time.Unix(ts, 0)).Seconds()) > 300 {\n return false\n }\n\
\ m := hmac.New(sha256.New, []byte(secret))\n m.Write([]byte(t + \".\"))\n m.Write(body)\n return hmac.Equal([]byte(hex.EncodeToString(m.Sum(nil))),\
\ []byte(sig))\n}\n```"
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Webhook
tags_raw:
- webhooks
properties:
- type: OpenAPI
url: openapi/granite-md-webhooks-api-openapi.yml
- type: JSONSchema
url: json-schema/granite-md-webhook-schema.json
- type: JSONSchema
url: json-schema/granite-md-webhook-create-schema.json
- type: JSONSchema
url: json-schema/granite-md-webhook-update-schema.json
- aid: granite-md:granite-md-workspaces-api
name: Granite Workspaces API
description: 'Company workspaces (Business plan): members with roles (owner, admin, member, guest),
invitations by email or link, and verified email domains that let colleagues join. Anyone
who is not a member gets 404 for everything about a workspace.'
humanURL: https://docs.granite.md/
baseURL: https://api.granite.md
tags:
- Workspace
tags_raw:
- workspaces
properties:
- type: OpenAPI
url: openapi/granite-md-workspaces-api-openapi.yml
- type: JSONSchema
url: json-schema/granite-md-ssoconnection-schema.json
x-enrichment:
date: '2026-11-10'
status: enriched
artifacts_added: 30
pass: modular-v1
engine: identity=local,contract=local,surfaces=local,docs=local,regulatory=local
Granite API — frequently asked questions
Does Granite have an API?
Yes. APIs.io lists 19 APIs from Granite, including Granite Auth API, Granite Billing API and Granite Comments API, and 16 more.
Is there an OpenAPI specification for the Granite API?
Yes. APIs.io indexes 19 OpenAPI specifications for Granite, each linked for download from this page.
How do I authenticate with the Granite API?
Granite documents its authentication (4 schemes). The details are profiled on APIs.io as Granite Authentication.
How much does the Granite API cost?
Granite publishes its prices; its Free plan is $0 free forever as of 2026-11-10. APIs.io lists 3 pricing plans for Granite, with each plan's price, limits and inclusions under Pricing on this page.
Is the Granite API ready for AI agents?
Granite has a Kin Score of 50.2 out of 100 (developing) and an Agent Readiness score of 50.2 (agent-native), scored by API Evangelist on 2026-11-13.
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.