Apps platform
Package custom objects, UI, automations, settings and integrations into one JSON app definition that any Kustomer org can install, configure and update.
A Kustomer app is a JSON document, the app definition, that declares everything an integration needs: custom objects and their attributes, UI inside the agent desktop, workflows and the actions and triggers they use, settings for admins, OAuth connections, and webhooks. You register the definition once. Each org that installs it gets every component created in their account, configured with their own settings, and updated when they choose to move to a new version.
You don't host anything for most apps. Kustomer stores and runs the KViews, workflows, actions, hooks and settings pages. You only host code when you want your own UI in an iframe or your own API behind an action.
What you can build
Private and public apps
A private app is registered by your org and can only be installed by your org. It's the right choice for internal tooling, for one customer's custom integration, and for developing and testing any app.
When you register a private app, Kustomer appends your org ID to its name to keep it globally unique: acme_orders becomes acme_orders_<orgId>. Component names are rewritten to match. See Register and install.
A public app appears in every org's App Directory. You build and test it as a private app, then submit the definition to Kustomer for review. Kustomer publishes the approved version under its plain name, without an org suffix.
The API you register private apps with only accepts "visibility": "private". See Publish to the marketplace.
The lifecycle
Diagram source
sequenceDiagram autonumber participant Dev as You participant Apps as Kustomer apps API participant Org as Installing org Dev->>Apps: POST /v1/apps/available (app definition) Apps->>Apps: Validate every component (dry run) Apps-->>Dev: 201, version registered Org->>Apps: Install app version Apps->>Apps: Dry run in the org, then create components Org->>Org: Admin fills in settings, connects OAuth Dev->>Apps: POST a new version (bumped semver) Org->>Apps: Update to the new version Apps->>Apps: Create new, update changed, remove dropped components
- Register. You
POSTthe definition. Kustomer validates every component against the services that will own it, so a broken workflow or KView fails registration with nothing half-created. - Install. An admin installs from Settings › Apps, or you call the install endpoint. Kustomer validates again in that org (for example, a name clash with a Klass the org already has) and then creates each component.
- Configure. Admins fill in settings, connect any OAuth account, and review the workflows the app installed.
- Update. Each change ships as a new semver version. Installed orgs keep running their version until they update.
Your first app in five minutes
Get an API key
Create an API key with the
org.admin.appsrole in a sandbox org. Registering an app can't be undone from the UI, so don't experiment in production.Write a definition
acme_orders.json{ "app": "acme_orders", "version": "0.1.0", "title": "Acme Orders", "description": "Orders from Acme, on the customer timeline.", "visibility": "private", "klasses": [ { "name": "acme_orders-order", "icon": "cart", "color": "#5B6CF9", "metadata": { "properties": { "orderNumberStr": { "displayName": "Order number" }, "totalNum": { "displayName": "Total" }, "placedAt": { "displayName": "Placed" } } } } ], "changelog": { "0.1.0": "{{October 2026}} First version." } }Register it
curl -X POST "https://acme.api.kustomerapp.com/v1/apps/available" \ -H "Authorization: Bearer $KUSTOMER_API_KEY" \ -H "Content-Type: application/json" \ --data @acme_orders.jsonThe
201response contains the namespaced name, such asacme_orders_5f8481c6a22ab5b9d5f2dd8a, and the version IDacme_orders_5f8481c6a22ab5b9d5f2dd8a-0.1.0.Install it
Open Settings › Apps › App Directory, find Acme Orders, and select Install. Or call the API:
cURLcurl -X POST "https://acme.api.kustomerapp.com/v1/apps/install" \ -H "Authorization: Bearer $KUSTOMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"app": "acme_orders_5f8481c6a22ab5b9d5f2dd8a", "version": "0.1.0"}'Use it
Create an order with
POST /v1/customers/{id}/klasses/acme_orders-order. Klass names aren't namespaced, so you use the name from your definition. The order appears on the customer's timeline with the cart icon.
Where to go next
Every top-level key, its type and its rules.
Custom objects and attributes on standard objects.
JSX in the timeline and insights panel, plus the Cards SDK.
Hooks in, actions out, workflows in between.
Endpoints, namespacing, errors and troubleshooting.
Review requirements and the submission checklist.