Ingest many memories in a single request.

POST /v1/bulk-remember

Ingest many text memories in one round trip. Each item is processed independently and reported with its own status, so a partial failure does not roll back successful items.

For single-item ingest, use POST /v1/remember.

Request

POST /v1/bulk-remember
Content-Type: application/json
Authorization: Bearer <api-key>
{
  "tenant_id": "engineering",
  "memories": [
    { "content": "Standup: completed auth refactor, starting rate limiter." },
    { "content": "Standup: shipped CockroachDB migration; monitoring p99." },
    { "content": "Decision: gRPC for internal APIs, REST for public.",
      "metadata": { "channel": "#decisions" },
      "scope": "decisions" }
  ]
}

| Field | Type | Required | Description | |---|---|---|---| | tenant_id | string | No | Sub-tenant scope for all items | | memories[] | array | Yes | Items to ingest | | memories[].content | string | Yes | Memory content | | memories[].scope | string | No | Per-item scope qualifier | | memories[].metadata | object | No | Per-item string→string metadata | | memories[].event_time | integer | No | Override event time (microseconds since epoch) |

Response

{
  "stored": 3,
  "failed": 0,
  "results": [
    { "event_id": "01912a3b-…-1" },
    { "event_id": "01912a3b-…-2" },
    { "event_id": "01912a3b-…-3" }
  ]
}

Partial failure:

{
  "stored": 2,
  "failed": 1,
  "results": [
    { "event_id": "01912a3b-…-1" },
    { "error":    "content must not be empty" },
    { "event_id": "01912a3b-…-3" }
  ]
}

| Field | Type | Description | |---|---|---| | stored | integer | Count of successfully stored items | | failed | integer | Count of failed items | | results[] | array | Per-item result, parallel to the request array | | results[].event_id | string? | UUID of the stored event (present on success) | | results[].error | string? | Failure message (present on failure) |