Parameter Configuration
Configure headers, query, body, and path parameters for your custom actions
Custom actions require a Builder plan or higher.
Upgrade to Builder →
Parameter Types
Headers
HTTP headers sent with your request.
{
"Authorization": "Bearer {{var.API_KEY}}",
"Content-Type": "application/json",
"X-User-ID": "{{system.user_id}}"
}Query Parameters
URL parameters appended to your endpoint.
GET https://api.example.com/search?q={{query}}&limit=10&page={{page}}Body Parameters
JSON data sent in POST, PUT, and PATCH requests.
{
"name": "{{userName}}",
"email": "{{userEmail}}",
"metadata": {
"source": "chipp",
"timestamp": "{{system.timestamp}}"
}
}Path Parameters
Dynamic URL segments replaced at runtime.
https://api.example.com/users/{{userId}}/posts/{{postId}}
https://api.example.com/users/123/posts/456Parameter Sources
Each parameter row has a Key, a source dropdown, and a value field. The source decides where the value comes from each time the action runs:
| Source | The value comes from |
|---|---|
| Fixed value | The text you type |
| AI fills it in | The AI, based on the conversation |
| Application variable | A value saved in the app’s Variables tab |
| System variable | Runtime context, such as the session ID or the time |
| Output from another action | The result of an action that already ran in this chat |
Fixed Value
Static values that never change.
| Setting | Value |
|---|---|
| Key | api_version |
| Source | Fixed value |
| Value | v2 |
A fixed value can also contain placeholders such as Bearer {{var.API_KEY}} or {{system.session_id}}. Chipp replaces them when the action runs.
A fixed value is always sent as text. 10 is sent as the string "10", not the number 10.
Use for: API versions, static identifiers, constant headers
AI Fills It In
Dynamic values the AI decides from the conversation.
| Setting | Value |
|---|---|
| Key | search_query |
| Source | AI fills it in |
| Instructions | Extract the search term from the user's question, for example "customer support tickets" |
| Type | Text |
| Required | On |
| Sample value | customer support tickets |
An AI-filled parameter has three more settings. See Type, Required, and Sample Value below.
Use for: Search queries, dynamic filters, contextual values
Application Variable
Reusable values defined once per application, in the Variables tab.
| Setting | Value |
|---|---|
| Key | api_key |
| Source | Application variable |
| Variable name | API_KEY |
You can also type {{var.API_KEY}} into a fixed value, which is useful when the variable is only part of the text (for example Bearer {{var.API_KEY}}).
Use for: API keys, base URLs, workspace IDs
System Variable
Platform-provided runtime values. Pick one from the list:
| Variable | Description |
|---|---|
| User ID | {{system.user_id}}, the current user |
| Consumer ID | {{system.consumer_id}}, the end user chatting with your app |
| Chat session ID | {{system.session_id}}, the current chat session |
| Current time | {{system.timestamp}}, ISO 8601 |
| Chat transcript URL | {{system.chat_transcript_url}}, this conversation in the builder |
| External ID | {{system.external_id}}, from ?chipp_external_id= |
| WhatsApp phone number | {{system.whatsapp_phone}}, empty on other channels |
| WhatsApp profile name | {{system.whatsapp_profile_name}}, empty when Meta omits it or on other channels |
See Variables and Secrets for details, and for {{system.query.NAME}}, which you type into a fixed value.
Use for: User context, audit trails
Output from Another Action
Use a value from an action that already ran in the same conversation. This chains actions into a multi-step workflow: one API call’s result feeds the next.
Configuration fields:
| Setting | Description | Example |
|---|---|---|
| Source | Output from another action | - |
| Action | The action whose output to use. Only saved actions are listed. | Get User Profile |
| JSONPath | Optional. Which part of the output to use. Blank uses the whole output. | $.data.organization.id |
| Test value | Optional. What Test Request sends, since a test has no earlier output. | org456 |
How it works:
- The first action runs in the conversation and Chipp stores its result for 30 minutes.
- When the AI calls the second action, Chipp reads that stored result and applies your JSONPath.
- The selected value goes into the parameter. In a body parameter it keeps its JSON type (a number stays a number, a list stays a list). In a header, query, or path parameter it becomes text, and objects and lists become JSON text.
- If the first action has not run yet in this conversation, the call stops and the AI is told to run the first action and then try again.
- If your JSONPath finds nothing in the result (for example an empty search), the call stops and the AI is told why, so it can tell the user.
The AI does not fill in a chained parameter, and it does not see one in the action’s inputs.
Supported JSONPath:
$ The whole output
$.id Top-level field: {"id": "123"} -> "123"
$.data.user.email Nested field: {"data": {"user": {"email": "a@b.com"}}} -> "a@b.com"
$['first name'] A field name with spaces or symbols
$.items[0].name First array item: {"items": [{"name": "First"}]} -> "First"
$.items[-1].name Last array item
$.items[*].id Every item: {"items": [{"id": 1}, {"id": 2}]} -> [1, 2]
$.data.* Every value of an object, as a listA JSONPath must start with $. Filters ([?(...)]), slices ([0:2]), recursive descent (..), and unions ([0,1]) are not supported. The editor and the server both reject them when you save, so a selector can never silently match nothing.
Real-world example:
Scenario: Create a support ticket for a user’s organization
Action 1: Get User Details
- Returns:
{"user": {"id": "u123", "org_id": "org456", "name": "John"}}
Action 2: Create Ticket
- Parameter:
organization_id - Source: Output from another action
- Action: Get User Details
- JSONPath:
$.user.org_id - Result: Parameter receives
"org456"
Tips:
- Save the first action before you configure the second one. The action list only shows saved actions.
- Describe both actions clearly, so the AI knows to run the first one before the second one.
- If the first action is deleted, the chained parameter shows a warning. Pick another action.
Use for: Multi-step workflows, data enrichment, sequential API operations
Type, Required, and Sample Value
These settings appear on every AI fills it in parameter. They shape the input description the AI receives for the action.
Type
| Type | The AI sends |
|---|---|
| Text | A string |
| Number | Any number, such as 19.99 |
| Whole number | An integer, such as 42 |
| True / false | A boolean |
| List (array) | A JSON array |
| Object | A JSON object |
Chipp checks the AI’s value against the type before it calls your API. A value that does not match (for example "abc" for a number) is rejected, and the AI is asked to correct it, so your API never receives it.
Type applies to AI-filled values. Fixed values are always sent as text.
Required
- Required: The AI must provide the value before it can run the action. A required text, list, or object value cannot be empty.
- Not required: The AI includes the value only when it is relevant. A missing optional value is left out of the request.
A path parameter is required unless you turn it off, because an empty path segment breaks the URL.
Sample Value
A sample shows the AI the format you expect. Chipp adds it to the parameter’s description for the AI, and Test Request sends it in place of a real AI value.
| Parameter | Sample Value | AI Learns |
|---|---|---|
phone | +1-555-0123 | Include country code with dashes |
date | 2024-03-15 | Use ISO 8601 format |
slug | my-blog-post | Lowercase with hyphens |
Writing Effective Instructions
Good Example:
Generate a professional email subject line (max 100 chars) based on the email content. Include the recipient's name if mentioned.Bad Example:
Make a subjectAdvanced Patterns
Nested Body Fields
Body parameters are sent as top-level JSON keys, exactly as you write them. A key with dots stays one flat key: response_format.type is sent as {"response_format.type": "..."}, not as a nested object.
To send a nested object, add one parameter for the top-level key (for example response_format), set its source to AI fills it in, set Type to Object, and describe the shape in the instructions. A chained parameter (Output from another action) can also carry an object or a list from an earlier action’s result.
Mixed Sources
One action can combine every source:
| Key | Source | Value |
|---|---|---|
api_key | Application variable | API_KEY |
user_id | System variable | User ID |
query | AI fills it in | The user’s search term |
limit | Fixed value | 10 (sent as text) |
org_id | Output from another action | Get User Details, $.user.org_id |
Optional Parameters
Turn Required off and say when to include the value in the instructions, for example “Include only if the user names a category”. The AI leaves the parameter out when it does not apply.
Testing Parameters
1. Use the Built-in Tester
Test Request sends a real request with your parameters resolved:
URL: https://api.example.com/search
Query: q = AI fills it in (sample value "john")
GET https://api.example.com/search?q=john2. Verify Variable Resolution
Check what each source sends during a test:
- Fixed values and application variables send their real values
{{system.timestamp}}sends the current time; every other system variable sends a placeholder, because a test has no chat- AI-filled parameters send their sample value, or a placeholder such as
<q>when there is no sample - Chained parameters (Output from another action) send their test value, or a placeholder such as
<org_id>, because a test has no earlier action output
3. Test Edge Cases
- Empty optional parameters
- Special characters in values
- Large nested objects
- Array parameters