n8n
The community node gives you a TNL Trigger that fires on new intelligence and a TNL Intelligence node for queries and research.
Install
Settings → Community nodes → Install → n8n-nodes-tnl-intelligence
Self-hosted n8n only. n8n Cloud does not permit community nodes; use the webhook or HTTP Request approaches there instead.
Credentials
Credentials → New → TNL API, paste your API key, save. Every TNL node references this credential, so rotating a key is one edit.
TNL Trigger
Fires when matching intelligence is published. Behind the scenes it registers a webhook subscription and verifies every signature, so you never handle secrets yourself.
| Field | Purpose |
|---|---|
| Event Types | Which events to receive |
| Categories | Restrict to categories, e.g. Economic & Macro |
| Minimum Confidence | Drop events below a confidence threshold |
Output is the event envelope, so {{$json.data.summary}}, {{$json.resource.url}} and {{$json.data.impactPaths}} are available downstream.
Example: currency alerts to Slack
TNL Trigger Slack
├─ Event Types: intelligence.published → Send message
├─ Categories: Economic & Macro
└─ Minimum Confidence: 0.7Slack message text:
*{{$json.data.summary}}*
{{$json.data.geographies.join(", ")}} · confidence {{$json.data.confidence}}
{{$json.resource.url}}Set Minimum Confidence deliberately. At 0 you get everything including low-signal items; 0.7 is a reasonable starting point for an alerting channel.
Example: only act on real impact changes
TNL Trigger → IF → Postgres (insert)IF condition — skip events with no market-impact path:
{{ $json.data.impactPaths.length > 0 }}Because delivery is at-least-once, make the database step idempotent — upsert on {{$json.resource.id}} with {{$json.resource.revision}}, and ignore a row whose stored revision is already higher. Otherwise a retry or replay will double-write.
TNL Intelligence node
Two resources.
Intelligence
| Operation | Use |
|---|---|
search_intelligence | Full-text query |
get_intelligence | Fetch one story by identifier |
list_recent_changes | What changed since a point in time |
get_exposure | Exposure for an entity or asset |
Research
| Operation | Use |
|---|---|
run_research | Start an evidence-first research run |
get_weekly_edition | Fetch the weekly digest |
Example: scheduled morning brief
Schedule Trigger (07:00)
→ TNL Intelligence: list_recent_changes (since 24h)
→ Aggregate
→ Send Emaillist_recent_changes is the right operation for digests — it returns what moved rather than everything, so you are not filtering a full feed in n8n.
Example: exposure lookup from a form
Webhook (ticker in body)
→ TNL Intelligence: get_exposure
Exposure Kind: asset
Identifier: {{$json.body.ticker}}
→ Respond to WebhookChoosing trigger vs schedule
| Trigger | Schedule + list_recent_changes | |
|---|---|---|
| Latency | Seconds | Your interval |
| Quota cost | None per event | One call per run |
| Needs reachable n8n | Yes | No |
| Good for | Alerts | Digests, batch work |
If your n8n is not reachable from the internet, the trigger cannot receive deliveries — use the schedule pattern.
Troubleshooting
Trigger never fires. Check n8n is reachable over HTTPS from outside, then send a test from the subscription: POST /v1/webhooks/subscriptions/{id}/test. If the test arrives and real events do not, your filters are too narrow — try clearing Categories and Minimum Confidence.
Duplicate rows. Expected: delivery is at-least-once. Deduplicate on {{$json.id}} or upsert on resource.id + revision.
401 from the Intelligence node. The credential's key is revoked or belongs to a different tenant. tnl status will confirm quickly.