You can create events conditions through the Auto API and with Builder Chat.
The app's visual plan builder does not list the source yet.
Market Events
events conditions trigger on market events: things that happened — a listing,
a hack, a regulatory decision, a macro release, a protocol upgrade, company news,
a large flow, bullish or bearish news on an asset. They are the events
GET /v3/events serves, each written up from many
posts into a title, a classification, and the assets and entities it names. A
condition fires when a new one matches it. Use events for news about a
subject; use tweet for
posts from a specific account.
| Source | Method | Fires when |
|---|---|---|
events | match | an event passes every filter you set and, with text, states your claim |
What a match gives you, and what it does not: the trigger payload carries the
event's id, title, classification, and the entities it names. It carries no
link and no summary: fetch them by the event's id from /v3/events, see
From the Alert Back to the Event.
events conditions obey the standard limits: they combine with other sources
inside AND/OR groups, up to depth 3 and 10 leaf conditions. See
Triggers.
Condition Shape
Write the shorthand. Every argument is optional, but a condition needs at least
one filter or text:
{
"source": "events",
"args": { "entity": "ETH", "implication": "bearish" }
}
The shorthand expands to method: "match", operator: "==", value: true. The
full form is accepted with exactly those values and no others.
Filters
All filters you set must pass (they are combined with AND). Each takes one
value: for "BTC or ETH", or "listing or hack", write several events
conditions under OR. The values are those of
GET /v3/events, and they match the same way: see
From a /v3/events Query.
| Argument | Values | Matches |
|---|---|---|
entity | an id from /v3/entities, a ticker or a name, e.g. "ETH", "Hyperliquid", "Michael Saylor" | events that name it as a main or a related subject — see Entity Routing |
entityType | token, equity, project, person, organisation | narrows how entity resolves; requires entity |
eventClass | market, call, asset | market: a development reported across posts, including news about a specific asset. call: accounts taking positions — calls and targets, not the move itself. Avoid asset (posts about one asset, nothing wider): it is rare, and most news about a named asset is classed market, so filter on entity instead |
eventType | security, listing, regulatory, macro, protocol, company, marketFlow, price, social, other | what kind of event it is (marketFlow is camelCase) |
implication | bullish, bearish, mixed, unclear | the likely direction for the assets the event names |
alertAction | alert, monitor | alert: judged impactful. monitor: worth watching |
assetClass | crypto, equity | the class of the assets the event names. Events that name no asset — macro, policy — pass this filter |
novelty | new, update | the event's own call on whether it is a new development. It does not reliably filter repeats of a story — see Runtime Semantics |
text + minConfidence | a claim, and an integer 0–100 | a specific claim the event must state — see Filters vs Text. Both or neither |
Entity Routing
entity takes an id, a ticker or a name. Validate and Create resolve it to one
entity and store that as entityPublishedId in the plan.
- An id is exact. Pass
entities[].idfromGET /v3/entitiesand the condition names that entity, whatever shares its name or ticker. It is the same id/v3/eventstakes inentityIds.
A ticker or a name is resolved for you, ticker first, then name:
-
A ticker resolves to that token or stock:
"ETH"is Ethereum,"HYPE"is Hyperliquid. -
A name that is also a ticker resolves to the ticker.
"Elon Musk"resolves to a token named MUSK,"Fed"to a stock with the ticker FED, and"BlackRock"to a token named BLACKROCK. For anything that is not a token or a stock, setentityType:// bad: resolves to a token named MUSK
{ "entity": "Elon Musk" }
// good
{ "entity": "Elon Musk", "entityType": "person" } -
When a name matches several entities equally, Validate rejects it and lists the candidates; when a name also matches weaker alternatives, Validate accepts it and returns a warning naming them. Read the warning: it tells you which entity you got.
-
Central banks, regulators, governments, and macro themes are not entities. Filter on
eventTypeand say the subject intext:// bad: resolves to a stock with the ticker FED, not the Federal Reserve
{ "entity": "Fed" }
// good
{ "eventType": "macro", "text": "the Federal Reserve changes interest rates", "minConfidence": 80 }
Filters vs Text
Prefer filters. They match exactly, cost nothing to check, and never miss an
event that a classifier already tagged. Add text only for a specific claim the
filters cannot express.
text is checked against the event's title and summary, and passes when the
check's confidence reaches minConfidence. The event's classification never
supplies the claim: a stance that only implication carries does not satisfy
text.
| Intent | Bad | Good |
|---|---|---|
| Bearish news on ETH | { "text": "bearish news about ETH", "minConfidence": 80 } | { "entity": "ETH", "implication": "bearish" } |
| Anything about Solana | { "text": "news about Solana", "minConfidence": 80 } | { "entity": "SOL" } |
| Exchange hacks | { "eventType": "security" } (also matches protocol exploits and phishing) | { "eventType": "security", "text": "a crypto exchange is hacked or exploited", "minConfidence": 80 } |
minConfidence is an integer from 0 to 100. Start at 80: lower lets more
loosely related events through, higher drops events that state the claim
indirectly.
A filter-only condition consumes no credits. A condition with text consumes
credits each time an event that passes its filters is checked against the claim.
From a /v3/events Query
An events condition is a GET /v3/events filter
that runs on every new event instead of once. It takes the endpoint's filter
values and matches them the same way, so a query that returns what you want to
hear about turns into a condition:
GET /v3/events | events condition | Difference |
|---|---|---|
entityIds=<id> | "entity": "<id>" | One entity per condition. A ticker or a name also works, see Entity Routing |
eventClass, eventType, implication, assetClass, novelty | the same argument, the same values | None. assetClass lets through events that name no asset in both |
alertAction=alert | "alertAction": "alert" | One value. Leave it out for both |
Several entityIds, or a list of alertAction | several conditions under OR | |
q=<topic> | "text": "<claim>" with minConfidence | q ranks events by topic. text is a claim each event must state, checked event by event for credits. See Filters vs Text |
from, to, order, sort, eventIds, hasStoryline, notable, arcId | none | A condition watches events written up from its creation onwards |
Preview Before You Create
Run the query over the last day. What it returns is what a condition with the same filters would have fired on:
1. GET /v3/entities?q=eth&entityType=token&limit=1
-> entities[0].id: Ethereum
2. GET /v3/events?entityIds=<id>&implication=bearish&from=<now - 1d>
-> the bearish ETH events of the last day. Too many? Add eventType or
alertAction=alert. None? Drop a filter
{ "source": "events", "args": { "entity": "<id>", "implication": "bearish" } }
A condition with text fires on fewer: only the events that also state the
claim. The /v3 endpoints need a Pay-as-you-go, Grow or Enterprise key. Without
one, name the entity by ticker or name, and read the Validate response to see
which entity it resolved to.
Runtime Semantics
- Event-driven. Conditions are evaluated as events arrive, not on a polling interval.
- Not a first-post trigger. Events are analysed from many posts, so they
arrive minutes to hours after the first post about something. To be first,
watch the account that breaks the news with
tweet. - Fresh events only. An event is matched only while it is less than an hour old. A new plan sees events from its creation onwards; nothing is replayed.
- Each event fires a plan at most once. Without
repeat, the first matching event triggers the plan and moves it to a terminal state. Withrepeat, the plan fires once per matching event. - A developing story can fire again. Follow-up reporting on a story arrives
as further events, and each can match: about 1 in 9 events continues a story
already reported that day, roughly half of them with new facts.
novelty: "new"does not reliably remove these: most still readnew. To act once per story, compare the event'sstorylineId(see From the Alert Back to the Event), or userepeat.cooldownto space alerts out.
Trigger Payload
Each matched events condition reports the condition you wrote and the event
that matched it:
{
"condition": {
"source": "events",
"args": {
"entity": "ETH",
"entityPublishedId": "c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"eventType": "security",
"text": "a crypto exchange is hacked or exploited",
"minConfidence": 80
}
},
"match": {
"eventId": "c26d6d18-2b1f-4b7e-9a7d-5f0f3c3e8a11",
"title": "Exchange hot wallet drained of $12M in ETH",
"eventClass": "market",
"eventType": "security",
"implication": "bearish",
"alertAction": "alert",
"novelty": "new",
"timeSensitivity": "hours",
"citedSourceCount": 6,
"analyzedAt": "2026-10-08T16:02:31.204Z",
"entities": [
{ "symbol": "ETH", "name": "Ethereum", "entityType": "token" }
],
"confidence": 84
}
}
condition.args— the arguments you wrote, plusentityPublishedId, the entityentityresolved to.match.eventId— the event'sidin/v3/events. Each event fires a plan at most once. It is not the webhook delivery'sX-Auto-Event-Id, which is the id to deduplicate deliveries on (see Webhook Event Sample).match.title— the event's headline: itsalertTitlein/v3/events. There is no summary and no link.match.eventClass,eventType,implication,alertAction,novelty— the event's classification, with the values listed under Filters.match.timeSensitivity— how quickly the event is expected to matter.match.citedSourceCount— how many posts the event cited when it was written up./v3/eventslists them, with links, incitedSources.match.analyzedAt— when the event was written up, as an ISO 8601 timestamp./v3/eventsgives the same moment in Unix seconds.match.entities— up to 10 entities the event names, each withname,entityType, andsymbol(omitted for people and organisations).match.confidence— thetextcheck's confidence. Absent on filter-only conditions.
From the Alert Back to the Event
match.eventId is the event's id in /v3/events. With a key that can call
/v3, fetch the rest of it there:
GET /v3/events?eventIds=<match.eventId>
-> summary, citedSources with their links, impacts (price reactions),
storylineId, and the entities with their ids
To act once per story, keep the storylineId of each event you act on and skip
an event whose storylineId you already hold: later reporting on a story carries
the same one. storylineId is null on a call event and on an event not threaded
into a story; treat those as stories of their own.
Examples
Urgent Security Events On Crypto Assets
Fires on each urgent security event, up to 20 times a week, at most once every 15 minutes.
{
"title": "Crypto security alerts",
"description": "Notify on urgent hacks and exploits involving crypto assets.",
"conditions": {
"AND": [
{
"source": "events",
"args": { "eventType": "security", "alertAction": "alert", "assetClass": "crypto" }
}
]
},
"actions": [
{
"stepId": "step_1",
"type": "notify",
"params": { "message": "[{{title}}] Security event at {{trigger_time}}" }
}
],
"expiresIn": "168h",
"repeat": { "cooldown": "15m", "maxTriggers": 20 }
}
For HTTP calls, wrap conditions, actions, expiresIn, and repeat under a
top-level query key. See HTTP Request Wrapper.
Bearish News On One Asset
{
"source": "events",
"args": { "entity": "ETH", "implication": "bearish" }
}
Exchange Listings
{
"source": "events",
"args": { "eventType": "listing", "assetClass": "crypto" }
}
A Specific Claim
{
"source": "events",
"args": {
"eventType": "regulatory",
"text": "the SEC approves a spot crypto ETF",
"minConfidence": 80
}
}
Several Assets
{
"OR": [
{ "source": "events", "args": { "entity": "BTC", "eventType": "marketFlow" } },
{ "source": "events", "args": { "entity": "ETH", "eventType": "marketFlow" } }
]
}
News And Price Together
Fires when bullish regulatory news on ETH lands while ETH is up more than 2% in the last hour:
{
"AND": [
{ "source": "events", "args": { "entity": "ETH", "eventType": "regulatory", "implication": "bullish" } },
{
"source": "price",
"method": "change",
"args": { "symbol": "ETH", "period": "1h", "exchange": "hyperliquid" },
"operator": ">",
"value": 2
}
]
}
Validation Notes
| Error signal | What it means | Next action |
|---|---|---|
EQL_INVALID_ARG_VALUE with "provide at least one of entity, eventClass, …" | The condition has no filter and no text. | Add a filter, or text with minConfidence. |
EQL_INVALID_ARG_VALUE with "Unknown entity" | No asset, project, person, or organisation matches entity (or none of the entityType you set). | Check the spelling, try the ticker or the full name, or drop entity and describe the subject with eventType and text. |
EQL_INVALID_ARG_VALUE with "Ambiguous entity", candidates in details.candidates | The name matches several entities equally. | Set entityType, or pass the publishedId of the candidate you mean as entity. |
EQL_INVALID_ARG_VALUE with "is an asset events never name" | The entity resolved to an asset that events do not cover. | Pick another entity, or filter on eventType and text. |
EQL_MISSING_ARG for minConfidence | text without minConfidence. | Add minConfidence (start at 80). |
EQL_INVALID_ARG_VALUE on minConfidence, "it applies to 'text'" | minConfidence without text. | Add text, or remove minConfidence. |
EQL_INVALID_ARG_VALUE on entityType, "it narrows 'entity'" | entityType without entity. | Add entity, or remove entityType. |
EQL_INVALID_ARG_VALUE with "expected one of …" | A filter value outside its list. | Use one of the values in Filters; note marketFlow is camelCase. |
EQL_INVALID_JSON with "conditions must be a root AND or OR group …" | Usually an argument given as an array, e.g. "entity": ["BTC", "ETH"]. | One value per argument; write several conditions under OR. |
EQL_INVALID_OPERATOR | The full form with an operator other than ==, or a value other than true. | Use the shorthand. |
| Warning "… can also mean …" | entity resolved, but other entities share the name. | Confirm the resolved entity is the one you meant; otherwise set entityType or pass an id. |
| Plan is active but never fires | No event has matched yet. | Loosen filters, check the resolved entity in the Validate warning, and remember events arrive minutes to hours after the first post. |
Related Docs
- Triggers (Conditions + Indicators)
- Query Model and Templates
- Events, Storylines and Arcs: the events these conditions match
- Entities: ids for
entity - Validate Query
- Create Query