IGNITRAOpen the app

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-After of 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: 🧪 TEST before Telegram messages, [TEST] in email subjects and push titles, "test": true in webhook envelopes, X-Ignitra-Test: true on webhooks and HTTP requests, and a trailing 🧪 TEST run cell in Google Sheets rows.

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

ParamTypeRequiredDefault
urlstring
connection_idstring

Example

{
  "step_id": "webhook",
  "type": "WEBHOOK",
  "params": {
    "url": "https://myapp.example/hooks/ignitra"
  }
}

From the proxy-upgraded-webhook template.

Output

VariableTypeDescription
steps.webhook.statusnumberHTTP status returned by the receiver
steps.webhook.bodyobjectResponse 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

ParamTypeRequiredDefault
connection_idstringyes
textstringyes
parse_mode"html" | "plain""html"
disable_link_previewbooleantrue
silentbooleanfalse

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

VariableTypeDescription
steps.telegram.message_idnumberTelegram message id
steps.telegram.chat_idstringChat 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

ParamTypeRequiredDefault
titlestringyes
bodystringyes
urlstring
tagstring

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

VariableTypeDescription
steps.web_push.deliverednumberDevices the notification reached
steps.web_push.subscriptionsnumberActive 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

ParamTypeRequiredDefault
addressstringyes
functionstringyes
argsstring | 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

VariableTypeDescription
steps.chain_read.resultobjectDecoded return value (one value, or an object of named values)
steps.chain_read.block_numberuintBlock 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

ParamTypeRequiredDefault
method"GET" | "POST" | "PUT" | "PATCH" | "DELETE""POST"
urlstringyes
headersobject[][]
body_type"json" | "text" | "form" | "none""json"
bodystring
formobject[]
connection_idstring
signbooleantrue

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

VariableTypeDescription
steps.http_request.statusnumberHTTP status of the response
steps.http_request.headersobjectSelected response headers (content-type, location, etag, x-request-id)
steps.http_request.bodyobjectResponse body: parsed JSON (any path below it), or text

Email

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

ParamTypeRequiredDefault
connection_idstringyes
subjectstringyes
bodystringyes

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

VariableTypeDescription
steps.email.message_idstring?Provider message id
steps.email.tostringRecipient 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

ParamTypeRequiredDefault
connection_idstringyes
spreadsheetstringyes
sheetstring"Sheet1"
valuesstring[]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

VariableTypeDescription
steps.google_sheets.updated_rangestringRange the row was written to, e.g. Buys!A12:D12
steps.google_sheets.updated_rowsnumberRows appended (1)
steps.google_sheets.spreadsheet_idstringSpreadsheet 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

ParamTypeRequiredDefault
grant_idstringyes
tostringyes
functionstringyes
argsstring[][]
valuestring"0"

Output

VariableTypeDescription
steps.onchain_tx.tx_hashhash?The transaction (null for a TEST simulation)
steps.onchain_tx.block_numberuint?Block it was mined in
steps.onchain_tx.gas_useduint?Gas used
steps.onchain_tx.explorer_urlstring?Explorer link
steps.onchain_tx.simulatedbooleanTrue for a TEST run: simulated, not sent
steps.onchain_tx.safeaddressThe Safe that made the call