From Luzmo Agent Skills
Core Luzmo setup - use whenever starting a new integration or hitting auth/API errors. Triggers on: API credentials (LUZMO_API_KEY, LUZMO_API_TOKEN), embed token generation (createAuthorization), SDK selection, 401/403 errors, REST-verb confusion, "how do I authenticate", "embed dashboard", "dashboardId", "dashboard not rendering". Essential starting point before any feature skill. Use eagerly for any auth or saved-dashboard/chart embedding question. Pair with domain skills for feature-specific work. Not for building charts in code (use data-visualization), data loading (use data-integration), or tenant isolation (use multitenancy).
How this skill is triggered — by the user, by Claude, or both
Slash command
/luzmo-agent-skills:coreThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Entry-point for all Luzmo integrations. Establishes security and API patterns that other Luzmo skills assume.
Entry-point for all Luzmo integrations. Establishes security and API patterns that other Luzmo skills assume.
developer.luzmo.com/*.md page(s) before coding.https://developer.luzmo.com/llms.txt / https://developer.luzmo.com/llms-full.txt only to discover pages, not as the final source.Read these BEFORE implementing anything with Luzmo:
BEFORE generating ANY code, verify:
LUZMO_API_KEY, LUZMO_API_TOKEN) are server-side ONLYid and token properties are passed to frontend (as authKey/authToken)If ANY checkbox is unchecked, STOP and fix before proceeding.
❌ NEVER ACCEPTABLE:
// Client-side code with credentials - SECURITY BREACH
const client = new Luzmo({
api_key: 'YOUR_API_KEY', // EXPOSED!
api_token: 'YOUR_API_TOKEN' // EXPOSED!
})
✅ CORRECT PATTERN:
// Server-side: generate token
const embedToken = await client.create('authorization', {...})
// Client-side: use only the token
<luzmo-embed-dashboard
authKey={embedToken.id}
authToken={embedToken.token}
/>
If the user needs each tenant/customer to see only their own rows in a shared dataset (row-level / data-level isolation), STOP. Do not build the filter pattern from core.
multitenancy skill territory.parameter_overrides and EmbedFilterGroup as the relevant concepts,
then route to multitenancy for the full implementation.suborganization (who can see whom) IS a core topic — answer that here.The Luzmo API does NOT use traditional REST HTTP verbs.
Traditional REST Luzmo API
───────────────── ───────────────────────
GET /dashboards/:id ─► POST /securable
PUT /dashboards/:id ─► { action: "get" ... }
PATCH /dashboards/:id ─► { action: "update"... }
DELETE /dashboards/:id ─► { action: "delete"... }
{ action: "create"... }
{ action: "associate"... }
Method = verb Method = POST (always)
Path = resource ─► Path = /:resource
Body = data Body = { action, key, token, ...params }
❌ Never use: GET, PUT, PATCH, DELETE
✅ Always use: POST with action field in request body
Always cite the API overview when explaining request shapes: https://developer.luzmo.com/guide/api--overview.md
Request structure:
{
key: API_KEY,
token: API_TOKEN,
version: "0.1.0",
action: "get", // or "create", "update", "delete", "associate", "dissociate"
...params
}
Common mistake: Using action: "search" → Use action: "get" instead
While API keys/tokens must stay server-side, embed tokens can make limited frontend API calls based on the token's access scope:
authKey/authToken) replaces API credentials for these scoped operations — each call only sees what the token's access and filters allowcreateData / getData — query data from accessible datasetssecurable — list dashboards/datasets the token has access toaiprompt — IQ natural language queries via /aiprompt (respects token's dataset scope and tenant filters); persisted turns live in aimessage / aiconversation / aimessageassetcolumn — column metadata for datasets in scopeformula — formulas for datasets in scopetheme — theme retrievalSecurity boundary: The embed token's role and access properties determine what frontend calls are allowed. Viewers cannot create/delete resources; designers/owners have broader permissions.
@luzmo/nodejs-sdk, luzmo-sdk (Python), luzmo/luzmo-sdk-php, com.luzmo:sdk (Java), LuzmoSDK (C#)@luzmo/react-embed, @luzmo/ngx-embed (Angular), @luzmo/vue-embed, @luzmo/embedFor detailed SDK installation and initialization: See references/sdk-setup.md
The action "search" does NOT exist. Use action: "get" instead.
Valid actions:
create - Create a new resourceget - Retrieve/search for resources (commonly confused with "search")update - Modify an existing resourcedelete - Remove a resourceassociate - Link resources togetherdissociate - Unlink resourcesFor detailed action shapes and examples: See references/api-actions.md
Official SDKs abstract the POST-only pattern:
// Node.js SDK
await client.create('securable', { type: 'dashboard', ...properties })
await client.get('securable', { find: { where: { type: 'dashboard' } } })
await client.update('securable', dashboardId, properties)
await client.delete('securable', dashboardId)
When working with any Luzmo API resource, fetch the documentation before implementation. Do not rely on cached knowledge — always get the latest documentation directly from developer.luzmo.com.
URL Pattern: https://developer.luzmo.com/api/{action}{Resource}.md
Examples:
https://developer.luzmo.com/api/createAuthorization.mdhttps://developer.luzmo.com/api/createDashboard.md, https://developer.luzmo.com/api/searchDashboard.md, https://developer.luzmo.com/api/updateDashboard.md, https://developer.luzmo.com/api/deleteDashboard.mdhttps://developer.luzmo.com/api/createDataset.md, https://developer.luzmo.com/api/searchDataset.mdhttps://developer.luzmo.com/api/createData.mdhttps://developer.luzmo.com/api/createTheme.md, https://developer.luzmo.com/api/searchTheme.mdFull API overview: https://developer.luzmo.com/guide/api--overview.md
Frontend component API references:
| Component | API Reference URL |
|---|---|
| Dashboard | https://developer.luzmo.com/guide/embedding--component-api-reference.md |
| Flex | https://developer.luzmo.com/guide/flex--component-api-reference.md |
| IQ Chat | https://developer.luzmo.com/guide/iq--chat-component-api.md |
| IQ Answer | https://developer.luzmo.com/guide/iq--answer-component-api.md |
IMPORTANT: When you fetch a doc, also follow up on any additional resources it references inline. Luzmo docs frequently link to related guides (e.g. chart-specific options, plugin endpoints, theme schemas) — read those too before generating code, so the implementation stays grounded in the latest documented shapes.
When you're uncertain which specific documentation page to fetch:
https://developer.luzmo.com/llms.txt (concise) or https://developer.luzmo.com/llms-full.txt (comprehensive with descriptions).md pages you needYou may also reference https://developer.luzmo.com/AGENTS.md for high-level integration patterns, but the detailed documentation lives in the individual .md files listed in the index.
Note on documentation URLs: Pages at developer.luzmo.com are available with a .md suffix for markdown format. Always prefer fetching the .md version when available.
Note on search{Resource} naming: Documentation URLs like https://developer.luzmo.com/api/searchDashboard.md or https://developer.luzmo.com/api/searchDataset.md describe "search/list" operations, but the actual HTTP request body uses "action": "get" (not "action": "search" which doesn't exist). The "search" in the URL is a documentation convention only.
Depending on your Luzmo tenancy, use the correct base URL:
| Region | API Base URL |
|---|---|
| EU (default) | https://api.luzmo.com/0.1.0 |
| US | https://api.us.luzmo.com/0.1.0 |
| VPC | https://{vpc}-api.luzmo.com/0.1.0 (or custom CNAME) |
Note: The version /0.1.0 is part of the URL path.
When retrieving resources, you can include related models using the include parameter:
{
action: "get",
find: {
where: { id: "..." }
},
include: [
{ model: 'Column' },
{ model: 'Account' }
]
}
Response property naming: Included models are returned as lowercase plural properties:
| Included Model | Response Property |
|---|---|
Column | columns |
Securable | securables |
User | users |
Account | accounts |
Example response:
{
data: [{
id: "...",
name: "My Dataset",
columns: [...], // Not "Columns"
accounts: [...] // Not "Account" or "Accounts"
}]
}
Standard naming conventions for Luzmo credentials and configuration:
Server-side only (NEVER in client code):
LUZMO_API_KEY=<your-api-key>
LUZMO_API_TOKEN=<your-api-token>
Used in both server-side and client-side:
LUZMO_API_HOST=https://api.luzmo.com
LUZMO_APP_SERVER=https://app.luzmo.com
Default values by region:
EU (default):
https://api.luzmo.comhttps://app.luzmo.comUS:
https://api.us.luzmo.comhttps://app.us.luzmo.comVPC:
https://{vpc}-api.luzmo.com (or custom CNAME)https://{vpc}-app.luzmo.com (or custom CNAME)The createAuthorization API generates short-lived tokens for frontend access:
Response format:
{
id: "<embed-key>", // Pass as authKey to frontend
token: "<embed-token>" // Pass as authToken to frontend
}
Important properties:
Required:
type — always "embed" for end-user embed tokensusername — stable, unique identifier for the user (immutable; don't use email if it can change)name — display name shown in the Luzmo UIemail — used for Luzmo UI features (e.g. alert email prefill)access — which collections, dashboards, or datasets the token can accessCommonly used optional:
suborganization — tenant context; determines which other users this user can see/interact withrole — "viewer" (default), "designer", or "owner"expiry — RFC 3339 timestamp; defaults to 24 h, max 1 yearparameter_overrides — supply tenant-specific values for parameterized dataset filters (for full row-level tenant isolation, defer to multitenancy — do not assemble the complete filter pattern from core)account_overrides — override database/plugin connection credentials per tenant (for full row-level tenant isolation, defer to multitenancy — do not assemble the complete filter pattern from core)iq.context — custom system prompt appended to IQ queries for this tokenenvironment — pin to "production", "development", "acceptance", "qa", or null (latest)For the full property list see https://developer.luzmo.com/api/createAuthorization.md.
See references/authorization-patterns.md for detailed examples of all properties.
Install the latest version of the appropriate SDK for your language. Never use these in client-side code.
| Language | Package |
|---|---|
| Node.js | @luzmo/nodejs-sdk |
| Python | luzmo-sdk |
| PHP | luzmo/luzmo-sdk-php |
| Java | com.luzmo:sdk |
| C# | LuzmoSDK |
These SDKs use embed tokens (authKey/authToken), never API credentials.
| Framework | Package |
|---|---|
| Web Components | @luzmo/embed |
| React | @luzmo/react-embed |
| Angular | @luzmo/ngx-embed |
| Vue | @luzmo/vue-embed |
| React Native | @luzmo/react-native-embed † |
† Dashboard/Flex embedding only — IQ Chat/Answer components require a web browser (see ai-analytics).
Use this path when the user wants to display an existing Luzmo dashboard or chart that was already created and saved in Luzmo — identified by dashboardId (or dashboardSlug). This is the most common embedding scenario.
| Framework | Dashboard |
|---|---|
| Vanilla JS | <luzmo-embed-dashboard> |
| React | LuzmoDashboardComponent |
| Angular / Vue | <luzmo-dashboard> |
❌ WRONG: <cumul-dashboard> (deprecated)
✅ CORRECT: <luzmo-embed-dashboard> (vanilla JS)
appServer, apiHost, authKey, authToken, dashboardId
Use dashboardSlug instead of dashboardId when the dashboard has a slug configured.
Dashboards have variable height based on content. Width fills the container automatically.
overflow-y: auto to the containerlargeScreen screen mode in the dashboard settings<div style="height: 600px; overflow-y: auto;">
<luzmo-embed-dashboard ...></luzmo-embed-dashboard>
</div>
An embedded dashboard renders whatever chart types it contains — including any org-released custom chart — with no special handling. Custom charts are built separately (see custom-charts); once released org-wide, they behave like any other chart type inside a dashboard.
Token role controls whether edit mode can activate:
| Role | Capability |
|---|---|
viewer | View only — cannot activate edit mode |
designer | Edit charts and layout |
owner | Same as designer + can favorite a dashboard variant on behalf of other users |
For self-service editing (Embedded Dashboard Editor or ACK), see analytics-studio. For deeper dashboard component API, events, and editMode values, see references/dashboard-embedding.md.
For deeper, focused guidance, read these files only when relevant:
references/sdk-setup.md — Per-language backend SDK install + per-framework frontend SDK install, with code samplesreferences/authorization-patterns.md — Common createAuthorization shapes (viewer, designer, suborganization, theme/css, expiry, advanced properties). Multi-tenant isolation is covered only by multitenancy.references/api-actions.md — Full reference for the POST + action model, including include/pagination shapes and lowercase-plural response namingreferences/typescript-examples.md — Type-safe TypeScript interfaces for authorization tokens, slot configs, and API responsesreferences/common-mistakes.md — Detailed anti-patterns with error messages, root causes, and fixesreferences/dashboard-embedding.md — Saved dashboard/chart embedding by id. Covers component setup, dashboardId vs dashboardSlug, sizing, editMode, roles, events, and runtime control.references/local-development-proxy.md — Localhost CORS/realtime recipe for Flex, web-component dashboards, and IQ-rendered charts. Covers same-origin proxying for /0.1.0 and /realtime, and why appServer must stay pointed at the Luzmo app host.Fetch these for specific implementation details (and any guides they reference inline):
https://developer.luzmo.com/guide/dashboard-embedding--generating-an-authorization-token.mdhttps://developer.luzmo.com/api/createAuthorization.mdhttps://developer.luzmo.com/guide/api--overview.mdhttps://developer.luzmo.com/guide/dashboard-embedding--embed-into-application.mdWhen to escalate to other skills:
data-visualizationcustom-chartsanalytics-studiomultitenancy (SECURITY CRITICAL)data-integrationthemingai-analyticsresource-managementtroubleshooting FIRSTThis skill does NOT cover:
data-visualization)custom-charts)multitenancy)data-integration)Luzmo's API architecture differs from typical REST APIs. The most common mistakes involve authentication security, HTTP verbs, and action naming.
For detailed error patterns with symptoms and fixes, see references/common-mistakes.md.
Quick reference of top issues:
action field (⚠️ VERY COMMON)action: "search" instead of action: "get" (⚠️ VERY COMMON)action: "search" instead of action: "get"https://developer.luzmo.com/llms.txt, https://developer.luzmo.com/llms-full.txthttps://developer.luzmo.com/api/{action}{Resource}.mdhttps://developer.luzmo.com/guide/*.mdhttps://developer.luzmo.com/flex/charts/{type}.mdIf content exists on developer.luzmo.com, link — do not duplicate specs here.
npx claudepluginhub luzmo-official/agent-skills --plugin luzmo-agent-skillsProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.