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

You want toUseGuide
Store orders, subscriptions, devices or bookings next to customersklassesKlasses
Add your fields to customers, companies or conversationsklasses with metadata.standardKlasses
Show your data in the timeline or the insights panelkviewsKViews
Embed your own hosted UI next to the agentkviews with DynamicCard, or widgetsKViews, Widgets
Accept data from your platform and act on ithooks, triggers, workflowsWorkflows, actions and triggers
Let admins call your API from any workflowactionsActions
Call your API from your UI without exposing a keycommandsCommands
Ask each org for an API key, subdomain or preferencesettings, settingsPageConfigSettings
Connect to a third-party API with the admin's OAuth grantauth.oauth2OAuth for apps
Let your hosted service call the Kustomer API as a userredirectUris and the OAuth providerOAuth for apps
Receive Kustomer events in your service from every installoutboundWebhooksOutbound webhooks

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.

The lifecycle

Installing orgKustomer apps APIYouInstalling orgKustomer apps APIYouPOST /v1/apps/available (app definition)1Validate every component (dry run)2201, version registered3Install app version4Dry run in the org, then create components5Admin fills in settings, connects OAuth6POST a new version (bumped semver)7Update to the new version8Create new, update changed, remove dropped components9
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
  1. Register. You POST the definition. Kustomer validates every component against the services that will own it, so a broken workflow or KView fails registration with nothing half-created.
  2. 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.
  3. Configure. Admins fill in settings, connect any OAuth account, and review the workflows the app installed.
  4. Update. Each change ships as a new semver version. Installed orgs keep running their version until they update.

Your first app in five minutes

  1. Get an API key

    Create an API key with the org.admin.apps role in a sandbox org. Registering an app can't be undone from the UI, so don't experiment in production.

  2. 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."
      }
    }
  3. 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.json

    The 201 response contains the namespaced name, such as acme_orders_5f8481c6a22ab5b9d5f2dd8a, and the version ID acme_orders_5f8481c6a22ab5b9d5f2dd8a-0.1.0.

  4. Install it

    Open Settings › Apps › App Directory, find Acme Orders, and select Install. Or call the API:

    cURL
    curl -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"}'
  5. 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