> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usefini.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Run rule test path from config
> Run one test path against an unsaved Rulebook flow configuration.
Runs a simulated Rulebook evaluation directly from a `flowConfig` payload. Use
this for draft builders, preview tools, or CI checks that need to test an
unsaved rule tree.
## Headers
<ParamField header="Authorization" type="string" required>
Bearer token containing your Fini workspace API key. Format: `Bearer fini_...`
The key needs `read` scope.
</ParamField>
<ParamField header="Content-Type" type="string" required>
`application/json`
</ParamField>
## Body parameters
<ParamField body="flowConfig" type="object" required>
Rulebook flow configuration to run.
</ParamField>
<ParamField body="inputContext" type="object">
Synthetic input fields for the rule evaluation.
</ParamField>
<ParamField body="runtimeContext" type="object">
Synthetic runtime fields such as provider, channel, or agent context.
</ParamField>
<ParamField body="pathId" type="string">
Generated path ID being run.
</ParamField>
<ParamField body="expectedTerminalNodeId" type="string">
Node ID the simulation should end on.
</ParamField>
<ParamField body="interactionHistory" type="array">
Optional simulated conversation history. Each item can include `role`, `type`,
`content`, `event_id`, and `metadata.content`.
</ParamField>
<ParamField body="mockTextExtraction" type="boolean">
Whether to mock LLM extraction nodes during simulation.
</ParamField>
## Response
Returns a rule test path run result.
<RequestExample>
~~~bash cURL theme={null}
curl --request POST \
--url 'https://api-prod.usefini.com/v2/hc-rules/test-paths/config/run/public' \
--header 'Authorization: Bearer fini_your_api_key' \
--header 'Content-Type: application/json' \
--data '{
"flowConfig": {
"root": "root",
"nodes": {
"root": {
"id": "root",
"name": "Refund workflow",
"type": "SEQUENCE",
"children": ["reply_escalate"]
},
"reply_escalate": {
"id": "reply_escalate",
"name": "Escalate refund",
"type": "ACTION",
"subType": "SEND_MESSAGE",
"message": "Escalate refund request with order context."
}
}
},
"pathId": "refund-escalation",
"expectedTerminalNodeId": "reply_escalate",
"inputContext": {
"message": {
"text": "I need a refund for my order."
}
},
"runtimeContext": {
"source": "zendesk",
"channel": "email"
},
"mockTextExtraction": true
}'
~~~
~~~javascript Node.js theme={null}
const response = await fetch(
"https://api-prod.usefini.com/v2/hc-rules/test-paths/config/run/public",
{
method: "POST",
headers: {
Authorization: "Bearer fini_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
flowConfig: {
root: "root",
nodes: {
root: {
id: "root",
name: "Refund workflow",
type: "SEQUENCE",
children: ["reply_escalate"],
},
reply_escalate: {
id: "reply_escalate",
name: "Escalate refund",
type: "ACTION",
subType: "SEND_MESSAGE",
message: "Escalate refund request with order context.",
},
},
},
pathId: "refund-escalation",
expectedTerminalNodeId: "reply_escalate",
inputContext: {
message: { text: "I need a refund for my order." },
},
runtimeContext: {
source: "zendesk",
channel: "email",
},
mockTextExtraction: true,
}),
}
);
const result = await response.json();
~~~
~~~python Python theme={null}
import requests
response = requests.post(
"https://api-prod.usefini.com/v2/hc-rules/test-paths/config/run/public",
headers={
"Authorization": "Bearer fini_your_api_key",
"Content-Type": "application/json",
},
json={
"flowConfig": {
"root": "root",
"nodes": {
"root": {
"id": "root",
"name": "Refund workflow",
"type": "SEQUENCE",
"children": ["reply_escalate"],
},
"reply_escalate": {
"id": "reply_escalate",
"name": "Escalate refund",
"type": "ACTION",
"subType": "SEND_MESSAGE",
"message": "Escalate refund request with order context.",
},
},
},
"pathId": "refund-escalation",
"expectedTerminalNodeId": "reply_escalate",
"inputContext": {
"message": {"text": "I need a refund for my order."},
},
"runtimeContext": {"source": "zendesk", "channel": "email"},
"mockTextExtraction": True,
},
)
result = response.json()
~~~
</RequestExample>
<ResponseExample>
~~~json 200 OK theme={null}
{
"results": [
{
"id": "root",
"name": "Refund workflow",
"type": "SEQUENCE",
"success": true
},
{
"id": "reply_escalate",
"name": "Escalate refund",
"type": "ACTION",
"subType": "SEND_MESSAGE",
"success": true,
"terminate": true,
"result": {
"message": "Escalate refund request with order context."
}
}
],
"testContext": {
"inputContext": {
"message": {
"text": "I need a refund for my order."
}
},
"runtimeContext": {
"source": "zendesk",
"channel": "email"
},
"notes": ["Use a refund-related user message."]
},
"expectedTerminalNodeId": "reply_escalate",
"actualTerminalNodeId": "reply_escalate",
"matchedExpectedPath": true,
"message": "Matched expected terminal node reply_escalate."
}
~~~
</ResponseExample>
## Related topics
- [Get rule version test paths](/en/api-reference/get-rule-version-test-paths.md)
- [Run rule version test path](/en/api-reference/run-rule-version-test-path.md)
- [Preview rule test paths](/en/api-reference/preview-rule-test-paths.md)
This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.
Intent Rules

