# Memocore API

The REST API reads and writes the same memory your team uses in ChatGPT, Claude and other AI apps. Give a chatbot your knowledge base, save data from your own app or work with table projects from a script.

Base URL: `https://memocore.ai/api/v1`

Requests and responses are JSON. Send request bodies with `Content-Type: application/json`.

## Authentication

Every request needs a company API key, sent as a Bearer token in the Authorization header.

```
Authorization: Bearer YOUR_KEY
```

API keys come with the Team plan. In your company workspace open Integration, then Catalog, then API key. Choose the projects the key may use and copy the key.

A key sees only the projects you chose for it. Anything outside them answers 404, as if it did not exist.

The key is shown only once, so copy it right away. You can issue as many keys as you need.

## Pricing

The API comes with the Team plan, billed per seat. There is no extra charge per request.

Each key can make up to 100 requests per second.

A new company workspace starts with a 30-day free trial, no card needed. See the Team plan: https://memocore.ai/teams#pricing

## Errors and limits

Errors come back with an HTTP status and a short message that says what to fix.

| Status | Meaning |
| --- | --- |
| 400 | The request is invalid: a missing field, a wrong type or a value out of range. |
| 401 | The API key is missing or not valid. |
| 402 | The team subscription is inactive. Renew it to use API keys. |
| 404 | Not found, or outside the projects the key may use. |
| 409 | A conflict: the key covers several projects and the request needs a project_id, the memo is already archived, or a table row repeats a value in a unique column. In the last case the answer carries the memo_id of the existing row. |
| 429 | More than 100 requests per second with one key. Slow down and try again. |

Memo search, row queries and tag lists take limit (1 to 90, default 30) and skip for paging. The project list comes back whole.

## AI apps (MCP)

Connecting an AI app rather than your own code? Add the MCP endpoint `https://memocore.ai/mcp` to ChatGPT, Claude, Cursor or another app that supports MCP. Setup guides for each app: https://memocore.ai/mcp

## Memos

### Search memos

`GET /memos`

Search the key’s projects by meaning and keywords together. Without a query it lists memos, newest first. Results carry a preview, not the full text: get a memo for its content.

Query parameters:

| Name | Type | Description |
| --- | --- | --- |
| query | string | Text to search for. Up to 400 characters count toward search by meaning. Omit it to list memos. |
| project_id | string | Search only these projects. Repeat the parameter for several. |
| tags | string | Tag ids an item must carry, all of them. Repeat the parameter for several. |
| exclude_tags | string | Tag ids to leave out. An item with any of them is skipped. Repeat the parameter for several. |
| semantic | boolean | Set to false for keyword search only. Search by meaning also falls back to keywords on its own when the monthly search budget is used up. |
| archived | boolean | Set to true to search only archived memos. |
| limit | number | Results per page, 1 to 90. Default 30. |
| skip | number | Results to skip, for paging. |

Request:

```
curl "https://memocore.ai/api/v1/memos?query=refund%20policy&limit=5" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "items": [
    {
      "id": "6a5f648163d783ad68709520",
      "title": "Refund policy",
      "preview": "Refunds are possible within 30 days of purchase.",
      "tags": [{ "id": "6a5f636c63d783ad6870943a", "name": "support" }],
      "project": { "id": "6a5f62c463d783ad68709363", "name": "Help center" },
      "has_files": false,
      "created_at": "2026-10-01T09:30:00.000Z",
      "updated_at": "2026-10-12T14:02:00.000Z"
    }
  ],
  "count": 1
}
```

### Create a memo

`POST /memos`

Save a memo to one of the key’s projects. For a table project, send the row as fields instead of content.

Body:

| Name | Type | Description |
| --- | --- | --- |
| project_id | string | Where to save the memo. Needed when the key covers several projects: without it the answer is 409 with the projects to choose from. |
| content | string | The memo text, up to 100,000 characters. Required unless you send fields. |
| title | string | Title of the memo. |
| preview | string | A short summary shown in search results, up to 200 characters. It stays empty unless you send it. |
| meta | string | Search hints: keywords and questions people may ask. Weighted highest in search and never shown. |
| fields | object | For a table project: the row as column name → value. |
| tags | string[] | Tag ids from the same project. |
| expires_in | string | Archive the memo automatically after this time: 30m, 2h, 3d or 1w, up to 365d. Send none to remove the timer. |
| changes | string | The line written to the memo’s history and the project activity feed. |

Request:

```
curl -X POST "https://memocore.ai/api/v1/memos" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "6a5f62c463d783ad68709363",
    "title": "Refund policy",
    "content": "Refunds are possible within 30 days of purchase.",
    "preview": "Refunds are possible within 30 days of purchase.",
    "changes": "Added the refund policy"
  }'
```

Response:

```json
{
  "id": "6a5f648163d783ad68709520",
  "title": "Refund policy",
  "content": "Refunds are possible within 30 days of purchase.",
  "preview": "Refunds are possible within 30 days of purchase.",
  "tags": [],
  "links": [],
  "linked_by": [],
  "files": [],
  "project": { "id": "6a5f62c463d783ad68709363", "name": "Help center" },
  "created_at": "2026-10-23T10:00:00.000Z",
  "updated_at": "2026-10-23T10:00:00.000Z"
}
```

### Get a memo

`GET /memos/:id`

The full content of one memo, with its tags, links and files.

Path parameters:

| Name | Type | Description |
| --- | --- | --- |
| id | string, required | Memo id. |

Request:

```
curl "https://memocore.ai/api/v1/memos/6a5f648163d783ad68709520" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "id": "6a5f648163d783ad68709520",
  "title": "Refund policy",
  "content": "Refunds are possible within 30 days of purchase.",
  "preview": "Refunds are possible within 30 days of purchase.",
  "tags": [{ "id": "6a5f636c63d783ad6870943a", "name": "support" }],
  "links": [],
  "linked_by": [],
  "files": [],
  "project": { "id": "6a5f62c463d783ad68709363", "name": "Help center" },
  "created_at": "2026-10-01T09:30:00.000Z",
  "updated_at": "2026-10-12T14:02:00.000Z"
}
```

### Update a memo

`PUT /memos/:id`

Change only the fields you send. The edit is recorded in the memo’s history.

Path parameters:

| Name | Type | Description |
| --- | --- | --- |
| id | string, required | Memo id. |

Body:

| Name | Type | Description |
| --- | --- | --- |
| content | string | New memo text. Cannot be empty. |
| title | string | Title of the memo. |
| preview | string | A short summary shown in search results, up to 200 characters. It stays empty unless you send it. |
| meta | string | Search hints: keywords and questions people may ask. Weighted highest in search and never shown. |
| fields | object | For a table project: the row as column name → value. |
| tags | string[] | Tag ids from the same project. |
| expires_in | string | Archive the memo automatically after this time: 30m, 2h, 3d or 1w, up to 365d. Send none to remove the timer. |
| changes | string | The line written to the memo’s history and the project activity feed. |

Request:

```
curl -X PUT "https://memocore.ai/api/v1/memos/6a5f648163d783ad68709520" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Refunds are possible within 45 days of purchase.",
    "changes": "Extended the refund window"
  }'
```

Response:

```json
{
  "id": "6a5f648163d783ad68709520",
  "title": "Refund policy",
  "content": "Refunds are possible within 45 days of purchase.",
  "tags": [{ "id": "6a5f636c63d783ad6870943a", "name": "support" }],
  "links": [],
  "linked_by": [],
  "files": [],
  "project": { "id": "6a5f62c463d783ad68709363", "name": "Help center" },
  "created_at": "2026-10-01T09:30:00.000Z",
  "updated_at": "2026-10-23T10:05:00.000Z"
}
```

### Archive a memo

`DELETE /memos/:id`

Move a memo to the archive. It is erased automatically after 45 days.

Path parameters:

| Name | Type | Description |
| --- | --- | --- |
| id | string, required | Memo id. |

Request:

```
curl -X DELETE "https://memocore.ai/api/v1/memos/6a5f648163d783ad68709520" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "id": "6a5f648163d783ad68709520",
  "status": "archived",
  "purge_after": "2026-12-07T10:10:00.000Z"
}
```

## Projects

### List projects

`GET /projects`

The projects this key may use, with their type: memos or table.

Request:

```
curl "https://memocore.ai/api/v1/projects" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "items": [
    { "id": "6a5f62c463d783ad68709363", "name": "Help center", "description": "Answers for customers", "type": "memos" },
    { "id": "6a6194601cabf000d5fee17c", "name": "Leads", "description": "Sales pipeline", "type": "table" }
  ]
}
```

### Get a project

`GET /projects/:id`

One project. For a table project the response includes its columns.

Path parameters:

| Name | Type | Description |
| --- | --- | --- |
| id | string, required | Project id. |

Request:

```
curl "https://memocore.ai/api/v1/projects/6a6194601cabf000d5fee17c" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "id": "6a6194601cabf000d5fee17c",
  "name": "Leads",
  "description": "Sales pipeline",
  "type": "table",
  "columns": [
    { "id": "6a6194601cabf000d5fee17d", "name": "Status", "description": "", "type": "select", "required": true, "unique": false, "options": ["new", "won", "lost"] },
    { "id": "6a6194601cabf000d5fee17e", "name": "Amount", "description": "Deal size in USD", "type": "number", "required": false, "unique": false, "options": [] }
  ]
}
```

### Query table rows

`POST /projects/:id/rows/query`

Filter, sort and page through the rows of a table project. Send aggregate to get counts and totals instead of rows.

Path parameters:

| Name | Type | Description |
| --- | --- | --- |
| id | string, required | Project id of a table project. |

Body:

| Name | Type | Description |
| --- | --- | --- |
| where | object | Up to 20 conditions in total, joined by mode: and (all must match, the default) or or (any one is enough). A condition is column, op and value; op is =, !=, >, >=, <, <=, in, contains, empty or not_empty. Conditions can be grouped one level deep. |
| sort | object[] | Up to 3 columns, each with order asc or desc. Default: newest first. |
| columns | string[] | Return only these columns in each row. |
| tags | string[] | Tag ids an item must carry, all of them. |
| exclude_tags | string[] | Tag ids to leave out. An item with any of them is skipped. |
| archived | boolean | Set to true to query only archived rows. |
| group_by | object[] | With aggregate: up to 2 columns to group by. A datetime column takes a step: day, week, month or year. |
| aggregate | object[] | Up to 5 of count, sum, avg, min and max. Results are keyed like count or sum_Amount, up to 100 groups. |
| timezone | string | IANA timezone for grouping dates, for example Europe/Berlin. Default UTC. |
| limit | number | Rows per page, 1 to 90. Default 30. |
| skip | number | Results to skip, for paging. |

Request:

```
curl -X POST "https://memocore.ai/api/v1/projects/6a6194601cabf000d5fee17c/rows/query" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "where": { "conditions": [{ "column": "Status", "op": "=", "value": "new" }] },
    "sort": [{ "column": "Amount", "order": "desc" }],
    "limit": 10
  }'
```

Response:

```json
{
  "columns": [ … ],
  "rows": [
    {
      "id": "6ac4bc268fa4c72b3756aef8",
      "title": "Acme Inc.",
      "fields": { "Status": "new", "Amount": 12000 },
      "tags": [],
      "created_at": "2026-10-20T08:15:00.000Z",
      "updated_at": "2026-10-21T11:40:00.000Z"
    }
  ],
  "total": 1
}
```

## Tags

### List tags

`GET /tags`

Search or list the tags in the key’s projects. Use tag ids to filter memos and rows.

Query parameters:

| Name | Type | Description |
| --- | --- | --- |
| query | string | Text to look for in tag names. Omit it to list tags. |
| limit | number | Results per page, 1 to 90. Default 30. |
| skip | number | Results to skip, for paging. |

Request:

```
curl "https://memocore.ai/api/v1/tags?query=support" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response:

```json
{
  "items": [
    {
      "id": "6a5f636c63d783ad6870943a",
      "name": "support",
      "context": "Customer questions and answers",
      "project_id": "6a5f62c463d783ad68709363",
      "created_at": "2026-09-14T12:00:00.000Z",
      "updated_at": "2026-09-14T12:00:00.000Z"
    }
  ]
}
```