> ## Documentation Index
> Fetch the complete documentation index at: https://developers.reintersect.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Search and memories

> Put your app's objects in Reintersect's search, and save facts to workspace memory credited to your app.

> Reintersect apps are in developer preview. Names and limits can still change before general
> release.

Two endpoints let your app add knowledge to a workspace without waiting for someone to paste a link:

| Endpoint | Scope | What it does |
| - | - | - |
| `PUT /v0/search/objects`, `DELETE /v0/search/objects/:kind/:externalId` | `search:write` | Index your objects so members find them in Reintersect's search (Cmd+K). |
| `POST /v0/memories` | `memories:write` | Save a fact to the workspace's memory, which the Reintersect agent recalls later. |

Both take the install token, like the rest of the API. The SDK client has no methods for them yet,
so call them with `fetch`; declare the scope on any piece so the app asks for it. A self-hosted app
passes the delivery's `installToken` or one minted with its client credentials. On Reintersect hosting, the gateway sets
the token on calls made during a delivery, so leave out `authorization` there.

## Search objects

A search object is one of your objects, such as a task or an incident, made findable in Cmd+K. It
belongs to one of your reference kinds that has a `search` function, so picking a result opens or
references the same URL your patterns match.

```ts theme={null}
await fetch(`${baseUrl}/v0/search/objects`, {
  method: "PUT",
  headers: { authorization: `Bearer ${installToken}`, "content-type": "application/json" },
  body: JSON.stringify({
    kind: "task",
    externalId: "TASK-42",
    title: "Ship the onboarding checklist",
    subtitle: "Website · In progress",
    url: "https://tasks.example.com/tasks/TASK-42",
    body: "Checklist for new workspaces: invite teammates, connect GitHub, post a first decision.",
    updatedAt: "2026-10-05T09:00:00Z",
    visibility: "workspace",
  }),
});
```

| Field | Description |
| - | - |
| `kind` | One of your reference kinds with `search`. An unknown kind is `ReintersectAppReferenceKindUnknownError`; a kind without `search` is `ReintersectAppReferenceKindNotSearchableError`. |
| `externalId` | Your id for the object, 1 to 200 characters. One object per kind and id per install. |
| `title`, `subtitle` | At most 200 characters each. |
| `url` | An `https://` URL. |
| `body` | Optional plain text to search, at most 8,000 characters. |
| `updatedAt` | When the object last changed. An upsert older than the stored one isn't applied. |
| `visibility` | `"workspace"` for every member, or `{ circleIds: [...] }` (1 to 50 circles) for members of those circles. |

The response is the stored object plus `applied: false` when Reintersect kept a newer copy. Delete an
object with `DELETE /v0/search/objects/:kind/:externalId` (`204`).

How results appear:

* Results show in Cmd+K for members who may see them, with your app's name, and open the object's
  URL.
* Objects from a development install are visible only to its developer.
* When the app is uninstalled or suspended, its results disappear at once; Reintersect also reindexes
  live installs every night.
* The Reintersect agent's search doesn't include app objects.

## Memories

A memory is a short fact the Reintersect agent can recall later, such as "The Website project ships
on Thursdays". Your app can write one when something worth remembering happens in your system:

```ts theme={null}
await fetch(`${baseUrl}/v0/memories`, {
  method: "POST",
  headers: { authorization: `Bearer ${installToken}`, "content-type": "application/json" },
  body: JSON.stringify({
    text: "The Website project moved its release day from Tuesday to Thursday.",
    circleId: "team_123",
    source: { url: "https://tasks.example.com/projects/website", title: "Website project" },
  }),
});
```

| Field | Description |
| - | - |
| `text` | The fact, at most 600 characters. |
| `circleId` | Optional. Saves a circle memory; without it, a workspace memory. Must be a circle your app can [reach](/concepts/install-and-consent#reach). |
| `about.memberId` | Optional. The member the fact is about. |
| `source` | Optional `{ url, title }` shown as where the memory came from. |

The endpoint answers `202 Accepted` and Reintersect saves the memory in the background, credited to
your app as its source. A development install stores every memory for its developer only. Each
install can write 60 memories a minute; more fail with `429`. Memories are only saved in workspaces
that have agent memory on.

## Errors

| Error | Status | When |
| - | - | - |
| `ReintersectAppScopeMissingError` | 403 | The install hasn't granted the scope. |
| `ReintersectAppReferenceKindUnknownError` | 422 | The kind isn't one of your app's. |
| `ReintersectAppReferenceKindNotSearchableError` | 422 | The kind has no `search`. |
| `ReintersectAppCircleNotFoundError` | 404 | A `circleId` isn't in the workspace, or, for a memory, is a circle your app can't reach. |
| `ReintersectAppMemberNotFoundError` | 404 | `about.memberId` isn't a member of the workspace. |
| `ReintersectApiRateLimitExceededError` | 429 | Too many memories. |

See the API reference for [search objects](/api-reference/search/upsert-object) and
[memories](/api-reference/memories/create).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.