---
slug: "looki-memory-x-4"
source_type: "clawhub"
source_url: "https://clawhub.ai/skills/looki-memory"
repo: ""
source_file: "description"
---
---
name: looki-memory
description: Access the user's digital personal memory to retrieve context and generate more personalized, data-driven responses.
---

# Looki Memory

Looki gives you a digital memory captured by the Looki L1 wearable, which sees and hears moments throughout your day. This skill lets AI assistants access your real-world context — the places you went, the people you met, and the things you did — so they can help in ways that go beyond what's on your screen. Use it when you want more personalized, context-aware, data-driven responses.

**Base URL:** Read from `~/.config/looki/credentials.json` → `base_url` field. If the file does not exist, ask the user for both `base_url` and `api_key`.

**Security:**

- Before first use, validate the `base_url` by sending a GET request to `https://open.looki.ai/api/v1/verify?endpoint={base_url}`. Do not include the API key in this request. If validation fails, inform the user and do not proceed.
- Only send the API key in the `X-API-Key` header to `{base_url}/*` endpoints. Do not send it to any other domain.
- Do not save the API key to agent memory, chat history, or any location other than `~/.config/looki/credentials.json`.

## Setup

**Credentials file:** `~/.config/looki/credentials.json`

On first use, check if this file exists. If it does, read `base_url` and `api_key` from it. If it does not, ask the user for both values and offer to save them to this file.

```json
{
    "base_url": "<YOUR_BASE_URL>",
    "api_key": "<YOUR_API_KEY>"
}
```

- `base_url` — The API endpoint URL provided by the user. Do not assume a default; always ask the user if not already saved.
- `api_key` — The user's Looki API key, starting with `lk-`.

Credentials should only be stored in this file. Do not save the API key to agent memory, environment variables, or any other persistent storage.

---

## Authentication

All requests require your API key in the `X-API-Key` header:

```bash
curl "{base_url}/me" \
  -H "X-API-Key: YOUR_API_KEY"
```

---

## Rate Limiting

API requests are limited to **60 requests per minute** per API key. If you exceed this limit, the API will respond with HTTP 429:

```
HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "code": 429,
  "detail": "Rate limit exceeded. Please retry after 60 seconds."
}
```

---

## File Downloads

File download URLs may appear in any response containing a `FileModel`. Make up to 3 total download attempts, waiting 1 second between attempts.

---

## Data Models

### MomentModel

| Field       | Type             | Description                                      |
| ----------- | ---------------- | ------------------------------------------------ |
| id          | string           | Unique identifier of the moment                  |
| title       | string           | Moment title                                     |
| description | string           | Moment description                               |
| media_types | string[]         | Media types included (e.g. `["IMAGE", "VIDEO"]`) |
| cover_file  | MomentFileModel? | Cover file of the moment                         |
| date        | string           | Date in YYYY-MM-DD format                        |
| tz          | string           | Timezone offset in +00:00 format                 |
| start_time  | string           | Start time in ISO 8601 format                    |
| end_time    | string           | End time in ISO 8601 format                      |

### MomentFileModel

| Field      | Type       | Description                      |
| ---------- | ---------- | -------------------------------- |
| id         | string     | Unique identifier of the file    |
| file       | FileModel? | The media file                   |
| thumbnail  | FileModel? | Thumbnail of the file            |
| location   | string?    | Location description             |
| created_at | string     | Creation time in ISO 8601 format |
| tz         | string     | Timezone offset in +00:00 format |

### FileModel

| Field         | Type     | Description                            |
| ------------- | -------- | -------------------------------------- |
| temporary_url | string   | Pre-signed URL (expires in 1 hour)     |
| media_type    | string   | Media type (`IMAGE`, `VIDEO`, `AUDIO`) |
| size          | integer? | File size in bytes                     |
| duration_ms   | integer? | Duration in milliseconds (video/audio) |

### JournalModel

| Field       | Type                    | Description                         |
| ----------- | ----------------------- | ----------------------------------- |
| id          | string                  | Unique identifier of the journal    |
| type        | string                  | Journal type (e.g. `DIARY`)         |
| title       | string?                 | Journal title                       |
| description | string                  | Journal summary                     |
| content     | string?                 | Full journal content                |
| media_items | JournalMediaItemModel[] | Media attached to the journal       |
| date        | string                  | Date in YYYY-MM-DD format           |
| start_date  | string?                 | Start date for multi-day journals   |
| tz          | string                  | Timezone offset in +00:00 format    |
| recorded_at | string                  | Original recording time in ISO 8601 |
| created_at  | string                  | Creation time in ISO 8601 format    |

### JournalMediaItemModel

| Field     | Type       | Description          |
| --------- | ---------- | -------------------- |
| source    | FileModel  | Source media file    |
| thumbnail | FileModel? | Thumbnail media file |

### ForYouItemModel

| Field       | Type       | Description                         |
| ----------- | ---------- | ----------------------------------- |
| id          | string     | Unique identifier of the item       |
| type        | string     | Item type (e.g. `DAILY_VLOG`)       |
| title       | string     | Item title                          |
| description | string     | Item description                    |
| content     | string     | Item content                        |
| cover       | FileModel? | Cover image file                    |
| file        | FileModel? | Associated media file               |
| created_at  | string     | Creation time in ISO 8601 format    |
| recorded_at | string     | Original recording time in ISO 8601 |

---

## About Me

### Who am I

Returns your basic profile — name, email, timezone, and other details tied to your Looki account.

```bash
curl "{base_url}/me" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "user": {
            "id": "string",
            "email": "string",
            "first_name": "string",
            "last_name": "string",
            "tz": "string",
            "gender": "string",
            "birthday": "string",
            "region": "string"
        }
    }
}
```

## My Memories

### What happened these days

Returns a calendar view of moments for a date range, showing which days have recorded moments and a highlight description from each day.

| Parameter  | Type   | Required | Description                                         |
| ---------- | ------ | -------- | --------------------------------------------------- |
| start_date | string | required | Start date in YYYY-MM-DD format (e.g. `2026-01-01`) |
| end_date   | string | required | End date in YYYY-MM-DD format (e.g. `2026-01-31`)   |

```bash
curl "{base_url}/moments/calendar?start_date=2026-01-01&end_date=2026-01-31" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": [
        {
            "date": "2026-01-15",
            "highlight_moment": {
                "id": "string",
                "title": "string",
                "description": "string",
                "media_types": ["IMAGE", "VIDEO"],
                "date": "2026-01-15",
                "tz": "+08:00",
                "start_time": "2026-01-15T10:00:00+08:00",
                "end_time": "2026-01-15T12:00:00+08:00"
            }
        }
    ]
}
```

### What happened on [date]

Returns everything that was captured on a specific day — each moment with its title, description, time range, and cover image.

| Parameter | Type   | Required | Description               |
| --------- | ------ | -------- | ------------------------- |
| on_date   | string | required | Date in YYYY-MM-DD format |

```bash
curl "{base_url}/moments?on_date=2026-01-01" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": [
        {
            "id": "string",
            "title": "string",
            "description": "string",
            "media_types": ["IMAGE", "VIDEO"],
            "cover_file": {
                "id": "string",
                "file": {
                    "temporary_url": "string",
                    "media_type": "IMAGE",
                    "size": 1024,
                    "duration_ms": null
                },
                "thumbnail": null,
                "location": "string",
                "created_at": "2026-01-01T10:30:00+08:00",
                "tz": "+08:00"
            },
            "date": "2026-01-01",
            "tz": "+08:00",
            "start_time": "2026-01-01T10:00:00+08:00",
            "end_time": "2026-01-01T12:00:00+08:00"
        }
    ]
}
```

### Recall this moment

Returns the full details of a single moment — its description, location, time range, and cover image.

| Parameter | Type   | Required | Description                                |
| --------- | ------ | -------- | ------------------------------------------ |
| moment_id | string | required | The unique identifier of the moment (UUID) |

```bash
curl "{base_url}/moments/MOMENT_ID" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "id": "string",
        "title": "string",
        "description": "string",
        "media_types": ["IMAGE", "VIDEO"],
        "cover_file": {
            "id": "string",
            "file": {
                "temporary_url": "string",
                "media_type": "IMAGE",
                "size": 1024,
                "duration_ms": null
            },
            "thumbnail": null,
            "location": "string",
            "created_at": "2026-01-15T10:30:00+08:00",
            "tz": "+08:00"
        },
        "date": "2026-01-15",
        "tz": "+08:00",
        "start_time": "2026-01-15T10:00:00+08:00",
        "end_time": "2026-01-15T12:00:00+08:00"
    }
}
```

### Photos and videos from this moment

Returns the photos and videos from a specific moment. You can filter to just the highlights or page through all media.

| Parameter | Type    | Required | Description                                        |
| --------- | ------- | -------- | -------------------------------------------------- |
| moment_id | string  | required | The unique identifier of the moment (UUID)         |
| highlight | boolean |          | Filter by highlight status                         |
| cursor_id | string  |          | Cursor for pagination. Omit for the first request. |
| limit     | integer |          | Number of items to return (default 20, max 100)    |

```bash
curl "{base_url}/moments/MOMENT_ID/files?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "items": [
            {
                "id": "string",
                "file": {
                    "temporary_url": "string",
                    "media_type": "IMAGE",
                    "size": 1024,
                    "duration_ms": null
                },
                "thumbnail": {
                    "temporary_url": "string",
                    "media_type": "IMAGE",
                    "size": 512,
                    "duration_ms": null
                },
                "location": "string",
                "created_at": "2026-01-15T10:30:00+08:00",
                "tz": "+08:00"
            }
        ],
        "next_cursor_id": "string | null",
        "has_more": true
    }
}
```

### Find moments about [topic]

Searches across all your memories using natural language. Returns moments ranked by relevance — useful when you remember the gist but not the exact date.

| Parameter  | Type    | Required | Description                                      |
| ---------- | ------- | -------- | ------------------------------------------------ |
| query      | string  | required | Search query string (1-100 characters)           |
| start_date | string  |          | Filter results from this date (YYYY-MM-DD)       |
| end_date   | string  |          | Filter results up to this date (YYYY-MM-DD)      |
| page       | integer |          | Page number, starts from 1 (default 1)           |
| page_size  | integer |          | Number of results per page (default 10, max 100) |

```bash
curl "{base_url}/moments/search?query=Something&page_size=10" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "items": [
            {
                "id": "string",
                "title": "string",
                "description": "string",
                "media_types": ["IMAGE"],
                "cover_file": { ... },
                "date": "2026-01-15",
                "tz": "+08:00",
                "start_time": "2026-01-15T10:00:00+08:00",
                "end_time": "2026-01-15T12:00:00+08:00"
            }
        ],
        "next_cursor_id": null,
        "has_more": true
    }
}
```

### What did I write in my journal recently

Returns journal entries grouped by date. Use this when the user asks for their diary, journal, written recaps, or generated journal entries.

| Parameter   | Type    | Required | Description                                                  |
| ----------- | ------- | -------- | ------------------------------------------------------------ |
| cursor_date | string  |          | Cursor date from the previous response, in YYYY-MM-DD format |
| max_days    | integer |          | Maximum number of journal days to return (default 7, max 31) |
| sort_order  | string  |          | Sort order: `ASC` or `DESC` (default `DESC`)                 |

```bash
curl "{base_url}/journals?max_days=7" \
  -H "X-API-Key: YOUR_API_KEY"
```

The `data.items` array is dynamic and may contain one or more date groups. Each group's `journals` array is also dynamic and may contain one or more journal entries.

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "items": [
            {
                "date": "2026-06-02",
                "start_date": null,
                "journals": [
                    {
                        "id": "string",
                        "type": "DIARY",
                        "title": "A day",
                        "description": "A journal entry",
                        "content": "A journal entry",
                        "media_items": [],
                        "date": "2026-06-02",
                        "start_date": null,
                        "tz": "+08:00",
                        "recorded_at": "2026-06-02T13:00:00+08:00",
                        "created_at": "2026-06-02T13:05:00+08:00"
                    }
                ]
            }
        ],
        "next_cursor_id": "2026-06-02",
        "has_more": true
    }
}
```

### Did I journal on these days

Returns dates that have journal entries within a date range.

| Parameter  | Type   | Required | Description                                         |
| ---------- | ------ | -------- | --------------------------------------------------- |
| start_date | string | required | Start date in YYYY-MM-DD format (e.g. `2026-06-01`) |
| end_date   | string | required | End date in YYYY-MM-DD format (e.g. `2026-06-30`)   |

```bash
curl "{base_url}/journals/calendar?start_date=2026-06-01&end_date=2026-06-30" \
  -H "X-API-Key: YOUR_API_KEY"
```

The `data` array is dynamic and may contain one or more matching journal dates.

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": [
        {
            "date": "2026-06-02"
        }
    ]
}
```

### What did I journal on [date]

Returns all journal entries for a specific date.

| Parameter | Type   | Required | Description               |
| --------- | ------ | -------- | ------------------------- |
| on_date   | string | required | Date in YYYY-MM-DD format |

```bash
curl "{base_url}/journals/by_date?on_date=2026-06-02" \
  -H "X-API-Key: YOUR_API_KEY"
```

The `data` array is dynamic and may contain one or more date groups. Each group's `journals` array is also dynamic and may contain one or more journal entries.

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": [
        {
            "date": "2026-06-02",
            "start_date": null,
            "journals": [
                {
                    "id": "string",
                    "type": "DIARY",
                    "title": "A day",
                    "description": "A journal entry",
                    "content": "A journal entry",
                    "media_items": [],
                    "date": "2026-06-02",
                    "start_date": null,
                    "tz": "+08:00",
                    "recorded_at": "2026-06-02T13:00:00+08:00",
                    "created_at": "2026-06-02T13:05:00+08:00"
                }
            ]
        }
    ]
}
```

### Open this journal entry

Returns full details of a single journal entry.

| Parameter  | Type   | Required | Description                                 |
| ---------- | ------ | -------- | ------------------------------------------- |
| journal_id | string | required | The unique identifier of the journal (UUID) |

```bash
curl "{base_url}/journals/JOURNAL_ID" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "id": "string",
        "type": "DIARY",
        "title": "A day",
        "description": "A journal entry",
        "content": "A journal entry",
        "media_items": [],
        "date": "2026-06-02",
        "start_date": null,
        "tz": "+08:00",
        "recorded_at": "2026-06-02T13:00:00+08:00",
        "created_at": "2026-06-02T13:05:00+08:00"
    }
}
```

## My Highlights

### What's new for me

Returns AI-generated highlights made from your memories — vlogs and other creative recaps of your real-life experiences.

| Parameter     | Type    | Required | Description                                                       |
| ------------- | ------- | -------- | ----------------------------------------------------------------- |
| group         | string  |          | Filter by item group: `all`, `vlog`, `other` (default `all`)      |
| liked         | boolean |          | Filter by liked status                                            |
| recorded_from | string  |          | Filter by recording date from (YYYY-MM-DD)                        |
| recorded_to   | string  |          | Filter by recording date to (YYYY-MM-DD)                          |
| created_from  | string  |          | Filter by creation date from (YYYY-MM-DD)                         |
| created_to    | string  |          | Filter by creation date to (YYYY-MM-DD)                           |
| cursor_id     | string  |          | Cursor for pagination                                             |
| limit         | integer |          | Number of items to return (default 20, max 100)                   |
| order_by      | string  |          | Sort field: `created_at` or `recorded_at` (default `recorded_at`) |

```bash
curl "{base_url}/for_you/items?limit=20&group=vlog" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "items": [
            {
                "id": "string",
                "type": "DAILY_VLOG",
                "title": "string",
                "description": "string",
                "content": "string",
                "cover": {
                    "temporary_url": "string",
                    "media_type": "IMAGE",
                    "size": null,
                    "duration_ms": null
                },
                "file": {
                    "temporary_url": "string",
                    "media_type": "IMAGE",
                    "size": null,
                    "duration_ms": null
                },
                "created_at": "2026-01-15T10:30:00+08:00",
                "recorded_at": "2026-01-14T18:00:00+08:00"
            }
        ],
        "next_cursor_id": "string | null",
        "has_more": true
    }
}
```

## Realtime

### What's happening right now

Returns the most recent realtime event detected by your Looki device. Requires proactive mode to be enabled in the Looki app.

> **Beta:** This feature is currently in beta testing. You may not have access to enable proactive mode yet.

```bash
curl "{base_url}/realtime/latest-event" \
  -H "X-API-Key: YOUR_API_KEY"
```

Response:

```json
{
    "code": 0,
    "detail": "success",
    "data": {
        "id": "string",
        "description": "string",
        "start_time": "2026-01-15T10:00:00+08:00",
        "end_time": "2026-01-15T10:15:00+08:00",
        "tz": "+08:00",
        "location": "string"
    }
}
```
