Custom actions
Custom actions
Let the AI agent call your HTTP APIs mid-conversation — order lookups, account checks, ticket creation.
A custom action is an HTTP request the agent can make during a conversation. You define the request and tell the agent when to use it; the agent collects the inputs you specify from the customer, calls your API, and uses the response in its reply — on every channel and in the Playground. Manage actions at app.asks.app/ai-agent/actions.
Plans allow 5 actions All plans, 15 Business and up, or 50 Premium. The full matrix is in Plans and limits.

You don't have to build the form by hand. In the action editor, describe the action in one sentence — "Look up an order's delivery status by tracking number" — and Describe it and we'll draft it generates a full draft: name, description, inputs, and request. Review it and verify the endpoint before saving.
Anatomy of an action
Action namestringrequiredWhat it does (for the AI)stringrequiredWhat to ask the user firstinputsMethod + URLrequestrequiredHeaders, query, bodyrequest{{variable}} placeholders. Body mode is none, JSON, or form. Individual header values can be marked secret — they're encrypted, never shown again, and left blank on edit to keep the stored value.Authenticationnone | bearer | api key | basicVariable templating
Collected inputs are inserted into the request with {{variable}} placeholders — in the path, query string, headers, or body. They are never allowed in the scheme or host: the destination of a request is fixed at design time, so a manipulated conversation can't redirect calls to another server. Built-ins {{conversation_id}}, {{channel}}, {{customer_id}}, and {{workspace_locale}} are also available.
Safety rails and advanced settings
- Write methods require a domain allowlist. POST, PUT, PATCH, and DELETE actions must list at least one allowed domain; requests outside it are refused. Write actions are also rate-limited and audit-logged.
- Timeouts — 1 to 30 seconds per call, 10 seconds by default.
- Response filtering — optional JSONPath filters (like
$.order.status) limit what the model sees from the response; empty means the full response. - Links off by default — URLs from the response only appear in replies if you enable "Allow links from the response in replies".
- Save to memory — store a response value under a key that later actions in the same conversation can reference.
- Thinking message — optional text shown to the customer while the action runs, like "Checking your order…". Widget only.

Manage and monitor
Each action card has an Enable action switch — pause an action without deleting it — plus badges for disabled and write actions, a call counter, and the status of the last call. Recent calls opens the last 20 invocations across all conversations with status, duration, and any error. Deleting an action deletes its stored credentials and call history with it.
Worked example: order status
Name it Delivery status and describe it as: "Look up an order's delivery status by order number. Use when the customer asks where their order is. Returns status, items, and tracking link."
One collected parameter: order_number, type text, required — "The customer's order number, e.g. #1234".
GET https://api.example.com/orders/{{order_number}} with an API-key header for auth.
Add response filters like $.order.status and $.order.tracking_url so the model sees only what it needs.
Use the editor's built-in test run with a sample order number, check the response, then save. Testing a write method performs a real request, behind a confirmation. The agent can call the action immediately.
Verify in the Playground: ask "where is my order?" and confirm the agent asks for the order number, calls the action, and answers from the response.
For tools that live outside your own API, see MCP servers.