Actions
Actions run in order (up to 10 per flow). Each one sees the trigger data and the outputs of the steps before it as {{steps.<step_id>.…}}. A step that fails permanently does not stop the next ones: the run ends partial (or failed when nothing went out), and the trace shows exactly which step failed and why.
Delivery
- Temporary failures (timeouts, network errors, 408, 425, 429 and 5xx) are retried after about 10 s, 30 s, 90 s… (×3 each time with jitter, capped at 15 min; a
Retry-Afterof up to an hour is honoured), five attempts in total. Other 4xx answers and redirects are permanent: redirects are never followed. - Every attempt of a step carries the same idempotency key,
<run key>:<step id>, so receivers can deduplicate. - After five failed runs in a row, the flow pauses itself and you get a notice.
- Test runs say so everywhere:
🧪 TESTbefore Telegram messages,[TEST]in email subjects and push titles,"test": truein webhook envelopes,X-Ignitra-Test: trueon webhooks and HTTP requests, and a trailing🧪 TEST runcell in Google Sheets rows.
- Webhook WEBHOOK
- Telegram TELEGRAM
- Web Push WEB_PUSH
- Read contract CHAIN_READ
- HTTP request HTTP_REQUEST
- Email EMAIL
- Google Sheets GOOGLE_SHEETS
- Onchain transaction ONCHAIN_TX
Webhook
WEBHOOK · connection: webhook (optional)
POST a signed JSON envelope (HMAC-SHA256) with the run's trigger data to your server.
POSTs IGNITRA's signed run.action envelope; see Webhooks. Use a URL (signed with your webhook secret) or a webhook connection (its own secret).
Params
| Param | Type | Required | Default |
|---|---|---|---|
| url | string | ||
| connection_id | string |
Example
{
"step_id": "webhook",
"type": "WEBHOOK",
"params": {
"url": "https://myapp.example/hooks/ignitra"
}
}From the proxy-upgraded-webhook template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.webhook.status | number | HTTP status returned by the receiver |
| steps.webhook.body | object | Response body (parsed JSON, or text) |
Telegram
TELEGRAM · connection: telegram
Send a message with your Telegram bot to a chat, group, topic or channel.
HTML formatting (<b>, <i>, <a href>, <code>…) is checked when you save; every substituted value is escaped so on-chain data cannot inject markup. Messages over Telegram's 4096 characters go out as plain text.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| connection_id | string | yes | |
| text | string | yes | |
| parse_mode | "html" | "plain" | "html" | |
| disable_link_preview | boolean | true | |
| silent | boolean | false |
Example
{
"step_id": "telegram",
"type": "TELEGRAM",
"params": {
"connection_id": "conn_…",
"text": "🔥 <b>Big buy: {{trigger.amount_formatted}} {{trigger.token.symbol}}</b>\n{{trigger.percent_of_supply}}% of supply → <code>{{trigger.to | short}}</code>\n<a href=\"{{trigger.explorer_url}}\">View on explorer</a>"
}
}From the big-buy-telegram template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.telegram.message_id | number | Telegram message id |
| steps.telegram.chat_id | string | Chat the message went to |
Web Push
WEB_PUSH
Push notification to the flow owner's browsers and installed app.
Notifies every device you enabled in Settings (browsers and the installed app). Skipped, not failed, when you have no devices.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| title | string | yes | |
| body | string | yes | |
| url | string | ||
| tag | string |
Example
{
"step_id": "web_push",
"type": "WEB_PUSH",
"params": {
"title": "🐋 Whale sent {{trigger.amount_formatted}} {{trigger.token.symbol}}",
"body": "{{trigger.from | short}} → {{trigger.to | short}}",
"url": "{{trigger.explorer_url}}"
}
}From the whale-sell-push template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.web_push.delivered | number | Devices the notification reached |
| steps.web_push.subscriptions | number | Active subscriptions of the owner |
Read contract
CHAIN_READ
Call a view function (eth_call) and use the result in later steps, e.g. a balance or a price.
eth_call against Robinhood Chain: a full function signature, arguments as literals or variables, at the latest block or the trigger's block. The result is typed for later steps.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| address | string | yes | |
| function | string | yes | |
| args | string | number | boolean[] | [] | |
| block | "latest" | "trigger" | "latest" |
Example
{
"step_id": "chain_read",
"type": "CHAIN_READ",
"params": {
"address": "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
"function": "function totalSupply() view returns (uint256)"
}
}From the daily-supply-sheets template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.chain_read.result | object | Decoded return value (one value, or an object of named values) |
| steps.chain_read.block_number | uint | Block the read was made at |
HTTP request
HTTP_REQUEST · connection: http (optional)
Call any HTTP API: method, headers and a JSON, text or form body built from templates.
Any method and headers, with a JSON, text or form body built from templates. Values are JSON-escaped in JSON bodies and the rendered body must parse. Requests carry X-Ignitra-Idempotency-Key and are signed like webhooks (over the raw body) unless sign is false. API keys belong in an HTTP connection: encrypted, and only ever sent to its host.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| method | "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "POST" | |
| url | string | yes | |
| headers | object[] | [] | |
| body_type | "json" | "text" | "form" | "none" | "json" | |
| body | string | ||
| form | object[] | ||
| connection_id | string | ||
| sign | boolean | true |
Example
{
"step_id": "http_request",
"type": "HTTP_REQUEST",
"params": {
"method": "POST",
"url": "https://api.example.com/orders/{{trigger.body.order}}",
"headers": [
{
"name": "X-Source",
"value": "ignitra"
}
],
"body_type": "json",
"body": "{ \"wallet\": \"{{trigger.to}}\", \"amount\": {{trigger.amount_decimal}} }",
"connection_id": "conn_…"
}
}Output
| Variable | Type | Description |
|---|---|---|
| steps.http_request.status | number | HTTP status of the response |
| steps.http_request.headers | object | Selected response headers (content-type, location, etag, x-request-id) |
| steps.http_request.body | object | Response body: parsed JSON (any path below it), or text |
EMAIL · connection: email · builder plan
Send an email to a verified address (yours or your team's).
Sent from IGNITRA's address to an email connection you verified with a code. Plain text with a safe HTML version.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| connection_id | string | yes | |
| subject | string | yes | |
| body | string | yes |
Example
{
"step_id": "email",
"type": "EMAIL",
"params": {
"connection_id": "conn_…",
"subject": "⚠️ Treasury below {{trigger.threshold}} ETH",
"body": "Wallet {{trigger.wallet}} now holds {{trigger.balance_after_formatted}} ETH (it held {{trigger.balance_before_decimal}} ETH).\n\nBlock {{trigger.block_number}} · {{trigger.time.iso}}\n{{trigger.explorer_url}}"
}
}From the treasury-low-email template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.email.message_id | string? | Provider message id |
| steps.email.to | string | Recipient address |
Google Sheets
GOOGLE_SHEETS · connection: google · builder plan
Append a row to a Google Sheets tab (your Google account, OAuth).
Appends one row: one template per column. Values that would start a formula (=, +, -, @) are written as text. Add {{run.idempotency_key}} as a column to deduplicate retries.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| connection_id | string | yes | |
| spreadsheet | string | yes | |
| sheet | string | "Sheet1" | |
| values | string[] | yes | |
| input | "USER_ENTERED" | "RAW" | "USER_ENTERED" |
Example
{
"step_id": "google_sheets",
"type": "GOOGLE_SHEETS",
"params": {
"connection_id": "conn_…",
"spreadsheet": "https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit",
"sheet": "Holders",
"values": [
"{{trigger.time.iso}}",
"{{trigger.holder}}",
"{{trigger.amount_decimal}}",
"{{trigger.token.symbol}}",
"{{trigger.explorer_url}}",
"{{run.idempotency_key}}"
]
}
}From the new-holder-sheets template.
Output
| Variable | Type | Description |
|---|---|---|
| steps.google_sheets.updated_range | string | Range the row was written to, e.g. Buys!A12:D12 |
| steps.google_sheets.updated_rows | number | Rows appended (1) |
| steps.google_sheets.spreadsheet_id | string | Spreadsheet id |
Onchain transaction
ONCHAIN_TX · team plan
A pre-approved transaction from your Safe through a scoped, revocable IGNITRA session key (Zodiac Roles). Off unless the flow opts in.
Params
| Param | Type | Required | Default |
|---|---|---|---|
| grant_id | string | yes | |
| to | string | yes | |
| function | string | yes | |
| args | string[] | [] | |
| value | string | "0" |
Output
| Variable | Type | Description |
|---|---|---|
| steps.onchain_tx.tx_hash | hash? | The transaction (null for a TEST simulation) |
| steps.onchain_tx.block_number | uint? | Block it was mined in |
| steps.onchain_tx.gas_used | uint? | Gas used |
| steps.onchain_tx.explorer_url | string? | Explorer link |
| steps.onchain_tx.simulated | boolean | True for a TEST run: simulated, not sent |
| steps.onchain_tx.safe | address | The Safe that made the call |