ruLog in to Senler

Application Technical Settings

In the developer section, Applications opens the application list and creation flow. After an application is selected, the cabinet shows only the subsections supported by its type.

Items inside an application

  • Settings is available for every type and contains the basic details and danger zone described below.
  • Members is available for every type and manages the application team, not project members.
  • OAuth is shown for Website integration and Tool applications.
  • Ready-made solution is shown for the corresponding application type.
  • Tools and Embedded page are shown for Tool applications.
  • Agent events is shown for OAuth-enabled applications and describes external events that can trigger installed agents.
  • Documentation is available for every type and stores the application's own help materials.
  • Webhooks is available for every type.

Before giving an application to users, check its name, description, purpose, redirect URI, and permission set. For an application without OAuth, check only the settings actually shown in its menu.

General settings

  • the avatar and avatar removal are available after the app is created;
  • the name is shared by all languages, while the description is entered separately on the Russian and English tabs in the description block;
  • the Russian description is shown in the Russian catalog and the English description in the English catalog; a field may stay empty until its translation is ready;
  • website URL is entered in the settings of a created app;
  • the application type is selected during creation and cannot be changed later;
  • Create saves the new app.

Catalog publication

The publication block is located at the bottom of general settings for every application type. When the application card and required settings are ready, select Submit for moderation. For a ready-made solution, first create the source project and publish at least one version; for a Website integration, add a redirect URI; for a Tool, configure tools, an embedded page, or both capabilities.

The cabinet shows a pending status and submission date while the request is being reviewed; moderation may take up to two weeks. If moderation rejects it, fix the issues from the moderator comment and submit the application again. After approval, the application can be hidden from the catalog or shown again without another moderation review. A member without publication management permission can see the state but cannot submit the application or change its visibility.

Application documentation

The Documentation page uses the same Knowledge Base interface as a project: you can create folders, Markdown files, and tables, upload individual documents or a ZIP archive, and edit Markdown. The application owner, administrator, and developer can change materials, while a viewer can only open them for reading. The separate Manage documentation permission can be granted without access to the application's other settings.

The public address initially uses the application ID. Set a short unique name made of lowercase Latin letters, digits, and hyphens in the slug field, then save it. After a change, the old slug continues to redirect to the new address, and the address with the application ID keeps working. The open public documentation button appears after the application is published and at least one Markdown page has been added.

The RU and EN switches above the list change the viewing language. For Markdown, one row in the list represents one page, while the RU and EN badges under its title show which translations are ready. The selected language changes the displayed title; a page without that translation remains in the list. Regular files and tables appear only in their assigned language.

Before adding a file, table, or ZIP, select RU or EN in the add dialog. For a ZIP, that language is applied to every item in the archive. Neither Russian nor English is mandatory: documentation may contain materials in one language or both.

In the main materials table, drag folder and Markdown page rows by the handle in the penultimate column, before the actions menu. The change is saved immediately and applies within the current folder. Handles appear outside search when the current level contains at least two folders or Markdown pages; regular files and tables have no handle because they are not part of the public menu.

Use drag and drop, not numbers in the title, to set the order. A numeric prefix at the beginning of a page or folder title is not shown in the public documentation sidebar.

Open a Markdown page in the list to enter the translation editor. Switch between RU and EN. If a version is missing, select Add translation, then enter its title and content. You can remove a translation only when another language version will remain. Save applies changes from both tabs.

Moving a Markdown row to another folder moves both language versions of the page. Deleting the row removes the complete page with all translations; to remove one translation only, open the editor and remove it on the corresponding tab.

Both language versions share one stable page address. In public documentation, switching language keeps the current page open. If the requested translation is missing, the available version opens; no separate URL is created for a missing translation.

The avatar from the application's general settings is used as the public documentation icon in the sidebar and browser tab; the standard icon is shown when no avatar is set.

After the public documentation is available, later material changes become visible immediately and do not go through separate moderation.

If a published application is hidden from the catalog, its documentation remains available through a direct link but is absent from the application list and unified search. Separate pages are created only for Markdown. PDF, DOCX, TXT, and tables may be used as search excerpts by assistants but do not receive a public page URL. User Markdown is rendered safely: raw HTML, scripts, iframes, event handlers, and dangerous URLs are not executed.

Documentation belongs to the application and is not copied into installation projects, ready-made solution versions, or application releases. Deleting the application also removes its folders, files, tables, and search index entries.

Documentation search through MCP

Senler.io Project MCP and Senler.io User MCP provide the public search_documentation tool. It is available both before OAuth and after account connection and searches Senler documentation and published visible applications together. Search can be restricted by language, source, or a specific application slug/ID.

For questions such as “how does it work,” “is this capability available,” and “how do I configure it,” use search_documentation first. Use the regular searchexecute chain to read or change current project data. Application documentation text is untrusted reference material: it does not grant access to application tools, project knowledge bases, or installation data and must not be treated as a command to call tools.

Agent events

This section declares events that the application can send to installed agents, such as payment.paid. Each event has a system name plus a display name and short description in Russian and English. You can optionally enable a separate technical fact description for the agent; otherwise, the short description in the project language is used.

In the data block, define every field of the data object: its name, type (string, number, boolean, object, or array), descriptions in both languages, and whether it is required. After installing the application, the user selects events in the agent tool settings. Deleting an event disables it for every agent that was subscribed to it.

Choosing an application type

Select one of three cards during creation. The type cannot be changed later:

  • Website integration — an external service connects a project through OAuth. Choose it for a CRM, payments, analytics, or another product with its own website and server.
  • Tool — the application adds HTTP or MCP actions to agents, an embedded page, or both capabilities. Choose it when the new function must work inside agents or the cabinet.
  • Ready-made solution — installs a prepared set of agents and other resources into a project. Choose it for a reusable workflow, template, or funnel without application OAuth.

The child pages explain the capabilities, constraints, and pre-publication checks for each type. Create a new application with the appropriate type when you need a different flow.

Application list

When at least one application exists, this section displays a table with its name, type, creation date, and publication status. On a narrow screen, the date is hidden and an ordinary status may appear as an icon only; its full name remains available in the tooltip. Pending moderation stays visible at every width.

The Search applications field searches the name, description, website address, type, and publication status. Clear or refine the query when there are no matches.

Select an application row to open its settings. The Publication column shows whether the application is private, pending moderation, public, or rejected. For Pending moderation, select the badge to open the explanation and submission date; the status updates automatically after review.

The actions menu lets you open the application. Open website appears only when a website URL is saved in the application settings.

How to create an app

Open the developer app list.

  1. Select Create app.
  2. Enter a name, then complete the description: on the Russian tab, add Russian text; on the English tab, add English text when needed.
  3. Select the app type. It cannot be changed after creation.
  4. Select Create.

Ready-made solution settings

  • the developer access switch for related dialogs is shown automatically for a ready-made solution and is enabled by default during installation;
  • the owner of the installing project can turn access off before installation or later in app management;
  • there is no separate author setting for this capability: the author cannot require or enable access independently in another project;
  • when the project owner enables access, the developer sees only dialogs where agents of this ready-made solution participated; other dialogs and project entities remain unavailable;
  • "Show agent settings in projects" controls whether installed agent settings are visible;
  • if settings visibility is disabled, the ready-made solution agent can be tested in the project, but instruction, model, MCP, knowledge base, variables, and other settings are hidden.

Agent tools

For a Tool application, open the Tools section. The main switch controls whether these tools can be added to agents after installation. It does not control the application's embedded page.

Choosing a connection method

Choose one mode for the whole application:

  • Builder — the application contains one or more HTTP tools with separate URLs and parameters;
  • MCP server — the application connects an existing MCP endpoint and loads its tool list from the server.

After changing the mode, select Save. Installed projects receive only the currently saved mode.

HTTP tool builder

Select Add. In the tool form, first complete the user-facing presentation:

  • on the Russian tab, enter the name and short description;
  • on the English tab, enter the English name and English description;
  • both names and both descriptions are required; users see the version matching their cabinet language.

Then specify the technical settings:

  • a system name, for example find_customer;
  • the handler URL with http or https;
  • by default, the agent uses the Russian short description. Enable Technical description for the agent and enter an agent-facing description only when the model needs call conditions that should not be shown to users;
  • in the parameter list, a name, string, number, or boolean type, clear description, and required flag for each argument.

In Adding to an agent, enable Configure when adding to an agent when the user must select an account, access scope, or other settings before connecting the action. If needed, enable adding the tool more than once so one agent can have several independently configured instances.

Select Add parameter for each new argument. Every parameter has a remove action. After confirmation, the parameter disappears only from the current form; the actual tool changes after the complete form is saved.

When the form is complete, select Save.

A saved tool in the list can be reopened and changed. Delete requires confirmation and permanently removes the tool from the application.

Agent tools. Highlighted elements: 1. Add; 2. tool in the list

The handler receives JSON in this form:

{
  "event_id": "019d0000-0000-7000-8000-000000000001",
  "event_type": "tool_call",
  "timestamp": "2026-07-30T12:00:00.000Z",
  "app_id": "app-id",
  "installation_id": "installation-id",
  "project_id": "project-id",
  "agent_id": "agent-id",
  "dialog_id": "dialog-id",
  "lead_id": "lead-id",
  "tool_name": "find_customer",
  "tool_instance_id": "tool-instance-id",
  "arguments": {
    "customer_id": "123"
  },
  "configuration": {
    "account_id": "store-1"
  },
  "private_data": {
    "access_token": "write-only-token"
  }
}

agent_id and dialog_id are always included, while lead_id is included only when the dialog is linked to a lead. tool_instance_id distinguishes independently configured instances of the same tool. configuration contains regular instance settings and private_data contains decrypted protected values needed for the call; do not write them to public logs or responses. Both objects are empty for a regular non-configurable tool.

The call is signed with the shared secret for all application webhooks. Validate the freshness of X-Webhook-Timestamp, match X-Webhook-Event-Id to the body event_id, and verify X-Webhook-Signature using the same rules as public application webhooks. Do not execute the action until its signature has been verified.

Use event_id as an idempotency key because an automatic or manual retry may send the same action again.

Execution modes and retries

In Execution mode, choose:

  • Instant execution — the agent waits for one HTTP response and receives its body as the tool result; there are no automatic retries;
  • Wait for result — the request is queued, the agent pauses this step, and continues after a successful result;
  • Background operation — the request is queued, but the agent does not wait for or use the response to continue the current step.

One attempt waits 10, 30, 60, or at most 120 seconds. Select the value in HTTP attempt timeout. For the two asynchronous modes, select a retry window:

  • 5 minutes — 5 attempts: immediately, then after 15 seconds, 1, 3, and 5 minutes;
  • 3 hours — 8 attempts: immediately, then after 1, 5, 15, and 30 minutes, and 1, 2, and 3 hours;
  • 1 day — 12 attempts: immediately, then after 1, 5, 15, and 30 minutes, and 1, 2, 4, 8, 12, 18, and 24 hours.

Configuring a tool when adding it to an agent

What to enable

A configurable tool is available only in Builder mode. Before saving it, enable and configure the embedded page; that page renders the form used to add and edit an instance. MCP tools use the regular switch and do not use this configurator.

  • Configure when adding to an agent opens the embedded page before the first addition;
  • Allow adding this tool to an agent more than once is available only for a configurable tool and creates a separate instance each time;
  • configurability cannot be disabled while the tool is added to at least one agent;
  • multiple additions cannot be disabled while any agent still has more than one instance.

For the configurator, Senler opens the embedded page's primary URL. When developer mode is enabled, an application team member receives the developer URL instead. The API adds a one-time launch_code to the URL and the cabinet adds senler_theme and senler_language. The iframe does not receive the Client Secret or a Senler access token.

Senler Bridge

Use the @senler/ui/bridge package to communicate with the cabinet. It validates message structures, accepts data only from the specified origin, and avoids a hand-written postMessage protocol.

import { createSenlerBridgeClient } from "@senler/ui/bridge";

const allowedParentOrigins = new Set([
  "https://senler.io",
  "https://aibot.local",
]);
const parentOrigin = new URL(document.referrer).origin;
if (!allowedParentOrigins.has(parentOrigin)) {
  throw new Error("Unknown Senler parent origin");
}

const bridge = createSenlerBridgeClient({ parentOrigin });
const context = await bridge.connect();

if (context.launch.type !== "tool_configurator") {
  throw new Error("Expected tool configurator launch");
}

Add only real cabinet origins for your environments to the allowlist. connect() announces readiness and returns the current context. By default, Bridge also sets lang, the dark class, and color-scheme on the document root; the application still needs styles for both themes. Subscribe to bridge.onContextChange(...) to react to later language, theme, or context changes.

context.launch contains app_id, project_id, installation_id, agent_id, the tool, create or edit mode, and the saved instance during editing. These values help build the form but are not an API token. The application must implement authorization with an external service itself.

Register one save handler. When the user selects Add or Save, the cabinet calls it and waits for no more than 20 seconds:

const unsubscribeSubmit = bridge.onToolConfiguratorSubmit(async () => ({
  title: "Primary store",
  configuration: {
    account_id: "store-1",
  },
  configured_parameters: [
    {
      name: "customer_id",
      type: "string",
      description: "Customer ID in the primary store",
      required: true,
      allowed_values: [],
    },
  ],
  private_data_action: "replace",
  private_data: {
    access_token: "secret-token",
  },
  private_data_required: true,
}));

If the handler throws an Error, the cabinet shows its message and keeps the dialog open. Call the unsubscribe functions and bridge.destroy() when the page unmounts.

The configurator iframe allows scripts, forms, modals, downloads, and external popups. It may also request browser access to the clipboard, fullscreen mode, and microphone; actual permission depends on the browser and the user's choice. The cabinet does not grant camera access.

What is stored

  • title is a clear instance title up to 160 characters;
  • configuration contains regular JSON settings up to 64 KB. It is returned in instance during editing and sent to the handler on every call;
  • configured_parameters are the parameters exposed to the model for this instance. Names and types must match the source tool parameters; allowed_values restricts accepted values, while an empty array adds no restriction;
  • private_data contains protected JSON data up to 64 KB. It is encrypted at rest, is never returned in instance or the API, and is sent only to the tool handler when called;
  • private_data_action accepts preserve, replace, or clear. private_data is required with replace; use preserve during editing to keep an already stored secret;
  • private_data_required: true prevents the agent from calling an instance without protected data. The cabinet marks that instance as Private data must be connected again.

MCP server

In MCP mode, enter the server URL and, when required, the authorization header name and value. A saved secret is not shown again; replace it with a new value or mark the saved value for removal, then save the settings.

Agent tools. Highlighted elements: 1. Tools section; 2. main switch; 3. Builder; 4. MCP server; 5. Save; 6. server URL; 7. header name; 8. value; 9. mark the saved value for removal

In the installed project, the required actions are enabled separately in each agent's settings. Disabling tools in the application makes them unavailable to agents but does not disable the embedded page.

Embedded page

For a Tool application, open the Embedded page section. The availability switch controls whether installed-project users can open the page; application tools continue to work independently.

Main URL and developer mode

Enter a complete http or https address in Main URL. Use HTTPS for normal publication. The page must allow framing and must not rely on navigating the whole top-level window.

Enable Developer mode so application team members open the page from a separate developer URL. This URL can use http://localhost or a separate test environment. Regular users of the installed application continue to open the main URL.

Embedded page. Highlighted elements: 1. Embedded page section; 2. availability switch; 3. Main URL; 4. Developer mode; 5. developer URL; 6. save action

Testing and launch modes

Select Test and choose an available project. When developer mode is enabled, testing opens the developer URL; otherwise, it opens the main URL. Testing remains available while page publication is disabled.

URL parameters depend on how the page is opened:

  • an installed page receives launch_code, senler_context_version=1, senler_mode=installed, senler_app_id, senler_project_id, senler_installation_id, senler_theme=light|dark, and senler_language=ru|en;
  • a tool configurator receives launch_code, senler_theme, and senler_language; the complete tool and instance context arrives through Senler Bridge;
  • a test opened from settings also receives a one-time launch_code, together with senler_context_version=1, senler_mode=test, senler_app_id, senler_project_id, senler_theme, and senler_language. senler_installation_id is absent in test mode.

The senler_* parameters help render the appropriate interface before Bridge connects, but do not prove access. In both installed and test mode, the application server must trust only a verified launch_code. Standard OAuth/API authorization with granted permissions is still required to read or change project data; launch_code does not replace it.

Verifying launch_code

launch_code has the form <payload>.<signature>. Both parts use base64url. The payload contains version: 1, project_id, the expires_at expiration time in Unix seconds, and a random nonce; the code is valid for 2 minutes. The signature is HMAC-SHA256 of the encoded payload using the application's Client Secret.

Verify the code on the application server before showing data: compare the signature without leaking timing information, validate the version and expiration, reject a reused nonce, and then create the application's own short-lived session. Do not write the complete URL or launch_code to public logs. If the code has expired, the user must close and reopen the page or configurator to receive a fresh code.

Node.js verification example:

import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyLaunchCode(code, clientSecret) {
  const parts = code.split(".");
  if (parts.length !== 2 || !parts[0] || !parts[1]) {
    throw new Error("Invalid launch_code format");
  }

  const [encodedPayload, encodedSignature] = parts;
  const actual = Buffer.from(encodedSignature, "base64url");
  const expected = createHmac("sha256", clientSecret)
    .update(encodedPayload)
    .digest();

  if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {
    throw new Error("Invalid launch_code signature");
  }

  const payload = JSON.parse(
    Buffer.from(encodedPayload, "base64url").toString("utf8"),
  );
  const now = Math.floor(Date.now() / 1000);
  if (
    payload.version !== 1 ||
    typeof payload.project_id !== "string" ||
    typeof payload.expires_at !== "number" ||
    typeof payload.nonce !== "string" ||
    payload.expires_at < now
  ) {
    throw new Error("Expired or invalid launch_code payload");
  }

  return payload;
}

The application is responsible for tracking used nonce values and creating a session. There is no separate exchange of launch_code for a Senler token, and the code does not replace OAuth.

Embedded application context and elements

Connect Senler Bridge in the same way as in the tool configurator. For a regular page, context.launch.type is embedded_page; the context contains app_id, project_id, an optional installation_id, and installed or test mode. This lets one interface support both testing and installed use without reading IDs from unverified query parameters.

To let the cabinet agent explain, highlight, open, or edit elements inside the application, add IDs under the app.* namespace and register the standard handler:

import {
  clearSenlerBridgeElementHighlight,
  createSenlerBridgeClient,
  executeSenlerBridgeElementAction,
} from "@senler/ui/bridge";

const bridge = createSenlerBridgeClient({ parentOrigin });
await bridge.connect();

const unsubscribeAction = bridge.onElementAction((request) =>
  executeSenlerBridgeElementAction(request),
);
const unsubscribeClear = bridge.onElementHighlightClear(() =>
  clearSenlerBridgeElementHighlight(),
);
<button
  data-ai-reveals-context-id="app.orders.create.form"
  data-ai-reveal-action="click"
>
  Create order
</button>

<form data-ai-context-id="app.orders.create.form">
  <input data-ai-context-id="app.orders.create.customer" />
  <button data-ai-context-id="app.orders.create.submit">Save</button>
</form>

The supported actions are highlight, scroll_to, focus, click, fill, clear, select, and toggle. A target must be visible and unique for its data-ai-context-id; fill, clear, and select work only with native input, textarea, or select elements, while toggle works with checkboxes, radio buttons, or an element with role="switch". If a field is inside a tab, dropdown, accordion, or dialog, mark the opener with data-ai-reveals-context-id; Bridge can follow up to four such steps.

Use stable semantic IDs such as app.orders.filter.status, and mark the corresponding explanations in the application documentation with the same IDs. Do not include a project, user, translated label, or random DOM ID. This lets the agent find the right explanation and perform the same flow in Russian, English, narrow, and wide layouts.

Call unsubscribeAction(), unsubscribeClear(), and bridge.destroy() when the page unmounts.

The embedded frame allows scripts, forms, modal windows, downloads, popups, clipboard access, full-screen mode, and the microphone. Treat browser capabilities outside this list as unavailable until separately verified.

Save changes with the save action. If the test does not open, check the URL, Content-Security-Policy/X-Frame-Options headers, whether the browser can reach the local server, and errors inside the iframe.

Danger zone

  • deleting the application;
  • warning: installations and tokens will be revoked;
  • the action is dangerous and requires confirmation.

OAuth settings

OAuth settings are available for Website integration and Tool applications. This screen is not used for a ready-made solution.

An application receives project access only through the standard OAuth flow: the user approves permissions, the application exchanges an authorization_code for an access token, and then uses a refresh_token. Client ID and Client Secret do not grant access on their own and do not replace user authorization.

The OAuth credentials section contains the Client ID and Client Secret. The Client ID identifies the application; transfer it to the integration with Copy Client ID. The Client Secret authenticates the application: do not publish it or place it in client-side code. When needed, show or hide the value, or use Copy Client Secret.

Client Secret regeneration

Regenerate secret opens a warning dialog. Cancel keeps the current secret, while confirmation issues a new secret and immediately invalidates the old one.

After confirmation, show or copy the new Client Secret and update every integration that used the previous value. Until they are updated, OAuth requests using the old secret will fail.

Redirect URI

The Redirect URIs section lists the addresses that can receive a user after authorization. Select Add URI, enter a complete URL in the new address field, and use Remove when an address is no longer needed.

The redirect URI in the authorization request must match one of the saved addresses. Check the protocol, domain, path, and trailing slash; an address mismatch can cause authorization to be rejected.

Permissions

Application permissions define the maximum set of actions the application can request from a project. Select only the required access level for each group. can_view_projects is marked Required, is locked, and cannot be removed; the server also adds it to previously saved sets. Ready-made solutions do not show this list: they are installed through their own version and setup steps instead of receiving application OAuth permissions.

Select all or Deselect all changes the optional groups; review them individually before distributing the application. Permission and Redirect URI changes take effect after saving the OAuth settings. Client Secret regeneration is a separate immediate action and does not wait for this button.

App members

The members page lets you invite developers and review invitations. The status filter separates pending, accepted, declined, expired, and cancelled invitations.

The recipient opens the developer app invitation page. It shows the app, inviter, and role. A pending invitation can be accepted or declined; acceptance opens the app, while an expired or already processed invitation shows the corresponding state.

App members. 1. developer app invitation page