Skip to content

docs: Add Mintlify tabs navigation and OpenAPI-powered API Reference#5998

Merged
aaravgarg merged 3 commits into
mainfrom
atlas/docs-tabs-api-reference
Mar 24, 2026
Merged

docs: Add Mintlify tabs navigation and OpenAPI-powered API Reference#5998
aaravgarg merged 3 commits into
mainfrom
atlas/docs-tabs-api-reference

Conversation

@atlas-agent-omi
Copy link
Copy Markdown

What

Restructure the Omi docs to use Mintlify tabs for top-level navigation and add a professional OpenAPI-powered API Reference with interactive playground.

Changes

Navigation Tabs

  • Reorganized docs.json from flat groups into 5 tabs: Documentation, API Reference, Build Apps, Hardware, MCP
  • Added icons to all tabs and sidebar groups
  • All existing pages preserved — just reorganized into a cleaner hierarchy

API Reference (OpenAPI)

  • Created a proper OpenAPI 3.1.0 spec (api-reference/openapi.json) covering all Developer API endpoints
    • Replaces the placeholder plant store spec
    • Accurate schemas, parameters, request/response examples based on the actual backend routers
    • Bearer auth configuration for the API playground
  • Added 19 interactive endpoint pages using Mintlify OpenAPI integration:
    • Memories: list, create, create-batch, update, delete
    • Conversations: list, create, create-from-segments, get, update, delete
    • Action Items: list, create, create-batch, update, delete
    • API Keys: list, create, revoke
  • Existing hand-written API guide pages (with code examples, use cases) kept alongside the interactive playground pages

Before / After

  • Before: Single flat sidebar with all groups visible. API reference was just hand-written guides. OpenAPI spec was a placeholder plant store.
  • After: Clean tabbed navigation. API Reference tab has both guides AND interactive OpenAPI playground. Users can try endpoints directly from the docs.

Testing

  • All existing page paths preserved (no broken links)
  • OpenAPI spec validates against 3.1.0
  • Follows Mintlify docs.json tabs format

- Restructure docs.json to use Mintlify tabs: Documentation, API Reference, Build Apps, Hardware, MCP
- Add icons to all tabs and groups
- Create OpenAPI 3.1.0 spec for the Omi Developer API (replaces plant store placeholder)
- Add 19 interactive API endpoint pages using Mintlify OpenAPI integration
- Cover all endpoints: Memories, Conversations, Action Items, API Keys
- Include proper schemas, examples, auth config, and error responses
- Keep existing hand-written API guide pages alongside interactive playground pages
@mintlify
Copy link
Copy Markdown

mintlify Bot commented Mar 24, 2026

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
omi 🟢 Ready View Preview Mar 24, 2026, 9:43 AM

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Mar 24, 2026

Greptile Summary

This PR upgrades the Omi developer docs from a flat sidebar with a placeholder plant-store OpenAPI spec to a clean 5-tab Mintlify navigation (Documentation, API Reference, Build Apps, Hardware, MCP) backed by a proper OpenAPI 3.1.0 spec covering memories, conversations, action items, and API keys. All 19 new interactive endpoint pages are thin MDX stubs that delegate to the spec, which is the correct Mintlify pattern. Existing hand-written guide pages are preserved and co-located with the new playground pages.

Key findings:

  • P1 — Rate-limit headers are documented but not implemented: introduction.mdx promises X-RateLimit-Limit/Remaining/Reset headers on every response, but backend/routers/developer.py emits no such headers. This will mislead integrators who rely on back-pressure.
  • P1 — scopes field missing from API key schemas: DevApiKeyCreate and DevApiKey both carry an optional scopes list in the backend, but neither CreateApiKey nor ApiKey in the spec includes it — preventing scoped key creation via the interactive playground.
  • P2 — Goals API not represented in the spec: Seven Goals endpoints exist in developer.py (CRUD + progress + history) but are entirely absent from the OpenAPI spec. If intentionally unpublished, a brief note would help avoid developer confusion.
  • P2 — Memory category enum understates accepted values: The spec enumerates only the three primary categories (interesting, system, manual), but the backend still accepts 10+ legacy values. Adding a note in the description would prevent playground validation errors for valid legacy inputs.

Confidence Score: 3/5

  • Safe to merge for navigation/structure changes, but two P1 accuracy issues in the API reference content should be fixed before this goes live to developers.
  • The docs.json restructuring and the new endpoint MDX stubs are clean and correct. The OpenAPI path/method pairs all match the backend router. The two P1 issues (undocumented rate-limit headers and missing scopes in API key schemas) could actively mislead developers who rely on the published docs, so they warrant a targeted fix pass before merge.
  • docs/api-reference/introduction.mdx (remove/correct the rate-limit header section) and docs/api-reference/openapi.json (add scopes to ApiKey, ApiKeyCreated, and CreateApiKey schemas).

Important Files Changed

Filename Overview
docs/api-reference/openapi.json Replaces the placeholder plant-store spec with a comprehensive Omi Developer API spec (memories, conversations, action items, API keys). Missing scopes field in API key schemas, Goals endpoints absent, and category enum narrower than the backend accepts.
docs/api-reference/introduction.mdx Updated from a Mintlify starter placeholder to a real API reference intro. Documents rate-limit response headers (X-RateLimit-*) that are not actually emitted by the developer API backend.
docs/docs.json Navigation restructured from flat groups to 5 tabs (Documentation, API Reference, Build Apps, Hardware, MCP). All existing page paths preserved; openapi field correctly placed at the API Reference tab level.
docs/api-reference/endpoint/memories/list.mdx New Mintlify OpenAPI stub correctly referencing GET /v1/dev/user/memories — path matches the backend router.
docs/api-reference/endpoint/conversations/create-from-segments.mdx New Mintlify OpenAPI stub for POST /v1/dev/user/conversations/from-segments — path and method match the backend router.
docs/api-reference/endpoint/keys/revoke.mdx New Mintlify OpenAPI stub for DELETE /v1/dev/keys/{key_id} — path and method match the backend router.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    User([Developer]) -->|Bearer Token| API[api.omi.me]

    API --> MEM["/v1/dev/user/memories\nGET · POST · PATCH · DELETE"]
    API --> CONV["/v1/dev/user/conversations\nGET · POST · PATCH · DELETE · GET id"]
    API --> SEGS["/v1/dev/user/conversations/from-segments\nPOST"]
    API --> ACT["/v1/dev/user/action-items\nGET · POST · PATCH · DELETE"]
    API --> KEYS["/v1/dev/keys\nGET · POST · DELETE"]
    API --> GOALS["/v1/dev/user/goals\n⚠️ Not in OpenAPI spec"]

    MEM -->|batch| MEMBATCH["/v1/dev/user/memories/batch\nPOST"]
    ACT -->|batch| ACTBATCH["/v1/dev/user/action-items/batch\nPOST"]

    CONV --> AI{{AI Pipeline\nDiscard · Structure · Memories · Apps}}
    SEGS --> AI

    style GOALS fill:#ffcccc,stroke:#cc0000
Loading

Reviews (1): Last reviewed commit: "Add Mintlify tabs navigation and OpenAPI..." | Re-trigger Greptile

Top-level headings (Get Started, Core Development, etc.) no longer have icons.
Nested sub-groups (Backend, Firmware, SDK, Audio & Testing) keep their icons.
Individual page icons remain via frontmatter.
Comment on lines +23 to +40
## Rate Limits

| Limit | Value |
|-------|-------|
| Per minute | 100 requests per API key |
| Per day | 10,000 requests per user |

Rate limit headers are included in every response:

```http
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1642694400
```

## Resources

<CardGroup cols={2}>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Rate limit headers are not implemented in the Developer API

The documentation states "Rate limit headers are included in every response" and lists X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers — but the backend developer.py router does not implement these headers for any of the developer API endpoints. Rate-limiting headers only exist in the notification/integration routes (routers/integration.py, routers/notifications.py).

Publishing these headers as a guarantee will cause confusion when developers instrument their clients expecting them and find they are absent. Either the rate-limit section should be removed/marked as "coming soon", or the backend needs to be updated to actually emit these headers.

Suggested change
## Rate Limits
| Limit | Value |
|-------|-------|
| Per minute | 100 requests per API key |
| Per day | 10,000 requests per user |
Rate limit headers are included in every response:
```http
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1642694400
```
## Resources
<CardGroup cols={2}>
## Rate Limits
Requests are rate-limited per API key. If you exceed the limit you will receive a `429 Too Many Requests` response.
> **Note:** Rate-limit response headers are not currently returned by the API.

Comment on lines +1044 to +1056
},
"ApiKeyCreated": {
"type": "object",
"properties": {
"id": { "type": "string" },
"name": { "type": "string" },
"key_prefix": { "type": "string" },
"key": { "type": "string", "description": "The full API key. **Only returned once during creation.**" },
"created_at": { "type": "string", "format": "date-time" },
"last_used_at": { "type": ["string", "null"], "format": "date-time" }
}
},
"CreateApiKey": {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 CreateApiKey schema omits the scopes field

The actual DevApiKeyCreate Pydantic model (and the DevApiKey / DevApiKeyCreated response models) all include an optional scopes: List[str] field that lets callers limit a key's permissions. The OpenAPI spec defines CreateApiKey with only name, so:

  1. Users cannot create scoped keys through the interactive playground.
  2. The ApiKey list response silently drops any scopes that already exist on returned keys.

Suggested addition to the schema:

"CreateApiKey": {
  "type": "object",
  "required": ["name"],
  "properties": {
    "name": { "type": "string", "description": "Descriptive name for the key." },
    "scopes": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Optional permission scopes. Defaults to read-only if omitted."
    }
  }
}

The same scopes field should be added to the ApiKey and ApiKeyCreated response schemas.

Comment on lines +995 to +1010
"description": { "type": "string", "description": "The action item text." },
"completed": { "type": "boolean", "description": "Whether completed." },
"created_at": { "type": "string", "format": "date-time" },
"updated_at": { "type": "string", "format": "date-time" },
"due_at": { "type": ["string", "null"], "format": "date-time", "description": "Due date (null if not set)." },
"completed_at": { "type": ["string", "null"], "format": "date-time", "description": "When completed (null if pending)." },
"conversation_id": { "type": ["string", "null"], "description": "Associated conversation ID." }
}
},
"CreateActionItem": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string", "minLength": 1, "maxLength": 500, "description": "The action item description." },
"completed": { "type": "boolean", "default": false, "description": "Whether completed." },
"due_at": { "type": "string", "format": "date-time", "description": "Due date in ISO 8601 format." }
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Memory category enum is narrower than the backend accepts

The CreateMemory schema documents only ["interesting", "system", "manual"], but the MemoryCategory enum in backend/models/memories.py still accepts core, hobbies, lifestyle, interests, habits, work, skills, learnings, other, and auto (legacy values). If a user sends one of those legacy values, the API accepts it and maps it internally, but the playground will flag it as invalid.

A short note in the description would prevent confusion:

Suggested change
"description": { "type": "string", "description": "The action item text." },
"completed": { "type": "boolean", "description": "Whether completed." },
"created_at": { "type": "string", "format": "date-time" },
"updated_at": { "type": "string", "format": "date-time" },
"due_at": { "type": ["string", "null"], "format": "date-time", "description": "Due date (null if not set)." },
"completed_at": { "type": ["string", "null"], "format": "date-time", "description": "When completed (null if pending)." },
"conversation_id": { "type": ["string", "null"], "description": "Associated conversation ID." }
}
},
"CreateActionItem": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string", "minLength": 1, "maxLength": 500, "description": "The action item description." },
"completed": { "type": "boolean", "default": false, "description": "Whether completed." },
"due_at": { "type": "string", "format": "date-time", "description": "Due date in ISO 8601 format." }
"category": { "type": "string", "enum": ["interesting", "system", "manual"], "description": "Memory category. Legacy values (core, hobbies, work, etc.) are still accepted for backward compatibility but are not recommended for new integrations." },

Comment on lines +260 to +270
"schema": { "type": "integer", "default": 0 }
},
{
"name": "start_date",
"in": "query",
"description": "Filter by start date (inclusive). ISO 8601 format.",
"schema": { "type": "string", "format": "date-time" }
},
{
"name": "end_date",
"in": "query",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Goals API endpoints are absent from the spec

The backend developer.py router exposes a complete Goals API (GET/POST /v1/dev/user/goals, GET/PATCH/DELETE /v1/dev/user/goals/{goal_id}, PATCH /v1/dev/user/goals/{goal_id}/progress, GET /v1/dev/user/goals/{goal_id}/history). None of these endpoints appear in the new OpenAPI spec, so developers have no interactive playground access to goals and may not discover the feature at all.

If the Goals API is intentionally unpublished (e.g. still in beta), a comment in the spec or a note in the introduction page explaining this would help avoid confusion.

@aaravgarg aaravgarg merged commit ebeb3ba into main Mar 24, 2026
2 checks passed
@aaravgarg aaravgarg deleted the atlas/docs-tabs-api-reference branch March 24, 2026 09:50
Glucksberg pushed a commit to Glucksberg/omi-local that referenced this pull request Apr 28, 2026
…asedHardware#5998)

## What

Restructure the Omi docs to use **Mintlify tabs** for top-level
navigation and add a professional **OpenAPI-powered API Reference** with
interactive playground.

## Changes

### Navigation Tabs
- Reorganized `docs.json` from flat groups into 5 tabs:
**Documentation**, **API Reference**, **Build Apps**, **Hardware**,
**MCP**
- Added icons to all tabs and sidebar groups
- All existing pages preserved — just reorganized into a cleaner
hierarchy

### API Reference (OpenAPI)
- Created a proper **OpenAPI 3.1.0 spec** (`api-reference/openapi.json`)
covering all Developer API endpoints
  - Replaces the placeholder plant store spec
- Accurate schemas, parameters, request/response examples based on the
actual backend routers
  - Bearer auth configuration for the API playground
- Added **19 interactive endpoint pages** using Mintlify OpenAPI
integration:
  - Memories: list, create, create-batch, update, delete
- Conversations: list, create, create-from-segments, get, update, delete
  - Action Items: list, create, create-batch, update, delete
  - API Keys: list, create, revoke
- Existing hand-written API guide pages (with code examples, use cases)
kept alongside the interactive playground pages

### Before / After
- **Before**: Single flat sidebar with all groups visible. API reference
was just hand-written guides. OpenAPI spec was a placeholder plant
store.
- **After**: Clean tabbed navigation. API Reference tab has both guides
AND interactive OpenAPI playground. Users can try endpoints directly
from the docs.

## Testing
- All existing page paths preserved (no broken links)
- OpenAPI spec validates against 3.1.0
- Follows Mintlify docs.json tabs format
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant