Fetch records from any entity in your project.
| Field | Description |
|---|---|
| Entity | The entity to read from (e.g. customers, orders) |
| Limit | Maximum number of records to return |
| Filters | Field conditions to narrow results (optional) |
Read Data returns an array. Access individual fields like this:
{{ $anythink.steps.get_users.data[0].name }}
{{ $anythink.steps.get_users.data[0].email }}
You can also pass the full array to a downstream Create Data step for bulk operations.
Insert one or more records into an entity.
Provide a JSON object with the field values. Template syntax is fully supported:
{
"title": "{{ $anythink.steps.generate.data[0].title }}",
"status": "draft",
"author": 2
}
To create multiple records at once, pass an array returned by a Run Script step:
{{ $anythink.steps.parse_step.data[0].items }}
This creates one record per item in a single operation, without needing a loop.
After creating, the new record including its generated id is available to subsequent steps:
{{ $anythink.steps.create_order.data[0].id }}
Modify an existing record.
| Field | Description |
|---|---|
| Entity | The entity containing the record |
| Record ID | The ID to update — supports template syntax |
| Fields | JSON object with only the fields to change |
Update the status of the record that triggered the workflow:
orders{{ $anythink.trigger.data.id }}{"status": "processed"}Only the fields you specify are changed. Everything else is untouched.
Remove a record from an entity.
| Field | Description |
|---|---|
| Entity | The entity to delete from |
| Record ID | The ID of the record to delete |
Deletions are permanent and cannot be reversed from within a workflow.
Make an HTTP request to any external service — a webhook, a third-party API, or any other system.
| Field | Supports templates | Notes |
|---|---|---|
| URL | No | Must be a hardcoded URL |
| Method | — | GET, POST, PUT, PATCH, DELETE |
| Headers | Yes | Key-value pairs |
| Body | Yes | JSON request body |
{{ $anythink.steps.step_name.data[0].field }} templatesHeaders:
{
"x-api-key": "{{ secrets.MY_API_KEY }}",
"anthropic-version": "2023-06-01"
}
Body:
{
"model": "claude-haiku-4-5-20251001",
"max_tokens": 500,
"messages": [
{
"role": "user",
"content": "Summarise: {{ $anythink.steps.get_article.data[0].content }}"
}
]
}
The full response body is available to downstream steps via data[0]:
{{ $anythink.steps.call_api.data[0].content[0].text }}
Execute a JavaScript function for custom logic that cannot be expressed as a simple step.
Your script must return a value. The returned value is automatically wrapped in an array by the platform, so it is always accessed as data[0]:
return { status: "processed", count: 42 };
// Accessed downstream as:
// {{ $anythink.steps.my_script.data[0].status }}
// {{ $anythink.steps.my_script.data[0].count }}
Previous steps data is available via $anythink:
var items = $anythink.steps.fetch_items.data;
var trigger = $anythink.trigger.data;
var results = [];
for (var i = 0; i < items.length; i++) {
if (items[i].status === "active") {
results.push({ id: items[i].id, name: items[i].name });
}
}
return { items: results, count: results.length };
var declarations and traditional for (var i...) loops. Modern JS features such as optional chaining and for...of may not be supported in all environmentsreturn {
items: results,
has_results: results.length > 0 ? "yes" : "no"
};
{ x: 1 }, it arrives downstream as [{ x: 1 }] and is accessed via data[0].xBranch the workflow based on the value of a field. A Condition step has two outputs: one path when conditions are met, and another when they are not.
| Field | Description |
|---|---|
| Logical operator | AND or OR — how multiple conditions combine |
| Conditions | One or more field / operator / value checks |
| Operator | Meaning |
|---|---|
eq |
Equals |
neq |
Not equals |
gt |
Greater than |
lt |
Less than |
gte |
Greater than or equal |
lte |
Less than or equal |
contains |
String contains |
For fields from a Run Script step, which always wraps output in an array:
$anythink.steps.my_script.data[0].my_field
For fields from the trigger:
$anythink.trigger.data.status
A common pattern is using a Condition step as a gate — only continue if a condition is true and stop the workflow otherwise. When the condition is not met, the job shows as "Condition evaluation failed" in job history. This is expected behaviour for a gate, not an error.
When a workflow fetches items from an external source and then filters them, you may end up with nothing at various stages. Use two Condition gates for safety:
This prevents a downstream Create Data step from receiving an empty array, which can cause unexpected behaviour.