API & MCP
Recall provides two ways to integrate with your knowledge base:
- MCP Server — connect AI assistants like Claude, ChatGPT, Cursor, and others using the Model Context Protocol.
- Public API — access your cards and search your knowledge base from your own scripts, automations, or applications.
Both are managed from Settings → API & MCP in the Recall app.
MCP Server
The Recall MCP server lets AI assistants connect to your knowledge base using the Model Context Protocol. Once connected, an assistant can search, read, and write to your cards on your behalf.
Server URL: https://backend.getrecall.ai/mcp/
You can find this URL in Settings → API & MCP under the MCP Server section.
Quick Start
Claude
Click Open next to Claude in the MCP Server settings, or visit claude.ai/integrations/recall directly. Follow the prompts to authorize access.
ChatGPT
Click Open next to ChatGPT in the MCP Server settings, or visit chatgpt.com/g/recall-ai directly.
Other MCP Clients
Point any MCP-compatible client at the server URL above. The client will open a browser window where you sign in to Recall and approve the connection.
Authentication
The MCP server uses an OAuth-based flow. When an MCP client connects for the first time:
- The client redirects you to a Recall authorization page.
- You sign in (or confirm your identity if already signed in).
- You review the requested permissions and click Allow access.
- The client receives a token and can begin making requests.
No API key is needed — authentication is handled entirely through the browser.
Permissions
When connecting, the MCP client will request one or more of these scopes:
| Scope | Description |
|---|---|
kb:read | Read your saved content |
kb:write | Modify your saved content |
Tools
All four tools below require the kb:read scope.
search — Search Knowledge Base
Search your saved content by semantic + keyword matching.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
queries | list[str] | Yes | Search queries. |
mode | "focused" | "exhaustive" | No (default: "focused") | focused: top 5–10 cards with many chunks (best for answering questions). exhaustive: all matching cards (10–25) with 3 preview chunks each (best for listing/discovery). |
card_id | string | No | Search within a specific document only. |
date_from | string | No | Filter from date (ISO format). |
date_to | string | No | Filter to date (ISO format). |
tag_ids | list[str] | No | Tag IDs, OR logic. |
source_url_contains | string | No | Website domain filter. |
get_document_content — Get Document
Retrieve key content from a document as deduplicated chunks. Use after discovering a card via search or filter_by_metadata to read its complete content.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
card_id | string | Yes | Card ID from search/filter results. |
focus_query | string | No | Extract only sections matching this query. |
max_chunks | integer | No (default: 20) | Maximum chunks to return. |
filter_by_metadata — Filter Documents
Filter documents by metadata (date, tags, source URL). No semantic search. Returns previews with id, title, and created_at.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
date_from | string | No | Filter from date (ISO format). |
date_to | string | No | Filter to date (ISO format). |
tag_ids | list[str] | No | Tag IDs, OR logic. |
source_url_contains | string | No | Website domain filter. |
explore_kb — Explore Knowledge Base
Explore knowledge base structure and statistics.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
action | "get_stats" | "list_tags" | "list_sources" | Yes | get_stats: total cards, date range, top tags, connections. list_tags: all tags with usage counts. list_sources: common domains/sources. |
Public API
The Public API lets you programmatically access your knowledge base over HTTP. You can list and filter your cards, retrieve their content, and run semantic searches.
Base URL: https://api.getrecall.ai/api/v1
Generate an API Key
Before you can make API calls, you need to create an API key:
- Open the Recall web app and log in.
- Navigate to Settings → API & MCP and find the API Keys section.
- Click Create key, give it a name, and choose an expiration:
Never,1 year,90 days,30 days, or a Custom date. - Copy the generated key — it starts with
sk_.
You can have up to 10 API keys at a time.
Your API key is only shown once at creation time. Copy it and store it somewhere safe immediately — you won’t be able to see it again. If you lose it, delete the old key and create a new one.
From the same settings page you can also view your active keys and delete any key you no longer need. Deleted keys stop working immediately.
Authentication
Every API request must include your key in the Authorization header:
Authorization: Bearer sk_a1b2c3d4e5f6g7h8i9j0k1l2If your key is missing, invalid, or expired, you’ll receive a 401 Unauthorized response.
Endpoints
List Cards
GET /api/v1/cardsReturns cards matching your filters. When no filters are provided, all cards are returned.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
tags | string[] | No | Filter by tag IDs (UUIDs). Max 50 items. |
date_from | string | No | Start of date range (ISO 8601, e.g. 2025-01-15T00:00:00Z). |
date_to | string | No | End of date range (ISO 8601, e.g. 2025-01-20T00:00:00Z). |
source_url_contains | string | No | Filter cards whose source URL contains this substring. 1-500 characters. |
Response
{
"results": [
{
"id": "card_abc123",
"title": "My Card Title",
"created_at": "Jan 15, 2025",
"image": "https://example.com/image.png",
"source_url": "https://example.com/article"
}
],
"total_count": 1
}image and source_url are omitted when not available.
Get Card
GET /api/v1/cards/{card_id}Returns a single card along with its content chunks.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
card_id | string | Yes | The card ID. 1-128 characters. |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
focus_query | string | No | — | A query to focus which chunks are returned. 1-1000 characters. |
max_chunks | integer | No | 20 | Maximum number of content chunks to return. Range: 1-50. |
If you’re looking for specific information within a large card, pass a focus_query to get the most relevant chunks back instead of a generic selection.
Response
{
"card_id": "card_abc123",
"title": "My Card Title",
"chunks": [
{
"chunk_id": "chunk_001",
"content": "The actual text content of this chunk...",
"source": "page 3",
"timestamps": ["01:23", "04:56"]
}
],
"created_at": "Jan 15, 2025",
"image": "https://example.com/image.png",
"source_url": "https://example.com/article"
}image, source_url, source, and timestamps are omitted when not available.
Search
GET /api/v1/searchPerforms a semantic search across your cards and returns the most relevant content chunks.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
q | string | Yes | — | Your search query. 1-1000 characters. |
mode | string | No | "focused" | "focused" (faster, fewer results) or "exhaustive" (broader coverage). |
card_id | string | No | — | Limit search to a specific card. 1-128 characters. |
tags | string[] | No | — | Filter by tag IDs (UUIDs). Max 50 items. |
date_from | string | No | — | Start of date range (ISO 8601, e.g. 2025-01-15T00:00:00Z). |
date_to | string | No | — | End of date range (ISO 8601, e.g. 2025-01-20T00:00:00Z). |
source_url_contains | string | No | — | Filter by source URL substring. 1-500 characters. |
Response
{
"documents": [
{
"card_id": "card_abc123",
"title": "My Card Title",
"created_at": "Jan 15, 2025",
"image": "https://example.com/image.png",
"source_url": "https://example.com/article",
"chunks": [
{
"chunk_id": "chunk_001",
"content": "Relevant text passage...",
"source": "page 3",
"timestamps": ["01:23"]
}
]
}
],
"total_cards": 1,
"total_chunks": 1
}image, source_url, source, and timestamps are omitted when not available.
Validation Rules
The API validates all inputs at the boundary. If a parameter doesn’t meet the requirements below, you’ll get a 422 response with details about what went wrong.
| Rule | Detail |
|---|---|
| Date format | Must be ISO 8601 (e.g. 2025-01-15T00:00:00Z). Returns 422 if invalid. |
date_from <= date_to | When both are provided, date_from must not be after date_to. |
tags max length | At most 50 tag IDs per request. |
q length | 1-1000 characters. |
source_url_contains length | 1-500 characters. |
focus_query length | 1-1000 characters. |
card_id length | 1-128 characters. |
max_chunks range | Integer between 1 and 50 (default: 20). |
Error Responses
All errors return a JSON body. Validation errors (422) include details about which parameter failed. Server errors (500) and not-found errors (404) include a request_id — share this with support if you need help troubleshooting.
401 Unauthorized
Returned when your API key is missing, invalid, or expired.
{
"detail": {
"message": "Invalid API key"
}
}422 Validation Error
Returned when a parameter doesn’t meet the validation rules.
{
"detail": {
"message": "date_from must be before or equal to date_to"
}
}404 Not Found
Returned when the requested resource doesn’t exist.
{
"detail": {
"message": "The requested resource was not found.",
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}500 Internal Server Error
Returned when something unexpected goes wrong on our end.
{
"detail": {
"message": "An internal error occurred. Contact support with this request ID.",
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}If you receive a 404 or 500 error, note the request_id from the response. Our support team can use it to look up exactly what happened.