原始内容
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_urlby sending a GET request tohttps://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-Keyheader 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.
{
"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 withlk-.
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:
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.
curl "{base_url}/me" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
curl "{base_url}/moments/calendar?start_date=2026-01-01&end_date=2026-01-31" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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 |
curl "{base_url}/moments?on_date=2026-01-01" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
curl "{base_url}/moments/MOMENT_ID" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
curl "{base_url}/moments/MOMENT_ID/files?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
curl "{base_url}/moments/search?query=Something&page_size=10" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
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:
{
"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) |
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:
{
"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 |
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:
{
"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) |
curl "{base_url}/journals/JOURNAL_ID" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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) |
curl "{base_url}/for_you/items?limit=20&group=vlog" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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.
curl "{base_url}/realtime/latest-event" \
-H "X-API-Key: YOUR_API_KEY"
Response:
{
"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"
}
}