Skip to content

Personalized Apps API

Internally, Nexo still uses the technical term micro apps. In customer-facing product language, these are Personalized Apps.

For the product model and runtime architecture, see the Micro Apps Guide.

Personalized Apps are a first-party structured app runtime inside Nexo. This guide covers the REST API and MCP access for developers who want to create, manage, and query them from the command line or an AI coding assistant.

MCP access

All operations on this page are also available as MCP tools. Connect an AI coding assistant and build apps through conversation. See MCP Server for setup.

Dashboard host vs MCP host

Use the dashboard hosts (https://staging.nexo.luzia.com, https://nexo.luzia.com) to sign in and create developer keys.

Use the backend MCP base URL (https://nexo-cdn-alb.staging.thewordlab.net, https://luzia-nexo.thewordlab.net, or http://localhost:8000) for MCP connections and low-level MCP health checks.

Authentication

Send your developer key in the X-Api-Key header:

curl -H "X-Api-Key: nexo_uak_..." https://nexo.luzia.com/api/micro-apps

Get your key from the Nexo dashboard → Profile → Developer Access. Your developer key identifies you (the person) and works across all Personalized Apps endpoints.

JWT session (dashboard and browser)

For browser-based access, obtain a user-scoped JWT by posting your email and password to the token endpoint.

POST /api/auth/token

JSON body:

curl -X POST "https://nexo.luzia.com/api/auth/token" \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "password": "your-password"}'

Response:

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer",
  "expires_in": 3600
}

A form-encoded variant is also available at POST /api/auth/token/form for tools that prefer form encoding.

Use the token on all subsequent requests:

export TOKEN="eyJhbGciOiJIUzI1NiIs..."

List apps

GET /api/micro-apps

Returns all Personalized Apps owned by the authenticated user.

curl "https://nexo.luzia.com/api/micro-apps" \
  -H "Authorization: Bearer $TOKEN"

Response (array of app summaries):

[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Shared Expenses",
    "archetype": "shared_expenses",
    "locale": "pt-BR",
    "status": "active",
    "created_at": "2026-04-01T10:00:00Z"
  }
]

Create an app from a prompt

Creating an app is a two-step process: plan a template, then provision.

Step 1: Plan a template

POST /api/micro-apps/template-plan

Turn a natural-language prompt into a structured template preview. The response shows what would be created - tables, fields, views, seed data - without actually creating anything.

curl -X POST "https://nexo.luzia.com/api/micro-apps/template-plan" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Help me track my weekly grocery spending",
    "locale": "en"
  }'

Response (template preview):

{
  "template": {
    "name": "Grocery Spending",
    "archetype": "custom",
    "locale": "en",
    "tables": [
      {
        "key": "expenses",
        "label": "Expenses",
        "fields": [
          { "key": "item", "label": "Item", "type": "text", "required": true },
          { "key": "amount", "label": "Amount", "type": "number", "required": true },
          { "key": "category", "label": "Category", "type": "select", "options": ["produce", "dairy", "meat", "pantry", "other"] },
          { "key": "date", "label": "Date", "type": "date", "required": true }
        ]
      }
    ],
    "views": [
      { "key": "list", "type": "list", "table_key": "expenses" },
      { "key": "summary", "type": "summary", "table_key": "expenses" }
    ],
    "seed_records": [
      { "table_key": "expenses", "values": { "item": "Apples", "amount": 4.50, "category": "produce", "date": "2026-04-10" } }
    ]
  }
}

Review the template. If it looks right, provision.

Step 2: Provision the app

POST /api/micro-apps/provision-from-template

curl -X POST "https://nexo.luzia.com/api/micro-apps/provision-from-template" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "template": { ... }
  }'

Pass the full template object from the planning step. The response is the created app with its ID.

Modify an existing app

Use the operation plan/apply pattern to modify an app's schema or settings.

POST /api/micro-apps/template-operation-plan

Plan a mutation on an existing app:

curl -X POST "https://nexo.luzia.com/api/micro-apps/template-operation-plan" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "app_id": "550e8400-e29b-41d4-a716-446655440000",
    "instruction": "Add a store name field to the expenses table"
  }'

POST /api/micro-apps/apply-operation

Execute the planned mutation:

curl -X POST "https://nexo.luzia.com/api/micro-apps/apply-operation" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "app_id": "550e8400-e29b-41d4-a716-446655440000",
    "operation": { ... }
  }'

Context endpoint

GET /api/micro-apps/context.md

Returns a compact markdown summary of all the user's apps, tables, fields, and recent records. Designed for LLM context injection (~300-800 tokens).

curl "https://nexo.luzia.com/api/micro-apps/context.md" \
  -H "Authorization: Bearer $TOKEN"

Response (text/markdown):

## Shared Expenses
Expense tracker | 23 records | Last updated: Apr 10
### expenses (6 fields, 23 records)
Fields: amount (number, required), category (select: food/transport/rent), note (text), spent_at (date, required)
Summary: Total R$1,340.00 | Shared R$480.00
Recent:
- Apr 10: Dinner, R$42.00, food, shared (Maria)
- Apr 9: Uber, R$18.50, transport (João)

A JSON variant is available at GET /api/micro-apps/context:

{
  "markdown": "## Shared Expenses\n...",
  "app_count": 2,
  "total_records": 45
}

Surface rendering

GET /api/micro-apps/{id}/surface

Render a compact card for embedding in chat:

curl "https://nexo.luzia.com/api/micro-apps/$APP_ID/surface?surface=chat_card" \
  -H "Authorization: Bearer $TOKEN"

MCP access

Nexo's MCP server at /mcp exposes Personalized Apps as discoverable tools. Any MCP-compatible client (Claude Code, LangChain, etc.) can discover and call these tools. Auth via your developer key in the X-Api-Key header.

Connect

# Claude Code example
export NEXO_BASE_URL=http://localhost:8000
claude mcp add --scope project --transport http nexo-server \
  "${NEXO_BASE_URL}/mcp" \
  -H "X-Api-Key: YOUR_DEVELOPER_KEY"

Use your developer key for MCP. App runtime secrets are for Partner Integration runtime calls, not for MCP.

Available tools

When connected, list_tools returns tools for each active Partner Integration plus Personalized Apps management tools. Tool names are app UUIDs; descriptions include the app's name and capabilities.

Tool invocation

{
  "name": "<app-uuid>",
  "arguments": {
    "message": "Show me my spending this week",
    "session_id": "cli-session-001"
  }
}

For full MCP and A2A protocol details, see Agent Interop.

Quick reference

The quick reference below covers the AI-assisted workflow. For the full CRUD API (tables, fields, records, views, forms, settings), see the OpenAPI specification at /docs on your Nexo instance.

Operation Method Endpoint
Authenticate POST /api/auth/token
List apps GET /api/micro-apps
Plan template POST /api/micro-apps/template-plan
Provision app POST /api/micro-apps/provision-from-template
Plan mutation POST /api/micro-apps/template-operation-plan
Apply mutation POST /api/micro-apps/apply-operation
Context (markdown) GET /api/micro-apps/context.md
Context (JSON) GET /api/micro-apps/context
Render surface GET /api/micro-apps/{id}/surface
MCP tools POST /mcp

Constraints

  • 10 apps per user
  • 3 tables per app
  • 30 fields per table
  • 5,000 records per table
  • 6 field types: text, number, boolean, date, select, multi_select
  • 4 view types: list, cards, form, summary