kelta CLI — Command Reference
Every kelta command group, command, flag and default — generated from the CLI command registry.
CLI version 0.1.0 · manifest v1 · output formats: table, json, yaml, csv, ndjson
Global flags on every command: --profile, --output, --raw, --quiet, --yes.
Full machine-readable catalog: kelta manifest.
auth#
kelta auth login writes the profile named by --profile (or KELTA_PROFILE), otherwise the default profile. Without an explicit profile, a --tenant that differs from the default profile’s saved tenant is refused (exit 2, PROFILE_TENANT_MISMATCH) and nothing is changed — log in to the other tenant as its own profile with --profile <name>. Re-login to the same tenant, a profile with no saved tenant, and any explicit --profile are written as asked. The output names the profile that was written.
kelta auth login#
Log in via the browser and store a PAT for a profile (—token for headless)
--url <url>— Kelta API URL (default: from the profile)--tenant <slug>— Tenant slug (default: from the profile; a different tenant needs an explicit —profile)--auth-url <url>— Auth server URL (default: profile value, or api.→auth. host derivation)--token <token>— Skip the browser: store this PAT (klt_…) or JWT--expires-in <days>— PAT lifetime in days (browser login) (default: “90”)--no-browser— Print the login URL instead of opening a browser
# Log in through the browser and save a 90-day PAT
kelta auth login --url https://api.kelta.io --tenant acme
# Headless login with an existing PAT
kelta auth login --url https://api.kelta.io --tenant acme --profile staging --token "$KELTA_TOKEN"
kelta auth logout#
Remove the stored credential for the active profile (—revoke also revokes it)
--revoke— Revoke the PAT server-side before removing it locally
kelta auth logout
# Revoke the PAT server-side, then forget it locally
kelta auth logout --revoke --profile staging
kelta auth status#
Show the resolved connection settings for the active profile
kelta auth status --profile staging --output json
token#
kelta token list#
List your active personal access tokens
kelta token list
kelta token create#
Create a personal access token (the full token is shown exactly once)
--name <name>— Token name--expires-in <days>— Lifetime in days (1-365) (default: “90”)
# Create a 30-day token for CI
kelta token create --name ci-deploy --expires-in 30
kelta token revoke <tokenId>#
Revoke a personal access token by id (destructive — needs —yes off-TTY)
kelta token revoke 3f6c1a52-8d2e-4b7a-9c1e-5a0d2f7b9e14 --yes
profile#
kelta profile list#
List configured profiles
kelta profile list
kelta profile use <name>#
Set the default profile
kelta profile use staging
kelta profile show [name]#
Show the resolved settings of a profile (default: active profile)
kelta profile show staging --output json
kelta profile remove <name>#
Remove a profile and its stored credential
kelta profile remove staging
kelta profile rename <oldName> <newName>#
Rename a profile (credential moves with it)
kelta profile rename default production
collections#
kelta collections list#
List all collections
kelta collections list
kelta collections describe <name>#
Show collection details and fields
kelta collections describe customers
kelta collections create#
Create a collection
--name <name>— API name (required)--display-name <label>— Display name--description <text>— Description--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta collections create --name invoices --display-name Invoices --description 'Customer invoices'
# Create from a JSON attributes file
kelta collections create --name orders --data @orders-collection.json
kelta collections update <collection>#
Update a collection (name or id)
--display-name <label>— Display name--description <text>— Description--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta collections update invoices --display-name 'Sales Invoices'
kelta collections delete <collection>#
Delete a collection and its data (destructive — needs —yes off-TTY)
--force— Confirm deletion of a collection that still has dependent data (attachments, layouts, reports, validation rules, field history, record versions, …); the server blocks the delete without this.
kelta collections delete invoices --yes
# Delete even though layouts and other dependent data exist
kelta collections delete invoices --force --yes
fields#
kelta fields list <collection>#
List the fields of a collection
kelta fields list customers
kelta fields add <collection>#
Add a field to a collection (friendly type aliases: text, number, picklist, reference, …)
--name <name>— Field API name (required)--type <type>— Field type alias or native enum (required)--display-name <label>— Display name--required— Field is required--unique— Unique constraint--indexed— Create an index--searchable— Full-text searchable--system-maintained— Only flows and server-side code may set the value; an API write that sets or changes it gets a 400 (seekelta docs jsonapi)--description <text>— Description--default <value>— Default value (true|false for BOOLEAN, a number for numeric types)--picklist <name|id>— Global picklist source (picklist types)--values <a,b,c>— Comma-separated field-scoped picklist values (picklist types, instead of —picklist)--reference <collection>— Target collection (reference types)--relationship-name <name>— Relationship name (reference types)--dimension <n>— Vector dimension (vector type)--data <json>— Extra attributes as JSON, @file, or - (merged last)
# Add a required currency field
kelta fields add invoices --name amount --type currency --required
# Picklist field with field-scoped values
kelta fields add orders --name status --type picklist --values draft,submitted,shipped --default draft
kelta fields update <fieldId>#
Update a field by id
--display-name <label>— Display name--required <bool>— true|false--system-maintained <bool>— true|false — set or clear the system-maintained flag (seekelta docs jsonapi)--description <text>— Description--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta fields update fld_123 --display-name 'Due Date' --required true
kelta fields remove <fieldId>#
Remove a field and its data (destructive — needs —yes off-TTY)
kelta fields remove fld_123 --yes
picklists#
kelta picklists list#
List global picklists
--name <name>— Filter by exact name
kelta picklists list
# Look up one picklist by exact name
kelta picklists list --name order_status
kelta picklists get <picklist>#
Show a global picklist with its values
kelta picklists get order_status
kelta picklists create#
Create a global picklist (optionally with initial values)
--name <name>— Picklist name (required)--description <text>— Description--values <list>— Initial values, comma-separated (value used as label)
# Create a picklist with four initial values
kelta picklists create --name order_status --description 'Order lifecycle' --values draft,submitted,shipped,cancelled
kelta picklists delete <picklist>#
Delete a global picklist (destructive — needs —yes off-TTY)
kelta picklists delete order_status --yes
kelta picklists value-add <picklist>#
Add a value to a global picklist
--value <value>— Stored value (required)--label <label>— Display label (default: the value)--sort <n>— Sort order (default: “0”)--default— Mark as the default value
kelta picklists value-add order_status --value returned --label Returned --sort 4
kelta picklists value-update <valueId>#
Update a picklist value by id
--value <value>— Stored value--label <label>— Display label--sort <n>— Sort order--active <bool>— true|false--default <bool>— true|false
kelta picklists value-update val_123 --label 'On hold' --sort 2
kelta picklists value-deactivate <valueId>#
Deactivate a picklist value (records keep it; new picks cannot use it)
kelta picklists value-deactivate val_123
validation-rules#
kelta validation-rules list <collection>#
List validation rules of a collection
kelta validation-rules list invoices
kelta validation-rules create <collection>#
Create a validation rule (record is REJECTED when —formula evaluates TRUE)
--name <name>— Rule name (required)--formula <formula>— ERROR condition — TRUE rejects the record (required)--message <text>— Error message shown to the user (required)--evaluate-on <when>— CREATE|UPDATE|CREATE_AND_UPDATE (default: “CREATE_AND_UPDATE”)--severity <level>— ERROR|WARNING (default: “ERROR”)--error-field <field>— Field to attach the error to--inactive— Create the rule inactive
# Reject invoices whose amount is zero or negative
kelta validation-rules create invoices --name positive_amount --formula 'amount <= 0' --message 'Amount must be positive' --error-field amount
# Warn on update when the due date is blank
kelta validation-rules create orders --name due_date_set --formula 'ISBLANK(due_date)' --message 'Set a due date' --evaluate-on UPDATE --severity WARNING
kelta validation-rules update <ruleId>#
Update a validation rule by id
--active <bool>— true|false--data <json>— Attributes as JSON, @file, or - (merged last)
# Deactivate a rule
kelta validation-rules update rule_123 --active false
kelta validation-rules update rule_123 --data '{"errorMessage": "Amount must be greater than zero"}'
kelta validation-rules delete <ruleId>#
Delete a validation rule (destructive — needs —yes off-TTY)
kelta validation-rules delete rule_123 --yes
constraints#
kelta constraints list <collection>#
List composite unique constraints of a collection
kelta constraints list orders
kelta constraints create <collection>#
Create a composite unique constraint (Postgres unique index; duplicates → 409)
--fields <list>— Field names, comma-separated (required)
# Make each order number unique per customer
kelta constraints create orders --fields customer,order_number
kelta constraints delete <collection> <indexName>#
Drop a composite unique constraint by index name (destructive — needs —yes off-TTY)
kelta constraints delete orders uq_orders_customer_order_number --yes
layouts#
kelta layouts list <collection>#
List page layouts of a collection
kelta layouts list customers
kelta layouts create <collection>#
Create a page layout (sections/fields via the UI or kelta api)
--name <name>— Layout name (required)--default— Mark as the default layout--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta layouts create customers --name 'Customer detail' --default
kelta layouts get <layoutId>#
Get a page layout by id
--tree— Fetch the whole layout as a tree (sections, field placements, related lists) — the documentlayouts apply --fileaccepts.
kelta layouts get lay_123
# Fetch the full tree, the shape layouts apply accepts
kelta layouts get lay_123 --tree --output json
kelta layouts apply <collection>#
Apply a layout tree file (sections, fields, related lists) to a collection
--file <path>— Layout tree JSON file — seelayouts get <id> --treefor the shape. Also accepts anapply_layout(MCP) argument file as-is:collectionName/layoutIdare stripped before forwarding, and alayoutIdaddresses the layout by id.--name <name>— Layout name (overrides the file’s own “name”; addresses the layout within the collection, creating it if it does not exist yet)
kelta layouts apply customers --file customer-layout.json
# Override the layout name from the file
kelta layouts apply customers --file customer-layout.json --name 'Customer detail'
kelta layouts update <layoutId>#
Update a page layout by id
--name <name>— Layout name--default <bool>— true|false--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta layouts update lay_123 --name 'Customer summary' --default true
kelta layouts delete <layoutId>#
Delete a page layout (destructive — needs —yes off-TTY)
kelta layouts delete lay_123 --yes
list-views#
kelta list-views list <collection>#
List saved list views of a collection
kelta list-views list orders
kelta list-views create <collection>#
Create a saved list view
--name <name>— List view name (required)--columns <list>— Displayed field names, comma-separated (required)--filter <spec>— Filter as field[.op]=value (repeatable) (repeatable)--sort <field>— Sort field, -prefix for descending--default— Mark as the default list view--visibility <vis>— PRIVATE (default), PUBLIC or GROUP--view-type <type>— Renderer: TABLE (default), KANBAN, CALENDAR or GALLERY--lane-field <field>— Kanban lane field (a picklist field)--card-fields <list>— Kanban card fields, comma-separated--data <json>— Extra attributes as JSON, @file, or - (merged last)
# Table view of open orders, newest first
kelta list-views create orders --name 'Open orders' --columns order_number,customer,amount,status --filter status=open --sort -createdAt
# Kanban board laned by status
kelta list-views create orders --name 'Order board' --columns order_number,amount --view-type KANBAN --lane-field status --card-fields customer,amount
kelta list-views apply <collection>#
Create-or-update a saved list view, keyed on (collection, name)
--name <name>— List view name (required)--columns <list>— Displayed field names, comma-separated (required)--filter <spec>— Filter as field[.op]=value (repeatable); always written as given (repeatable)--sort <field>— Sort field, -prefix for descending--row-limit <n>— Maximum rows rendered--default <bool>— true|false — omit to leave the current value alone--visibility <vis>— PRIVATE, PUBLIC or GROUP--view-type <type>— Renderer: TABLE, KANBAN, CALENDAR or GALLERY--lane-field <field>— Kanban lane field (a picklist field)--card-fields <list>— Kanban card fields, comma-separated--data <json>— Extra attributes as JSON, @file, or - (merged last)
# Create or update the shared Overdue view
kelta list-views apply invoices --name Overdue --columns invoice_number,customer,amount,due_date --filter status=unpaid --filter due_date.lt=2026-11-01 --sort due_date --visibility PUBLIC
kelta list-views update <listViewId>#
Update a saved list view by id
--name <name>— List view name--columns <list>— Displayed field names, comma-separated--filter <spec>— Filter as field[.op]=value (repeatable); replaces all filters (repeatable)--sort <field>— Sort field, -prefix for descending--default <bool>— true|false--visibility <vis>— PRIVATE, PUBLIC or GROUP--view-type <type>— Renderer: TABLE, KANBAN, CALENDAR or GALLERY--lane-field <field>— Kanban lane field (a picklist field)--card-fields <list>— Kanban card fields, comma-separated--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta list-views update lv_123 --columns order_number,customer,status --sort -amount
kelta list-views get <listViewId>#
Get a saved list view by id
kelta list-views get lv_123
kelta list-views delete <listViewId>#
Delete a saved list view (destructive — needs —yes off-TTY)
kelta list-views delete lv_123 --yes
pages#
kelta pages list#
List UI pages (screen builder)
kelta pages list
kelta pages get <pageId>#
Get a UI page by id
kelta pages get page_123 --output json
kelta pages create#
Create a UI page (draft — unpublished until pages publish)
--name <name>— Page name (required)--path <path>— Route the page is served at (required)--title <title>— Browser and header title--config <json>— Page config as JSON, @file, or - (layout, components, bindings)--active <bool>— true|false (default true)--data <json>— Extra attributes as JSON, @file, or - (merged last)
# Create a draft page at /home
kelta pages create --name Home --path /home --title 'Welcome' --config @home-config.json
kelta pages apply <file>#
Validate then create-or-update a UI page from a JSON file, keyed on path. Returns {action, id, path, changed, published} like apply_page — pass —raw for the full ui-pages record instead. (destructive — needs —yes off-TTY)
--dry-run— Validate config only; write nothing
# Validate the page config without writing
kelta pages apply home-page.json --dry-run
# Create or update the page keyed on its path
kelta pages apply home-page.json --yes
kelta pages update <pageId>#
Update a UI page by id
--name <name>— Page name--path <path>— Route the page is served at--title <title>— Browser and header title--config <json>— Page config as JSON, @file, or ---active <bool>— true|false--published <bool>— true|false--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta pages update page_123 --title 'Customer home' --published true
kelta pages delete <pageId>#
Delete a UI page (destructive — needs —yes off-TTY)
kelta pages delete page_123 --yes
kelta pages publish <path>#
Publish the UI page served at a route path (sets published=true). Returns {action: “published”|“unchanged”, id, path}.
kelta pages publish /home
menus#
kelta menus list#
List UI menus (apps/nav v2)
kelta menus list
kelta menus get <menu>#
Get a UI menu by name or id (—tree nests items by parentId)
--tree— Include menu items nested by parentId under attribute “items”
# Show the Sales menu with nested items
kelta menus get Sales --tree
kelta menus create#
Create a UI menu
--name <name>— Menu name (required)--description <text>— Description--icon <name>— Icon rendered beside the app label--display-order <n>— Ordinal position among sibling menus--default— Mark as the default menu--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta menus create --name Sales --icon briefcase --display-order 2
kelta menus apply#
Apply a menu tree file (items/groups) in one call, creating the menu if needed
--file <path>— Menu tree JSON file — seemenus get <name> --treefor the shape--name <name>— Menu name (overrides the file’s own “name”; creates the menu if it does not exist yet)
# Apply the tree using the file's own name
kelta menus apply --file sales-menu.json
# Apply the tree to the Sales menu, creating it if needed
kelta menus apply --file sales-menu.json --name Sales
kelta menus update <menuId>#
Update a UI menu by id
--name <name>— Menu name--description <text>— Description--icon <name>— Icon rendered beside the app label--display-order <n>— Ordinal position among sibling menus--default <bool>— true|false--active <bool>— true|false--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta menus update menu_123 --default true --display-order 1
kelta menus delete <menuId>#
Delete a UI menu (destructive — needs —yes off-TTY)
kelta menus delete menu_123 --yes
dashboards#
kelta dashboards list#
List dashboards
kelta dashboards list
kelta dashboards get <dashboardId>#
Get a dashboard by id (—components includes widgets sorted by row/column)
--components— Include dashboard components, sorted by rowPosition then columnPosition
# Include widgets in grid order
kelta dashboards get dash_123 --components
kelta dashboards create#
Create a dashboard (add widgets via kelta api — dashboard-components)
--name <name>— Dashboard name (required)--description <text>— Description--access-level <level>— PRIVATE (default), PUBLIC or HIDDEN--column-count <n>— Width of the dashboard grid in columns--dynamic— Widgets execute as —running-user-id rather than the viewer--running-user-id <id>— User a dynamic dashboard executes widgets as--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta dashboards create --name 'Sales overview' --access-level PUBLIC --column-count 12
kelta dashboards apply#
Apply a dashboard tree file (widgets) in one call, creating the dashboard if needed
--file <path>— Dashboard tree JSON file — seedashboards get <id> --componentsfor the shape--name <name>— Dashboard name (overrides the file’s own “name”; creates the dashboard if it does not exist yet)
# Apply widgets, creating the dashboard if needed
kelta dashboards apply --file sales-dashboard.json --name 'Sales overview'
kelta dashboards update <dashboardId>#
Update a dashboard by id
--name <name>— Dashboard name--description <text>— Description--access-level <level>— PRIVATE, PUBLIC or HIDDEN--column-count <n>— Width of the dashboard grid in columns--dynamic <bool>— true|false--running-user-id <id>— User a dynamic dashboard executes widgets as--data <json>— Extra attributes as JSON, @file, or - (merged last)
kelta dashboards update dash_123 --access-level PRIVATE --description 'Weekly sales KPIs'
kelta dashboards delete <dashboardId>#
Delete a dashboard (destructive — needs —yes off-TTY)
kelta dashboards delete dash_123 --yes
kelta dashboards validate <dashboard>#
Validate a dashboard’s widget configs (read-only; prints the API response as-is)
--data <json>— Body as JSON, @file, or - — e.g. {“components”:[…]} to validate unsaved widgets
kelta dashboards validate 'Sales overview'
kelta dashboards data <dashboard>#
Execute a dashboard’s widgets and print their data (read-only; API response as-is)
--data <json>— Runtime parameters as JSON, @file, or - (e.g. {“timeRange”:“LAST_30_DAYS”})
# Widget data for the last 30 days
kelta dashboards data 'Sales overview' --data '{"timeRange": "LAST_30_DAYS"}'
reports#
kelta reports list#
List saved reports
kelta reports list
kelta reports get <reportId>#
Get a report definition by id
kelta reports get rep_123 --output json
flows#
kelta flows list#
List flow definitions
kelta flows list --output json
kelta flows describe <flowId>#
Show a flow definition
kelta flows describe flow_123
kelta flows create#
Create a flow (definition JSON is the state machine)
--name <name>— Flow name (required)--type <type>— RECORD_TRIGGERED|SCHEDULED|AUTOLAUNCHED|SCREEN|NATS_TRIGGERED--definition <json>— Definition as JSON, @file, or - (required)--description <text>— Description--trigger-config <json>— Trigger config as JSON, @file, or ---active— Create the flow active (default: inactive)--step-logging <level>— FULL (every step with snapshots) | ERRORS_ONLY (snapshots only for a failed step) | NONE (only a failed step) (default: FULL)--retention-days <days>— Days a finished run and its step logs are kept, 1-3650 (default: the platform-wide window)
# Active flow that runs whenever an order is created
kelta flows create --name 'Notify on new order' --type RECORD_TRIGGERED --definition @order-flow.json --trigger-config '{"collection": "orders", "events": ["CREATE"]}' --active
# Scheduled flow that keeps runs for 30 days
kelta flows create --name 'Nightly cleanup' --type SCHEDULED --definition @cleanup.json --step-logging ERRORS_ONLY --retention-days 30
kelta flows update <flowId>#
Update a flow by id
--active <bool>— true|false--definition <json>— Definition as JSON, @file, or ---step-logging <level>— FULL (every step with snapshots) | ERRORS_ONLY (snapshots only for a failed step) | NONE (only a failed step)--retention-days <days>— Days a finished run and its step logs are kept, 1-3650 (default: the platform-wide window); “default” clears the override--data <json>— Extra attributes as JSON, @file, or - (merged last)
# Deactivate a flow
kelta flows update flow_123 --active false
# Replace the definition and reset retention to the platform default
kelta flows update flow_123 --definition @order-flow.json --retention-days default
kelta flows delete <flowId>#
Delete a flow with its execution history and step logs (refused while a run is RUNNING or WAITING) (destructive — needs —yes off-TTY)
kelta flows delete flow_123 --yes
kelta flows execute <flowId>#
Start a flow run (flows read input as $.input.
--input <json>— Flow input as JSON, @file, or ---test— Mark the run as a test execution--wait— Poll until COMPLETED/FAILED/CANCELLED (~5 min budget)
# Run with input read as $.input.orderId and wait for the result
kelta flows execute flow_123 --input '{"orderId": "rec_123"}' --wait
# Start a test run from a file
kelta flows execute flow_123 --input @input.json --test
kelta flows runs <flowId>#
List recent executions of a flow
--limit <n>— Max runs (default: “50”)
kelta flows runs flow_123 --limit 10
kelta flows run <executionId>#
Show one execution (—steps for per-step detail)
--steps— Include per-step detail
# Show an execution with per-step detail
kelta flows run exec_123 --steps
kelta flows cancel <executionId>#
Cancel a running execution (destructive — needs —yes off-TTY)
kelta flows cancel exec_123 --yes
kelta flows retry <executionId>#
Retry an execution (new run)
--mode <mode>— full|from-failure (default: “full”)
# Resume from the failed step
kelta flows retry exec_123 --mode from-failure
kelta flows publish <flowId>#
Publish the current flow definition as a new version
--summary <text>— Change summary
kelta flows publish flow_123 --summary 'Add approval step'
kelta flows versions <flowId>#
List published versions of a flow
kelta flows versions flow_123
kelta flows webhook-url <flowId>#
Show the inbound webhook URL of an AUTOLAUNCHED flow
kelta flows webhook-url flow_123
users#
kelta users list#
List platform users
--search <text>— Search filter (name/email contains)--status <status>— ACTIVE|INACTIVE--page <n>— Page number (default: “1”)--size <n>— Page size (default: “20”)
kelta users list --search jane --status ACTIVE --size 50
kelta users get <userId>#
Show one user
kelta users get usr_123
kelta users invite <userId>#
Send (or resend) the invite email to an existing user
kelta users invite usr_123
kelta users portal-invite#
Invite a portal (external) user
--email <email>— Email address--data <json>— Full request body as JSON, @file, or - (wins on collision)
kelta users portal-invite --email jane@acme.example
# Send the full request body from a file
kelta users portal-invite --data @portal-user.json
kelta users reset-password <userId>#
Trigger a password reset for a user (destructive — needs —yes off-TTY)
kelta users reset-password usr_123 --yes
kelta users token-create <userId>#
Mint a personal access token on a user’s behalf (requires MANAGE_USERS) (destructive — needs —yes off-TTY)
--name <name>— Token name--expires-in <days>— Lifetime in days (1-365) (default: “90”)
# 30-day token for a user
kelta users token-create usr_123 --name 'CI deploy' --expires-in 30 --yes
kelta users logins <userId>#
Show a user’s login history
--size <n>— Page size (default: “20”)
kelta users logins usr_123 --size 10
tenants#
kelta tenants bootstrap-token <slug>#
Mint a short-lived PAT as a tenant’s admin (requires MANAGE_TENANTS; prints the token once)
--expires-in <duration>— Lifetime: 30m, 2h or ISO-8601 (PT2H); max 24h (default: “1h”)--user-id <id>— A user of that tenant (default: the tenant’s seeded System Administrator)
# Short-lived admin token for the acme tenant
kelta tenants bootstrap-token acme --expires-in 30m
limits#
kelta limits get#
Show tenant governor-limit status
kelta limits get
kelta limits set-tier <tier>#
Set the tenant governor tier (destructive — needs —yes off-TTY)
kelta limits set-tier PROFESSIONAL --yes
kelta limits set#
Override individual governor limits (raw limits map, persisted per tenant) (destructive — needs —yes off-TTY)
--data <json>— Limits map as JSON, @file, or - (required)
# Override the daily API call limit
kelta limits set --data '{"apiCallsPerDay": 50000}' --yes
audit#
kelta audit setup#
Recent setup (metadata) audit entries
--since <iso>— Only entries at/after this ISO timestamp--size <n>— Page size (max 200) (default: “50”)
kelta audit setup --size 20
# Entries since 1 October 2026 as JSON
kelta audit setup --since 2026-10-01T00:00:00Z --output json
kelta audit security#
Recent security audit log entries
--since <iso>— Only entries at/after this ISO timestamp--size <n>— Page size (max 200) (default: “50”)
kelta audit security --size 20
# Entries since 1 October 2026 as JSON
kelta audit security --since 2026-10-01T00:00:00Z --output json
kelta audit logins#
Recent login history
--since <iso>— Only entries at/after this ISO timestamp--size <n>— Page size (max 200) (default: “50”)
kelta audit logins --size 20
# Entries since 1 October 2026 as JSON
kelta audit logins --since 2026-10-01T00:00:00Z --output json
records#
kelta records list <collection>#
List records in a collection
--filter <spec>— Filter as field[.op]=value (repeatable) (repeatable)--sort <fields>— Sort fields, comma-separated, -prefix for desc--fields <fields>— Sparse fieldset, comma-separated--include <rels>— Related resources to include, comma-separated--page <number>— Page number (default: “1”)--size <number>— Page size (max 200) (default: “25”)--all— Auto-paginate through every page (client cap 10k records)
# Newest 50 active customers
kelta records list customers --filter status=active --sort -createdAt --size 50
# Every order of 100 or more, three fields each
kelta records list orders --filter amount.gte=100 --fields id,amount,status --all
kelta records get <collection> <id>#
Get a single record
--include <rels>— Related resources to include--fields <fields>— Sparse fieldset, comma-separated
kelta records get orders rec_123 --include customer
kelta records create <collection>#
Create a record
--data <json>— Attributes as JSON, @file, or - for stdin
kelta records create customers --data '{"name": "Acme Ltd", "status": "active"}'
# Attributes from a file
kelta records create orders --data @order.json
kelta records update <collection> <id>#
Update a record (partial)
--data <json>— Attributes as JSON, @file, or - for stdin
kelta records update orders rec_123 --data '{"status": "shipped"}'
kelta records delete <collection> <id>#
Delete a record (destructive — needs —yes off-TTY)
kelta records delete customers rec_123 --yes
kelta records bulk#
Apply a batch of atomic operations (all-or-nothing, max 100 ops) (destructive — needs —yes off-TTY)
--data <json>— Body as JSON, @file, or - : {“atomic:operations”:[{op,data|ref},…]} (required)
# Apply a JSON:API atomic:operations document, all-or-nothing
kelta records bulk --data @ops.json --yes
kelta records search <query>#
Full-text search across collections (query min 3 chars)
--limit <n>— Max results (max 100) (default: “20”)
kelta records search acme --limit 5
kelta records semantic-search <collection> <query>#
Vector similarity search within one collection (needs a VECTOR field)
--limit <n>— Max results (default: “10”)
kelta records semantic-search orders 'late delivery complaints' --limit 3
notifications#
kelta notifications list#
List your own in-app notifications, newest first
--unread— Only unread notifications--page <n>— Page number (default: “1”)--size <n>— Page size (max 200) (default: “20”)
kelta notifications list
# Only what is still unread
kelta notifications list --unread --size 50
metadata#
kelta metadata export#
Export this tenant’s metadata as a package file
-n, --name <name>— Package name (default: the tenant slug)-v, --version <version>— Package version (default: 1.0.0)--collections <list>— Collection names, comma-separated: export only these, with their validation rules, page layouts, list views, record-triggered flows, global picklists and the dashboards with a widget on them (default: the whole tenant)--exclude <types>— Item types to leave out, comma-separated: list-view, dashboard, flow, page-layout, validation-rule, ui-page, ui-menu (list views and dashboards are exported by default; seed records never are)-o, --out <file>— Output file (default: the name the server returns)
# Export the whole tenant
kelta metadata export --out metadata.json
# Export two collections without their list views and dashboards
kelta metadata export --collections customers,orders --exclude list-view,dashboard --name sales -v 1.2.0
kelta metadata diff <file>#
Preview a package file against this tenant (dry run, no writes): creates, updates with their changed attributes, unchanged counts, conflicts
kelta metadata diff metadata.json
kelta metadata apply <file>#
Apply a package file to this tenant (metadata items, then its seed records section) (destructive — needs —yes off-TTY)
--dry-run— Validate without writing--conflict <mode>— On an item that already exists: skip (default) or overwrite (seed records are always skipped) (default: “skip”)
# Validate without writing
kelta metadata apply metadata.json --dry-run
# Apply, overwriting items that already exist
kelta metadata apply metadata.json --conflict overwrite --yes
sandbox#
A sandbox is its own tenant with its own users, not a view into the parent tenant — the parent’s PAT or session has no membership there and is refused on sandbox-tenant paths. sandbox create prints a one-time admin credential for the new tenant plus its sign-in URL (signInUrl, <ui-base-url>/<slug>/login) and API base URL (apiBaseUrl, <external-base-url>/<slug>); the worker builds both from kelta.ui-base-url (KELTA_UI_BASE_URL) and kelta.external-base-url (EXTERNAL_BASE_URL). Sign in at the printed URL, or authenticate via POST /auth/direct-login on the auth server (not the API host) with username, password and tenantSlug from the printed output, or run kelta auth login against the sandbox slug (browser login) and then kelta token create to mint a PAT scoped to it. By default the sandbox is a clone of the parent’s metadata (collections, fields, picklists, layouts, list views, flows, dashboards, menus, pages). sandbox create --empty sends cloneMetadata: false and creates it with the system defaults only — system collections, default profiles and the admin — while keeping the parent’s edition, settings, limits and IP allowlist; use it for a clean tenant to build a template, package or reproduction in. sandbox status and sandbox list show clone_mode (CLONED or EMPTY). An empty sandbox cannot be refreshed: sandbox refresh would clone the parent’s metadata into it, so it answers 409 EMPTY_SANDBOX_REFRESH; delete it and create one without --empty to get a clone.
kelta sandbox create#
Create a sandbox environment (prints one-time admin credentials)
-n, --name <name>— Environment name-d, --description <description>— Environment description--empty— Create the sandbox without cloning the parent’s metadata: system collections, default profiles and the admin only (it cannot be refreshed)
kelta sandbox create --name staging --description 'Pre-release testing'
# Create a sandbox without cloning the parent's metadata
kelta sandbox create --name uat --empty
kelta sandbox list#
List environments
kelta sandbox list --output json
kelta sandbox status <envId>#
Show environment status (with —wait, poll until ACTIVE or FAILED)
--wait— Poll until the environment reaches ACTIVE or FAILED
# Wait until the sandbox is ready
kelta sandbox status env_123 --wait
kelta sandbox refresh <envId>#
Refresh a sandbox environment from its source (an —empty sandbox is refused with 409) (destructive — needs —yes off-TTY)
kelta sandbox refresh env_123 --yes
kelta sandbox delete <envId>#
Delete a sandbox environment (archives it; decommissions the backing tenant) (destructive — needs —yes off-TTY)
kelta sandbox delete env_123 --yes
promote#
kelta promote create#
Create a promotion from a source to a target environment
-s, --source <envId>— Source environment id-t, --target <envId>— Target environment id--type <type>— Promotion type: FULL or SELECTIVE (default: “FULL”)--conflict <mode>— Conflict mode: skip or overwrite (default: “skip”)--item <spec>— Item to promote as TYPE:name (repeatable, for SELECTIVE promotions) (repeatable)
# Full promotion
kelta promote create --source env_123 --target env_456
# Promote two collections, overwriting existing ones
kelta promote create --source env_123 --target env_456 --type SELECTIVE --item collection:orders --item collection:invoices --conflict overwrite
kelta promote preview#
Preview the changes a promotion from a source environment would make
-s, --source <envId>— Source environment id
kelta promote preview --source env_123
kelta promote approve <id>#
Approve a promotion (a promotion cannot be approved by its creator)
kelta promote approve prm_123
kelta promote execute <id>#
Execute a promotion (with —wait, poll until COMPLETED or FAILED) (destructive — needs —yes off-TTY)
--wait— Poll until the promotion reaches COMPLETED or FAILED
# Execute and wait for COMPLETED or FAILED
kelta promote execute prm_123 --wait --yes
kelta promote status <id>#
Show a promotion and its item counts
kelta promote status prm_123
kelta promote rollback <id>#
Roll back an executed promotion (destructive — needs —yes off-TTY)
kelta promote rollback prm_123 --yes
sdk#
kelta sdk types#
Generate TypeScript types from this tenant’s live OpenAPI document
-o, --out <file>— Output file (default: kelta-types.ts)
kelta sdk types --out src/kelta-types.ts
(top level)#
kelta manifest#
Print the machine-readable command catalog (JSON Schema per command)
--group <group>— Only commands of one group
# Every command with its JSON Schema
kelta manifest
# Only the records commands
kelta manifest --group records
kelta version#
Show detailed build information
kelta version --output json
kelta update#
Self-update from the cluster downloads service (—check only reports)
--check— Report whether an update exists without installing
# Report whether a newer version exists
kelta update --check
kelta update
kelta api <method> <path>#
Raw API escape hatch: profile auth + tenant prefix applied, response verbatim (destructive — needs —yes off-TTY)
--data <json>— Request body as JSON, @file, or - (any JSON value)--header <h>— Extra header as Name:value (repeatable) (repeatable)
kelta api GET '/api/customers?page[size]=5'
# Update a record with a raw JSON:API body
kelta api PATCH /api/customers/rec_123 --data '{"data":{"type":"customers","id":"rec_123","attributes":{"status":"active"}}}' --yes
kelta docs [topic]#
Print a reference doc (the agent guide or an authoring topic), or list every topic
# List every doc topic
kelta docs list
# Same as `kelta docs list`
kelta docs
# Print the agent guide
kelta docs agent
mcp#
kelta mcp serve#
Run a stdio MCP server: hosted kelta-mcp tools bridged + cli_ local tools
--toolset <set>— user|admin|all (default: “all”)--source <source>— auto|remote|local (default: “auto”)--mcp-url <url>— Hosted MCP base URL (default: the profile’s API origin)--tenant <slug>— Serve this tenant (e.g. a sandbox) instead of the profile’s; needs its token--token-env <var>— Env var holding the —tenant token (keeps it out of argv and client config)--enable-api-tool— Expose the raw cli_api escape hatch (off by default)
# Serve all toolsets for the current profile
kelta mcp serve
# Serve the user toolset for a sandbox tenant
kelta mcp serve --toolset user --tenant acme-staging --token-env KELTA_STAGING_TOKEN
kelta mcp install <client>#
Print MCP client configuration for this profile (stdio bridge by default)
--toolset <set>— user|admin|all (default: “all”)--direct— Hosted HTTP config instead of the stdio bridge--tenant <slug>— Bridge this tenant (e.g. a sandbox) instead of the profile’s--token-env <var>— Env var the launched server reads the —tenant token from (required with —tenant)
kelta mcp install claude-code
# Bridge a sandbox tenant with the admin toolset
kelta mcp install cursor --toolset admin --tenant acme-staging --token-env KELTA_STAGING_TOKEN
Generated from the CLI command registry —
view the source
and run npm run gen:docs in kelta-web to update.