API reference / Automations

Resume firing

POST/v1/users/{userId}/automations/{automationId}/enable

Resumes a paused automation: its clock and readers restart, and its sources are re-planned before firing resumes. Refused if an operator holds the automation, if its rule no longer compiles or plans cleanly, or if the automation carries a contract — once withdrawn, a contract's standing authority cannot be re-approved by resuming; create a new automation instead.

Authentication

Both headers are required.

  • Header: X-Api-Key: YOUR_API_KEY
  • Header: Authorization: Bearer YOUR_USER_TOKEN

Path parameters

userIdstring · uuidrequired

The user in the path; must equal the token's own account.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
automationIdstring · uuidrequired

The automation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"

Request example

Illustrative request. Replace the host, credentials and resource IDs with your own. If a request file is shown, create it from the schema above. Review the requested action before sending it.

curl --request POST 'https://api.example.test/v1/users/YOUR_USER_ID/automations/YOUR_AUTOMATION_ID/enable' \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Authorization: Bearer YOUR_USER_TOKEN'

Responses

200 The automation, updated.

The automation, updated.

application/json · object

One automation: its rule, its current sources, its monitoring health, and the occurrences it has fired.

idstring · uuidrequired

The automation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
namestringrequired

The automation's name.

promptstringrequired

The instructions given to the model each time this automation fires.

ruleobjectrequired

One automation's rule: when it wakes, what condition it evaluates, and how it fires.

Show attributes

One automation's rule: when it wakes, what condition it evaluates, and how it fires.

schemaVersionnumberrequired

The rule schema's version; always 1.

Validation rules
Exact value
1
deliveryoneOfrequired

What happens when a new occurrence is ready before the previous one has finished.

Show attributes

What happens when a new occurrence is ready before the previous one has finished.

Validation rules
Default
{"overlap":"queue","maxPendingOccurrences":100}
oneOf · 3 variants
Variant 1 · object
overlapstringrequired

Queue a new occurrence and run it once the active one finishes.

Validation rules
Exact value
"queue"
maxPendingOccurrencesintegerrequired

How many occurrences may wait in the queue, not counting the one currently active, including one whose run is itself waiting on an approval.

Validation rules
Minimum
1
Maximum
100
Variant 2 · object
overlapstringrequired

Close the occurrence already pending as coalesced and record the new match as a fresh occurrence, rather than queuing a second.

Validation rules
Exact value
"coalesce"
Variant 3 · object
overlapstringrequired

Drop a new match while an occurrence is already active.

Validation rules
Exact value
"skip"
maxDeliveryLatenessSecondsintegerrequired

How long a new occurrence may wait to be delivered before its deadline passes and it is refused, in seconds.

Validation rules
Default
86400
Minimum
1
Maximum
86400
maxEvaluationGapSecondsintegerrequired

The longest gap allowed between evaluations before firing.mode: rising_edge treats its history as broken and waits for a fresh baseline, in seconds.

Validation rules
Default
600
Minimum
1
Maximum
2678400
wakesarrayrequired

Occasions to evaluate the rule's condition: alternatives, not an AND of conditions. At most one clock, one event stream and one manual wake.

Show attributes

Occasions to evaluate the rule's condition: alternatives, not an AND of conditions. At most one clock, one event stream and one manual wake.

Validation rules
Minimum items
1
Maximum items
7
Array items · oneOf
oneOf · 6 variants
Variant 1 · kind: at
kindstringrequired

A one-time wake at an exact moment; exhausted after that check, even if its condition is false.

Validation rules
Exact value
"at"
runAtstring · date-timerequired

The exact moment this wake fires, as an ISO 8601 timestamp with an offset.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
misfireoneOfrequired

What happens when the engine could not evaluate this wake on time.

Show attributes

What happens when the engine could not evaluate this wake on time.

Validation rules
Default
{"mode":"latest","maxLatenessSeconds":null}
oneOf · 3 variants
Variant 1 · object
modestringrequired

Drop a wake the engine could not evaluate in time; wait for the next one.

Validation rules
Exact value
"skip"
graceSecondsintegerrequired

How late this wake may still run before it counts as missed, in seconds.

Validation rules
Default
5
Minimum
1
Maximum
60
Variant 2 · object
modestringrequired

Run once for the most recently missed wake, dropping any earlier ones.

Validation rules
Exact value
"latest"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
Variant 3 · object
modestringrequired

Run once for every missed wake, oldest first.

Validation rules
Exact value
"all"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
evaluationTimestringrequired

Which moment this wake is evaluated as of: scheduled_time the time it was due, detection_time when the engine actually ran it.

Validation rules
Default
"detection_time"
Allowed values
["scheduled_time","detection_time"]
Variant 2 · kind: interval
kindstringrequired

A wake that repeats on a fixed elapsed interval.

Validation rules
Exact value
"interval"
intervalMinutesintegerrequired

How often this wake repeats, in minutes.

Validation rules
Minimum
1
Maximum
44640
misfireoneOfrequired

What happens when the engine could not evaluate this wake on time.

Show attributes

What happens when the engine could not evaluate this wake on time.

Validation rules
Default
{"mode":"latest","maxLatenessSeconds":null}
oneOf · 3 variants
Variant 1 · object
modestringrequired

Drop a wake the engine could not evaluate in time; wait for the next one.

Validation rules
Exact value
"skip"
graceSecondsintegerrequired

How late this wake may still run before it counts as missed, in seconds.

Validation rules
Default
5
Minimum
1
Maximum
60
Variant 2 · object
modestringrequired

Run once for the most recently missed wake, dropping any earlier ones.

Validation rules
Exact value
"latest"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
Variant 3 · object
modestringrequired

Run once for every missed wake, oldest first.

Validation rules
Exact value
"all"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
evaluationTimestringrequired

Which moment this wake is evaluated as of: scheduled_time the time it was due, detection_time when the engine actually ran it.

Validation rules
Default
"detection_time"
Allowed values
["scheduled_time","detection_time"]
Variant 3 · kind: calendar
kindstringrequired

A wake on a recurring calendar schedule: local times, weekdays, months and days of the month.

Validation rules
Exact value
"calendar"
timeZonestringrequired

The IANA time zone a calendar wake's local times are interpreted in.

Validation rules
Minimum length
1
Maximum length
80
localTimesarrayrequired

The times of day this wake fires, each in 24-hour HH:MM form, in timeZone.

Show attributes

The times of day this wake fires, each in 24-hour HH:MM form, in timeZone.

Validation rules
Minimum items
1
Maximum items
24
Array items · string
Validation rules
Pattern
"^([01]\\d|2[0-3]):[0-5]\\d$"
weekdaysarrayrequired

Which ISO weekdays this wake fires on, 1 (Monday) through 7 (Sunday). Defaults to every day.

Show attributes

Which ISO weekdays this wake fires on, 1 (Monday) through 7 (Sunday). Defaults to every day.

Validation rules
Default
[1,2,3,4,5,6,7]
Minimum items
1
Maximum items
7
Array items · integer
Validation rules
Minimum
1
Maximum
7
monthsarrayrequired

Which months this wake fires in, 1 (January) through 12 (December). Defaults to every month.

Show attributes

Which months this wake fires in, 1 (January) through 12 (December). Defaults to every month.

Validation rules
Default
[1,2,3,4,5,6,7,8,9,10,11,12]
Minimum items
1
Maximum items
12
Array items · integer
Validation rules
Minimum
1
Maximum
12
monthDaysarrayrequired

Which days of the month this wake fires on, 1 through 31. Defaults to every day.

Show attributes

Which days of the month this wake fires on, 1 through 31. Defaults to every day.

Validation rules
Default
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
Minimum items
1
Maximum items
31
Array items · integer
Validation rules
Minimum
1
Maximum
31
misfireoneOfrequired

What happens when the engine could not evaluate this wake on time.

Show attributes

What happens when the engine could not evaluate this wake on time.

Validation rules
Default
{"mode":"latest","maxLatenessSeconds":null}
oneOf · 3 variants
Variant 1 · object
modestringrequired

Drop a wake the engine could not evaluate in time; wait for the next one.

Validation rules
Exact value
"skip"
graceSecondsintegerrequired

How late this wake may still run before it counts as missed, in seconds.

Validation rules
Default
5
Minimum
1
Maximum
60
Variant 2 · object
modestringrequired

Run once for the most recently missed wake, dropping any earlier ones.

Validation rules
Exact value
"latest"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
Variant 3 · object
modestringrequired

Run once for every missed wake, oldest first.

Validation rules
Exact value
"all"
maxLatenessSecondsanyOfrequired

How late a missed wake may still run, in seconds; null for no limit.

Show attributes

How late a missed wake may still run, in seconds; null for no limit.

Validation rules
Default
null
anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2678400
Variant 2 · null
evaluationTimestringrequired

Which moment this wake is evaluated as of: scheduled_time the time it was due, detection_time when the engine actually ran it.

Validation rules
Default
"detection_time"
Allowed values
["scheduled_time","detection_time"]
Variant 4 · kind: event
kindstringrequired

A wake evaluated each time a matching custom webhook event arrives.

Validation rules
Exact value
"event"
eventTypestringrequired

The event type this wake matches; a live webhook delivery of a different type is ignored before it reaches the condition.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_.:-]{0,79}$"
fieldsarrayrequired

The data fields an event of this type is declared to carry.

Show attributes

The data fields an event of this type is declared to carry.

Validation rules
Maximum items
32
Array items · object

One data field an event or a source's observation carries: where it lives, and its type.

patharrayrequired

The keys to walk, in order, from an observation's top level down to this field.

Show attributes

The keys to walk, in order, from an observation's top level down to this field.

Validation rules
Minimum items
1
Maximum items
8
Array items · string
Validation rules
Pattern
"^[A-Za-z_][A-Za-z0-9_-]{0,63}$"
valueTypeoneOfrequired

What type this field's value has, and the unit it carries when it has one.

Show attributes

What type this field's value has, and the unit it carries when it has one.

oneOf · 4 variants
Variant 1 · type: boolean
typestringrequired

A true/false value.

Validation rules
Exact value
"boolean"
Variant 2 · type: string
typestringrequired

A text value.

Validation rules
Exact value
"string"
Variant 3 · type: integer
typestringrequired

A whole-number value, compared exactly.

Validation rules
Exact value
"integer"
unitstringrequired

The unit an integer or decimal value is measured in, as the source or literal declares it.

Validation rules
Minimum length
1
Maximum length
64
Variant 4 · type: decimal
typestringrequired

An exact decimal value, as text, compared exactly.

Validation rules
Exact value
"decimal"
unitstringrequired

The unit an integer or decimal value is measured in, as the source or literal declares it.

Validation rules
Minimum length
1
Maximum length
64
optionalbooleanoptional

Whether the provider may genuinely not observe this field, rather than fail to read it. When true, a missing value resolves a condition over it to missing_field and the rule's verdict to unknown, rather than zero, null or false.

Variant 5 · kind: reader_update
kindstringrequired

A wake evaluated each time the named reader delivers a fresh observation.

Validation rules
Exact value
"reader_update"
bindingstringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
Variant 6 · kind: manual
kindstringrequired

A wake fired only by automations.invoke or automations.signal, never on its own.

Validation rules
Exact value
"manual"
readersarrayrequired

The named source bindings this rule reads from, referenced by condition and by each reader_update wake's binding.

Show attributes

The named source bindings this rule reads from, referenced by condition and by each reader_update wake's binding.

Validation rules
Maximum items
4
Array items · object
namestringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
readerIdstringrequired

The installed source operation's id, as returned by automationSources.list.

Validation rules
Pattern
"^[a-z][a-z0-9_.-]{0,79}$"
configobjectrequired

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Show attributes

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Validation rules
propertyNames
{"type":"string"}
Additional property values

Any JSON value: a string, number, boolean, null, array or object, nested to any depth.

anyOf · 6 variants
Variant 1 · string
Variant 2 · number
Variant 3 · boolean
Variant 4 · null
Variant 5 · array
Array items · anyOf

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

Variant 6 · object
Validation rules
propertyNames
{"type":"string"}
Additional property values

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

pollIntervalSecondsintegerrequired

How often this reader polls its source, in seconds.

Validation rules
Minimum
1
Maximum
2147483
maxAgeSecondsintegerrequired

Maximum retained input age at evaluation, matching requirement.maxAgeSeconds when present. Snapshots use observation time; events use trusted receipt time. Collection separately enforces the provider's acquisition-age guarantee.

Validation rules
Minimum
1
Maximum
86400
requirementobjectoptional

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

Show attributes

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

maxLatencySecondsanyOfrequired

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

Show attributes

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2147483
Variant 2 · null
maxAgeSecondsintegerrequired

Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window.

Validation rules
Minimum
1
Maximum
86400
allowDegradedLatencybooleanrequired

Whether delivery slower than the target delay is still accepted.

maxAcceptedLatencySecondsintegeroptional

The slowest delivery still accepted, in seconds, when allowDegradedLatency is set.

Validation rules
Minimum
1
Maximum
2147483
conditionanyrequired

The rule's condition tree, up to 8 levels deep and 128 nodes total, built from five node kinds: {op:"bool", value} a fixed true/false leaf; {op:"compare", comparator, left, right} one of eq/ne/lt/lte/gt/gte between two operands — lt/lte/gt/gte require both operands to be integer or decimal, and both sides must share the same type and, for integer/decimal, the same unit; {op:"all", args} / {op:"any", args} AND/OR over one or more child nodes; {op:"not", arg} negates one child node. An operand is either {kind:"field", binding, path} — a bound reader's name and the key path into its data — or {kind:"literal", type, value, unit?} with type one of boolean/string/integer/decimal (integer/decimal values are exact decimal strings and carry unit). automations.testCondition evaluates the tree against a given event without firing.

firingobjectrequired

How this rule turns a qualifying evaluation into a firing: which ones count, how often, and how many.

Show attributes

How this rule turns a qualifying evaluation into a firing: which ones count, how often, and how many.

modestringrequired

When a qualifying evaluation fires: each_match fires on every qualifying evaluation, including the first; rising_edge fires only on a known false-to-true transition.

Validation rules
Allowed values
["each_match","rising_edge"]
repeatstringrequired

Whether this rule fires at most once, or keeps watching after it fires.

Validation rules
Allowed values
["once","repeating"]
maxRunsintegeroptional

Maximum deliverable runs recorded for this automation across pauses and resumes. Missed or refused deliveries do not count; recorded runs count even if later canceled, coalesced or failed. Omit for no finite limit beyond repeat=once.

Validation rules
Minimum
1
Maximum
1000000
initialstringrequired

How rising_edge treats the first known state: baseline records it without firing, fire_if_true fires immediately if it is already true.

Validation rules
Allowed values
["baseline","fire_if_true"]
cooldownSecondsintegerrequired

The minimum time between firings, in seconds; it does not require the condition to stay true that whole time. For rising_edge, a false-to-true edge that lands inside cooldown is discarded, not queued: it is not replayed once cooldown ends, so the rule needs an entirely fresh edge after cooldown lapses before it fires again — simply remaining true past the cooldown boundary does not trigger a firing.

Validation rules
Minimum
0
Maximum
2678400
maxSnapshotSkewSecondsintegerrequired

The most that bound readers' observation times may disagree before evaluation reports snapshot_skew, in seconds.

Validation rules
Minimum
0
Maximum
86400
sourcePlansarrayrequired

How each of the rule's bindings will actually be collected.

Show attributes

How each of the rule's bindings will actually be collected.

Validation rules
Maximum items
4
Array items · object
bindingstringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
resultoneOfrequired

Whether this binding is ready, needs a connection, or is unsupported, and why.

Show attributes

Whether this binding is ready, needs a connection, or is unsupported, and why.

oneOf · 3 variants
Variant 1 · status: ready
statusstringrequired

The binding is fully planned and ready to collect.

Validation rules
Exact value
"ready"
planobjectrequired

How one binding will actually be collected: the operation, its guarantees and its configuration.

Show attributes

How one binding will actually be collected: the operation, its guarantees and its configuration.

operationIdstringrequired

The collection operation this plan uses.

Validation rules
Pattern
"^[a-z][a-z0-9_.-]{0,79}$"
operationVersionintegerrequired

The collection operation's version.

Validation rules
Greater than
0
Maximum
9007199254740991
descriptorFingerprintstringrequired

A content hash of the source descriptor this plan was built from.

Validation rules
Pattern
"^[a-f0-9]{64}$"
configobjectrequired

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Show attributes

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Validation rules
propertyNames
{"type":"string"}
Additional property values

Any JSON value: a string, number, boolean, null, array or object, nested to any depth.

anyOf · 6 variants
Variant 1 · string
Variant 2 · number
Variant 3 · boolean
Variant 4 · null
Variant 5 · array
Array items · anyOf

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

Variant 6 · object
Validation rules
propertyNames
{"type":"string"}
Additional property values

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

requirementobjectrequired

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

Show attributes

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

maxLatencySecondsanyOfrequired

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

Show attributes

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2147483
Variant 2 · null
maxAgeSecondsintegerrequired

Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window.

Validation rules
Minimum
1
Maximum
86400
allowDegradedLatencybooleanrequired

Whether delivery slower than the target delay is still accepted.

maxAcceptedLatencySecondsintegeroptional

The slowest delivery still accepted, in seconds, when allowDegradedLatency is set.

Validation rules
Minimum
1
Maximum
2147483
guaranteesobjectrequired

What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen.

Show attributes

What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen.

minCadenceSecondsintegerrequired

The shortest interval between requests the provider permits, in seconds.

Validation rules
Minimum
0
Maximum
2147483
expectedLatencySecondsanyOfrequired

How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here.

Show attributes

How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
0
Maximum
2147483
Variant 2 · null
maxAgeSecondsintegerrequired

Maximum snapshot observation age accepted at collection. This acquisition guarantee does not shorten a reader's separately declared evaluation-age window.

Validation rules
Minimum
0
Maximum
2147483
requestsPerMinuteanyOfrequired

The provider's own rate limit for this source, when it publishes one.

Show attributes

The provider's own rate limit for this source, when it publishes one.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Greater than
0
Maximum
9007199254740991
Variant 2 · null
observationReuseSecondsintegeroptional

How long one provider observation may serve every reader watching the same subject under the same connection, in seconds. Absent or 0 means each reader causes its own request. A reused observation keeps the provider's own sourceTime, so declared freshness still governs; what reuse changes is how often the provider is asked, not how old an accepted observation may be. Keep it at or below the cadence readers are expected to poll at.

Validation rules
Minimum
0
Maximum
2147483
batchLimitintegeroptional

How many distinct subjects the provider can serve in one request. Absent or 1 means no batching. Only providers implementing readBatch may declare more: the framework cannot infer that an API accepts several subjects.

Validation rules
Greater than
0
Maximum
1000
scopeKindstringrequired

Who this binding is scoped to: public data anyone can read, user data read under the owner's own connection.

Validation rules
Allowed values
["public","user"]
explanationstringrequired

Why this plan was chosen, in the reviewer's own words.

Validation rules
Maximum length
2048
recipeobjectoptional

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

Show attributes

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

versionintegerrequired

The recipe description's own version, bumped when its steps change.

Validation rules
Greater than
0
Maximum
9007199254740991
titlestringrequired

The recipe's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
summarystringrequired

What the recipe does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
stepsarrayrequired

The recipe's steps, in order.

Show attributes

The recipe's steps, in order.

Validation rules
Minimum items
1
Maximum items
12
Array items · object
idstringrequired

The step's identifier, unique within its recipe.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
kindstringrequired

What this step does: request calls the provider, validate checks what it returned, calculate derives a value from earlier steps.

Validation rules
Allowed values
["request","validate","calculate"]
titlestringrequired

The step's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
descriptionstringrequired

What this step does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
apiobjectoptional

The request this step makes, when it calls the provider.

Show attributes

The request this step makes, when it calls the provider.

methodstringrequired

The request's method or protocol.

Validation rules
Allowed values
["GET","POST","GRAPHQL"]
resourcestringrequired

The request's path or resource name.

Validation rules
Minimum length
1
Maximum length
160
Pattern
"^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$"
limitationsarrayrequired

What the recipe does not cover, in the reviewer's own words.

Show attributes

What the recipe does not cover, in the reviewer's own words.

Validation rules
Maximum items
6
Array items · string
Validation rules
Minimum length
1
Maximum length
600
fingerprintstringrequired

A content hash identifying this exact recipe, independent of execution or connection identity.

Validation rules
Pattern
"^[a-f0-9]{64}$"
degradedbooleanrequired

Whether this plan settled for weaker guarantees than the rule asked for.

Variant 2 · status: needs_connection
statusstringrequired

The binding is plannable but needs a connection the owner has not granted yet.

Validation rules
Exact value
"needs_connection"
candidatePlanobjectrequired

The plan that would apply once the missing connection is granted.

Show attributes

The plan that would apply once the missing connection is granted.

operationIdstringrequired

The collection operation this plan uses.

Validation rules
Pattern
"^[a-z][a-z0-9_.-]{0,79}$"
operationVersionintegerrequired

The collection operation's version.

Validation rules
Greater than
0
Maximum
9007199254740991
descriptorFingerprintstringrequired

A content hash of the source descriptor this plan was built from.

Validation rules
Pattern
"^[a-f0-9]{64}$"
configobjectrequired

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Show attributes

Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries.

Validation rules
propertyNames
{"type":"string"}
Additional property values

Any JSON value: a string, number, boolean, null, array or object, nested to any depth.

anyOf · 6 variants
Variant 1 · string
Variant 2 · number
Variant 3 · boolean
Variant 4 · null
Variant 5 · array
Array items · anyOf

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

Variant 6 · object
Validation rules
propertyNames
{"type":"string"}
Additional property values

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

requirementobjectrequired

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

Show attributes

What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable.

maxLatencySecondsanyOfrequired

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

Show attributes

The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
1
Maximum
2147483
Variant 2 · null
maxAgeSecondsintegerrequired

Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window.

Validation rules
Minimum
1
Maximum
86400
allowDegradedLatencybooleanrequired

Whether delivery slower than the target delay is still accepted.

maxAcceptedLatencySecondsintegeroptional

The slowest delivery still accepted, in seconds, when allowDegradedLatency is set.

Validation rules
Minimum
1
Maximum
2147483
guaranteesobjectrequired

What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen.

Show attributes

What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen.

minCadenceSecondsintegerrequired

The shortest interval between requests the provider permits, in seconds.

Validation rules
Minimum
0
Maximum
2147483
expectedLatencySecondsanyOfrequired

How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here.

Show attributes

How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Minimum
0
Maximum
2147483
Variant 2 · null
maxAgeSecondsintegerrequired

Maximum snapshot observation age accepted at collection. This acquisition guarantee does not shorten a reader's separately declared evaluation-age window.

Validation rules
Minimum
0
Maximum
2147483
requestsPerMinuteanyOfrequired

The provider's own rate limit for this source, when it publishes one.

Show attributes

The provider's own rate limit for this source, when it publishes one.

anyOf · 2 variants
Variant 1 · integer
Validation rules
Greater than
0
Maximum
9007199254740991
Variant 2 · null
observationReuseSecondsintegeroptional

How long one provider observation may serve every reader watching the same subject under the same connection, in seconds. Absent or 0 means each reader causes its own request. A reused observation keeps the provider's own sourceTime, so declared freshness still governs; what reuse changes is how often the provider is asked, not how old an accepted observation may be. Keep it at or below the cadence readers are expected to poll at.

Validation rules
Minimum
0
Maximum
2147483
batchLimitintegeroptional

How many distinct subjects the provider can serve in one request. Absent or 1 means no batching. Only providers implementing readBatch may declare more: the framework cannot infer that an API accepts several subjects.

Validation rules
Greater than
0
Maximum
1000
scopeKindstringrequired

Who this binding is scoped to: public data anyone can read, user data read under the owner's own connection.

Validation rules
Allowed values
["public","user"]
explanationstringrequired

Why this plan was chosen, in the reviewer's own words.

Validation rules
Maximum length
2048
recipeobjectoptional

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

Show attributes

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

versionintegerrequired

The recipe description's own version, bumped when its steps change.

Validation rules
Greater than
0
Maximum
9007199254740991
titlestringrequired

The recipe's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
summarystringrequired

What the recipe does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
stepsarrayrequired

The recipe's steps, in order.

Show attributes

The recipe's steps, in order.

Validation rules
Minimum items
1
Maximum items
12
Array items · object
idstringrequired

The step's identifier, unique within its recipe.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
kindstringrequired

What this step does: request calls the provider, validate checks what it returned, calculate derives a value from earlier steps.

Validation rules
Allowed values
["request","validate","calculate"]
titlestringrequired

The step's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
descriptionstringrequired

What this step does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
apiobjectoptional

The request this step makes, when it calls the provider.

Show attributes

The request this step makes, when it calls the provider.

methodstringrequired

The request's method or protocol.

Validation rules
Allowed values
["GET","POST","GRAPHQL"]
resourcestringrequired

The request's path or resource name.

Validation rules
Minimum length
1
Maximum length
160
Pattern
"^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$"
limitationsarrayrequired

What the recipe does not cover, in the reviewer's own words.

Show attributes

What the recipe does not cover, in the reviewer's own words.

Validation rules
Maximum items
6
Array items · string
Validation rules
Minimum length
1
Maximum length
600
fingerprintstringrequired

A content hash identifying this exact recipe, independent of execution or connection identity.

Validation rules
Pattern
"^[a-f0-9]{64}$"
degradedbooleanrequired

Whether this plan settled for weaker guarantees than the rule asked for.

reasonsarrayrequired

Why this binding could not be planned as asked.

Show attributes

Why this binding could not be planned as asked.

Validation rules
Minimum items
1
Maximum items
32
Array items · object
codestringrequired

A machine-readable reason code.

Validation rules
Minimum length
1
Maximum length
80
pathstringoptional

The field this reason is about, when it is about one.

Validation rules
Maximum length
256
messagestringrequired

The reason, in the reviewer's own words.

Validation rules
Maximum length
2048
Variant 3 · status: unsupported
statusstringrequired

The binding cannot be planned at all, as asked.

Validation rules
Exact value
"unsupported"
reasonsarrayrequired

Why this binding could not be planned as asked.

Show attributes

Why this binding could not be planned as asked.

Validation rules
Minimum items
1
Maximum items
32
Array items · object
codestringrequired

A machine-readable reason code.

Validation rules
Minimum length
1
Maximum length
80
pathstringoptional

The field this reason is about, when it is about one.

Validation rules
Maximum length
256
messagestringrequired

The reason, in the reviewer's own words.

Validation rules
Maximum length
2048
revisionstringrequired

The automation's concurrency token, <definitionVersion>.<activationEpoch>, unique to one exact version. Writes must echo the value just read back unchanged; a stale one is refused as automation_changed.

Validation rules
Pattern
"^[1-9]\\d*\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
enabledbooleanrequired

Whether this automation is currently firing.

createdAtstring · date-timerequired

When this automation was created.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
updatedAtstring · date-timerequired

When this automation was last changed.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
archivedAtanyOfrequired

When this automation was archived, when it has been.

Show attributes

When this automation was archived, when it has been.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
holdanyOfrequired

An operator's hold: why future work is stopped, so the owner does not read it as their own doing.

Show attributes

An operator's hold: why future work is stopped, so the owner does not read it as their own doing.

anyOf · 2 variants
Variant 1 · object
atstring · date-timerequired

When the hold began.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
reasonstring or nullrequired

Why an operator placed the hold, when they gave one.

Variant 2 · null
nextFireAtanyOfrequired

When this automation's clock will next wake it, when it has a schedule and is enabled.

Show attributes

When this automation's clock will next wake it, when it has a schedule and is enabled.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
monitoringobjectrequired

An automation's current health: its sources, its most recent evaluation, and its inbound webhook, if it has one.

Show attributes

An automation's current health: its sources, its most recent evaluation, and its inbound webhook, if it has one.

statusstringrequired

The automation's overall monitoring status: waiting no evaluation yet, healthy sources and evaluation are current, stale an input is older than expected, unavailable a source could not be reached, paused firing is paused, completed its run policy is spent.

Validation rules
Allowed values
["waiting","healthy","stale","unavailable","paused","completed"]
lastCheckedAtanyOfrequired

When monitoring last checked this automation's sources.

Show attributes

When monitoring last checked this automation's sources.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
sourcesarrayrequired

Each bound source's own health.

Show attributes

Each bound source's own health.

Validation rules
Maximum items
5
Array items · object
bindingstringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
sourceIdstringrequired

The source's id within its provider.

checkobjectoptional

The most recent recipe check against this source, when evidence review is configured.

Show attributes

The most recent recipe check against this source, when evidence review is configured.

recipeobjectrequired

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

Show attributes

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

versionintegerrequired

The recipe description's own version, bumped when its steps change.

Validation rules
Greater than
0
Maximum
9007199254740991
titlestringrequired

The recipe's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
summarystringrequired

What the recipe does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
stepsarrayrequired

The recipe's steps, in order.

Show attributes

The recipe's steps, in order.

Validation rules
Minimum items
1
Maximum items
12
Array items · object
idstringrequired

The step's identifier, unique within its recipe.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
kindstringrequired

What this step does: request calls the provider, validate checks what it returned, calculate derives a value from earlier steps.

Validation rules
Allowed values
["request","validate","calculate"]
titlestringrequired

The step's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
descriptionstringrequired

What this step does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
apiobjectoptional

The request this step makes, when it calls the provider.

Show attributes

The request this step makes, when it calls the provider.

methodstringrequired

The request's method or protocol.

Validation rules
Allowed values
["GET","POST","GRAPHQL"]
resourcestringrequired

The request's path or resource name.

Validation rules
Minimum length
1
Maximum length
160
Pattern
"^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$"
limitationsarrayrequired

What the recipe does not cover, in the reviewer's own words.

Show attributes

What the recipe does not cover, in the reviewer's own words.

Validation rules
Maximum items
6
Array items · string
Validation rules
Minimum length
1
Maximum length
600
fingerprintstringrequired

A content hash identifying this exact recipe, independent of execution or connection identity.

Validation rules
Pattern
"^[a-f0-9]{64}$"
startedAtstring · date-timerequired

When this check began.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
completedAtstring · date-timerequired

When this check finished.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
statusstringrequired

Whether every step completed.

Validation rules
Allowed values
["completed","failed"]
stepsarrayrequired

Each step's own recorded outcome, in order.

Show attributes

Each step's own recorded outcome, in order.

Validation rules
Maximum items
12
Array items · object

One recipe step's recorded outcome: counts and a closed reason only, never a URL, body, cursor, address or error message.

stepIdstringrequired

The declared recipe step this check reports on.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
outcomestringrequired

Whether the step completed or failed.

Validation rules
Allowed values
["completed","failed"]
requestCountintegeroptional

How many requests this step made, when it made any.

Validation rules
Minimum
0
Maximum
100000
itemCountintegeroptional

How many items this step processed, when counting applies.

Validation rules
Minimum
0
Maximum
1000000
durationMsintegeroptional

How long this step took, in milliseconds.

Validation rules
Minimum
0
Maximum
600000
reasonstringoptional

Why the step failed, when it did: not_configured the source lacks a needed setting, unavailable the provider did not answer, malformed its answer could not be read, oversized the answer exceeded a bound, stale or future a timestamp was out of range, incomplete part of the answer was missing, invalid the answer failed validation, canceled the check was stopped before finishing.

Validation rules
Allowed values
["not_configured","unavailable","malformed","oversized","stale","future","incomplete","invalid","canceled"]
statusstringrequired

This source's health: waiting no observation yet, healthy fresh, stale older than expected, unavailable the provider could not be reached.

Validation rules
Allowed values
["waiting","healthy","stale","unavailable"]
sourceTimeanyOfrequired

When the provider says the most recent observation was true.

Show attributes

When the provider says the most recent observation was true.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
receivedAtanyOfrequired

When the engine received the most recent observation.

Show attributes

When the engine received the most recent observation.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
reasonstring or nullrequired

Why the source is not healthy, when it is not.

lastEvaluationanyOfrequired

The rule's most recent evaluation, when it has run at least once.

Show attributes

The rule's most recent evaluation, when it has run at least once.

anyOf · 2 variants
Variant 1 · object
verdictstringrequired

Whether the rule's condition holds: true it fires, false it does not, unknown an input could not be read, so the rule neither fires nor is treated as false.

Validation rules
Allowed values
["true","false","unknown"]
evaluatedAtstring · date-timerequired

When this evaluation ran.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
reasonsarrayrequired

Why the verdict is what it is, one entry per condition node that did not cleanly resolve.

Show attributes

Why the verdict is what it is, one entry per condition node that did not cleanly resolve.

Validation rules
Maximum items
256
Array items · object
nodePatharrayrequired

The path to the condition node this reason explains, as indices into the rule tree.

Show attributes

The path to the condition node this reason explains, as indices into the rule tree.

Validation rules
Maximum items
8
Array items · integer
Validation rules
Minimum
0
Maximum
9007199254740991
codestringrequired

Why this node could not cleanly resolve: missing_source no binding was configured, unavailable the provider did not answer, gap a break in coverage was recorded, stale or future a timestamp was out of range, missing_field the observation lacked this field, invalid_value the value did not match its declared type, snapshot_skew the inputs disagreed on when they were true.

Validation rules
Allowed values
["missing_source","unavailable","gap","stale","future","missing_field","invalid_value","snapshot_skew"]
bindingstringoptional

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
inputsarrayrequired

Each input this evaluation read, without its raw data.

Show attributes

Each input this evaluation read, without its raw data.

Validation rules
Maximum items
5
Array items · oneOf
oneOf · 2 variants
Variant 1 · kind: snapshot
bindingstringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
sourceIdstringrequired

The source's id within its provider.

Validation rules
Minimum length
1
Maximum length
128
eventIdstringrequired

The observation or event's id.

Validation rules
Minimum length
1
Maximum length
128
receivedAtstring · date-timerequired

When the engine received this observation.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
maxAgeSecondsintegerrequired

How old this observation was allowed to be at evaluation, in seconds.

Validation rules
Greater than
0
Maximum
9007199254740991
statusstringrequired

Whether this input was ready to evaluate, the provider was unavailable, or a gap was recorded instead.

Validation rules
Allowed values
["ready","unavailable","gap"]
reasonanyOfrequired

Why the input is not ready, when it is not.

Show attributes

Why the input is not ready, when it is not.

anyOf · 2 variants
Variant 1 · string
Validation rules
Maximum length
512
Variant 2 · null
kindstringrequired

A point-in-time read of current state.

Validation rules
Exact value
"snapshot"
sourceTimestring · date-timerequired

When the provider says this snapshot was true.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · kind: received_event
bindingstringrequired

The binding name a rule or a plan gives one configured source.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
sourceIdstringrequired

The source's id within its provider.

Validation rules
Minimum length
1
Maximum length
128
eventIdstringrequired

The observation or event's id.

Validation rules
Minimum length
1
Maximum length
128
receivedAtstring · date-timerequired

When the engine received this observation.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
maxAgeSecondsintegerrequired

How old this observation was allowed to be at evaluation, in seconds.

Validation rules
Greater than
0
Maximum
9007199254740991
statusstringrequired

Whether this input was ready to evaluate, the provider was unavailable, or a gap was recorded instead.

Validation rules
Allowed values
["ready","unavailable","gap"]
reasonanyOfrequired

Why the input is not ready, when it is not.

Show attributes

Why the input is not ready, when it is not.

anyOf · 2 variants
Variant 1 · string
Validation rules
Maximum length
512
Variant 2 · null
kindstringrequired

An event the source pushed, or the engine collected as it happened.

Validation rules
Exact value
"received_event"
sourceTimenullrequired

Not applicable to a received event; see occurredAt and providerPublishedAt instead.

providerPublishedAtanyOfrequired

When the provider says it published this event, when it reports one.

Show attributes

When the provider says it published this event, when it reports one.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Maximum length
64
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
Variant 2 · null
occurredAtanyOfrequired

When the event actually happened, when the provider reports that separately from when it was published.

Show attributes

When the event actually happened, when the provider reports that separately from when it was published.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
finalizedAtanyOfrequired

When the provider considers this event no longer subject to correction, when it reports one.

Show attributes

When the provider considers this event no longer subject to correction, when it reports one.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
Variant 2 · null
webhookanyOfrequired

This automation's inbound webhook, when its rule listens for one.

Show attributes

This automation's inbound webhook, when its rule listens for one.

anyOf · 2 variants
Variant 1 · object
configuredbooleanrequired

Whether a webhook secret has been minted.

keyIdanyOfrequired

The current webhook secret's id, for rotation.

Show attributes

The current webhook secret's id, for rotation.

anyOf · 2 variants
Variant 1 · string · uuid
Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
Variant 2 · null
lastReceivedAtanyOfrequired

When the webhook last received a request.

Show attributes

When the webhook last received a request.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
Variant 2 · null
reasonstring or nullrequired

Why status is not healthy, when it is not.

activeOccurrenceanyOfrequired

The occurrence currently running, when one is.

Show attributes

The occurrence currently running, when one is.

anyOf · 2 variants
Variant 1 · object

One firing of an automation: what evidence triggered it, its delivery state, and the run it produced, if any.

idstring · uuidrequired

The occurrence's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
deliverySequencestringrequired

This occurrence's place in its automation's delivery order, as a string so it sorts and compares exactly at any size.

Validation rules
Pattern
"^[1-9]\\d*$"
automationIdstring · uuidrequired

The automation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
definitionVersionintegerrequired

The automation definition version this occurrence fired under.

Validation rules
Greater than
0
Maximum
9007199254740991
activationEpochstring · uuidrequired

The activation epoch this occurrence fired under.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
namestringrequired

The automation's name at the time this occurrence fired.

promptstringrequired

The automation's prompt at the time this occurrence fired.

evidenceobjectrequired

What triggered this occurrence: the decision, its evaluated data, and any recipe checks behind it.

Show attributes

What triggered this occurrence: the decision, its evaluated data, and any recipe checks behind it.

kindstringrequired

What produced this occurrence: decision the rule's own condition, manual an owner's invoke or signal, external a source that decided on the engine's behalf.

Validation rules
Allowed values
["decision","manual","external"]
identitystringrequired

A stable string identifying this exact decision, used to deduplicate replays.

Validation rules
Minimum length
1
Maximum length
256
evaluatedAtstring · date-timerequired

When this decision was made.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
dataobjectrequired

The observations behind one decision, exactly as evaluated. Bounded to 256 KiB, 24 levels of nesting and 16384 entries.

Show attributes

The observations behind one decision, exactly as evaluated. Bounded to 256 KiB, 24 levels of nesting and 16384 entries.

Validation rules
propertyNames
{"type":"string"}
Additional property values

Any JSON value: a string, number, boolean, null, array or object, nested to any depth.

anyOf · 6 variants
Variant 1 · string
Variant 2 · number
Variant 3 · boolean
Variant 4 · null
Variant 5 · array
Array items · anyOf

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

Variant 6 · object
Validation rules
propertyNames
{"type":"string"}
Additional property values

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

sourceChecksarrayoptional

Recipe checks recorded for each source this decision read, when evidence review is configured.

Show attributes

Recipe checks recorded for each source this decision read, when evidence review is configured.

Validation rules
Maximum items
4
Array items · object

Frozen recipe evidence tied to the actual observation used by one decision.

bindingstringrequired

The binding this check was collected for.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
sourceIdstringrequired

The source's id within its provider.

Validation rules
Minimum length
1
Maximum length
128
eventIdstringrequired

The specific event or observation this check backs.

Validation rules
Minimum length
1
Maximum length
128
operationIdstringrequired

The collection operation this check ran.

Validation rules
Pattern
"^[a-z][a-z0-9_.-]{0,79}$"
operationVersionintegerrequired

The collection operation's version.

Validation rules
Greater than
0
Maximum
9007199254740991
checkobjectrequired

A recorded run of a recipe's steps against the real source, kept as evidence.

Show attributes

A recorded run of a recipe's steps against the real source, kept as evidence.

recipeobjectrequired

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

Show attributes

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

versionintegerrequired

The recipe description's own version, bumped when its steps change.

Validation rules
Greater than
0
Maximum
9007199254740991
titlestringrequired

The recipe's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
summarystringrequired

What the recipe does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
stepsarrayrequired

The recipe's steps, in order.

Show attributes

The recipe's steps, in order.

Validation rules
Minimum items
1
Maximum items
12
Array items · object
idstringrequired

The step's identifier, unique within its recipe.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
kindstringrequired

What this step does: request calls the provider, validate checks what it returned, calculate derives a value from earlier steps.

Validation rules
Allowed values
["request","validate","calculate"]
titlestringrequired

The step's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
descriptionstringrequired

What this step does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
apiobjectoptional

The request this step makes, when it calls the provider.

Show attributes

The request this step makes, when it calls the provider.

methodstringrequired

The request's method or protocol.

Validation rules
Allowed values
["GET","POST","GRAPHQL"]
resourcestringrequired

The request's path or resource name.

Validation rules
Minimum length
1
Maximum length
160
Pattern
"^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$"
limitationsarrayrequired

What the recipe does not cover, in the reviewer's own words.

Show attributes

What the recipe does not cover, in the reviewer's own words.

Validation rules
Maximum items
6
Array items · string
Validation rules
Minimum length
1
Maximum length
600
fingerprintstringrequired

A content hash identifying this exact recipe, independent of execution or connection identity.

Validation rules
Pattern
"^[a-f0-9]{64}$"
startedAtstring · date-timerequired

When this check began.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
completedAtstring · date-timerequired

When this check finished.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
statusstringrequired

Whether every step completed.

Validation rules
Allowed values
["completed","failed"]
stepsarrayrequired

Each step's own recorded outcome, in order.

Show attributes

Each step's own recorded outcome, in order.

Validation rules
Maximum items
12
Array items · object

One recipe step's recorded outcome: counts and a closed reason only, never a URL, body, cursor, address or error message.

stepIdstringrequired

The declared recipe step this check reports on.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
outcomestringrequired

Whether the step completed or failed.

Validation rules
Allowed values
["completed","failed"]
requestCountintegeroptional

How many requests this step made, when it made any.

Validation rules
Minimum
0
Maximum
100000
itemCountintegeroptional

How many items this step processed, when counting applies.

Validation rules
Minimum
0
Maximum
1000000
durationMsintegeroptional

How long this step took, in milliseconds.

Validation rules
Minimum
0
Maximum
600000
reasonstringoptional

Why the step failed, when it did: not_configured the source lacks a needed setting, unavailable the provider did not answer, malformed its answer could not be read, oversized the answer exceeded a bound, stale or future a timestamp was out of range, incomplete part of the answer was missing, invalid the answer failed validation, canceled the check was stopped before finishing.

Validation rules
Allowed values
["not_configured","unavailable","malformed","oversized","stale","future","incomplete","invalid","canceled"]
statestringrequired

This occurrence's delivery state: pending waiting to run, deferred an admission attempt failed and is waiting to retry, accepted handed to a run, rejected the delivery policy refused it outright, or a non-retryable admission failure (or an exhausted retry deadline) stopped it, canceled stopped before running, skipped a previous occurrence was still active, coalesced merged into a newer match.

Validation rules
Allowed values
["pending","deferred","accepted","rejected","canceled","skipped","coalesced"]
reasonstring or nullrequired

Why the occurrence is in this state, when there is one to give.

createdAtstring · date-timerequired

When this occurrence was recorded.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
deliveryDeadlinestring · date-timerequired

The latest this occurrence could still be delivered.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
nextAttemptAtstring · date-timerequired

When the engine will next try to deliver this occurrence.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
lastAttemptAtanyOfrequired

When the engine last tried to deliver this occurrence, when it has tried.

Show attributes

When the engine last tried to deliver this occurrence, when it has tried.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
attemptsintegerrequired

How many delivery attempts this occurrence has had.

Validation rules
Minimum
0
Maximum
9007199254740991
conversationIdanyOfrequired

The conversation this occurrence ran in, once it has one.

Show attributes

The conversation this occurrence ran in, once it has one.

anyOf · 2 variants
Variant 1 · string · uuid

The conversation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
Variant 2 · null
runIdanyOfrequired

The run this occurrence produced, once it has one.

Show attributes

The run this occurrence produced, once it has one.

anyOf · 2 variants
Variant 1 · string · uuid
Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
Variant 2 · null
runStatusanyOfrequired

That run's status, once it has one: running, paused while an approval waits, then completed, failed or aborted.

Show attributes

That run's status, once it has one: running, paused while an approval waits, then completed, failed or aborted.

anyOf · 2 variants
Variant 1 · string
Validation rules
Allowed values
["running","paused","completed","failed","aborted"]
Variant 2 · null
runErrorstring or nullrequired

Why the run failed, when it did.

pendingApprovalsintegerrequired

How many approvals this occurrence's run is waiting on.

Validation rules
Minimum
0
Maximum
9007199254740991
Variant 2 · null
latestOccurrenceanyOfrequired

The most recent occurrence, running or not, when there has been one.

Show attributes

The most recent occurrence, running or not, when there has been one.

anyOf · 2 variants
Variant 1 · object

One firing of an automation: what evidence triggered it, its delivery state, and the run it produced, if any.

idstring · uuidrequired

The occurrence's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
deliverySequencestringrequired

This occurrence's place in its automation's delivery order, as a string so it sorts and compares exactly at any size.

Validation rules
Pattern
"^[1-9]\\d*$"
automationIdstring · uuidrequired

The automation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
definitionVersionintegerrequired

The automation definition version this occurrence fired under.

Validation rules
Greater than
0
Maximum
9007199254740991
activationEpochstring · uuidrequired

The activation epoch this occurrence fired under.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
namestringrequired

The automation's name at the time this occurrence fired.

promptstringrequired

The automation's prompt at the time this occurrence fired.

evidenceobjectrequired

What triggered this occurrence: the decision, its evaluated data, and any recipe checks behind it.

Show attributes

What triggered this occurrence: the decision, its evaluated data, and any recipe checks behind it.

kindstringrequired

What produced this occurrence: decision the rule's own condition, manual an owner's invoke or signal, external a source that decided on the engine's behalf.

Validation rules
Allowed values
["decision","manual","external"]
identitystringrequired

A stable string identifying this exact decision, used to deduplicate replays.

Validation rules
Minimum length
1
Maximum length
256
evaluatedAtstring · date-timerequired

When this decision was made.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
dataobjectrequired

The observations behind one decision, exactly as evaluated. Bounded to 256 KiB, 24 levels of nesting and 16384 entries.

Show attributes

The observations behind one decision, exactly as evaluated. Bounded to 256 KiB, 24 levels of nesting and 16384 entries.

Validation rules
propertyNames
{"type":"string"}
Additional property values

Any JSON value: a string, number, boolean, null, array or object, nested to any depth.

anyOf · 6 variants
Variant 1 · string
Variant 2 · number
Variant 3 · boolean
Variant 4 · null
Variant 5 · array
Array items · anyOf

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

Variant 6 · object
Validation rules
propertyNames
{"type":"string"}
Additional property values

Recursive reference: #/components/schemas/AutomationJsonValue. See the complete schema below.

sourceChecksarrayoptional

Recipe checks recorded for each source this decision read, when evidence review is configured.

Show attributes

Recipe checks recorded for each source this decision read, when evidence review is configured.

Validation rules
Maximum items
4
Array items · object

Frozen recipe evidence tied to the actual observation used by one decision.

bindingstringrequired

The binding this check was collected for.

Validation rules
Pattern
"^[A-Za-z][A-Za-z0-9_-]{0,31}$"
sourceIdstringrequired

The source's id within its provider.

Validation rules
Minimum length
1
Maximum length
128
eventIdstringrequired

The specific event or observation this check backs.

Validation rules
Minimum length
1
Maximum length
128
operationIdstringrequired

The collection operation this check ran.

Validation rules
Pattern
"^[a-z][a-z0-9_.-]{0,79}$"
operationVersionintegerrequired

The collection operation's version.

Validation rules
Greater than
0
Maximum
9007199254740991
checkobjectrequired

A recorded run of a recipe's steps against the real source, kept as evidence.

Show attributes

A recorded run of a recipe's steps against the real source, kept as evidence.

recipeobjectrequired

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

Show attributes

A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint.

versionintegerrequired

The recipe description's own version, bumped when its steps change.

Validation rules
Greater than
0
Maximum
9007199254740991
titlestringrequired

The recipe's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
summarystringrequired

What the recipe does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
stepsarrayrequired

The recipe's steps, in order.

Show attributes

The recipe's steps, in order.

Validation rules
Minimum items
1
Maximum items
12
Array items · object
idstringrequired

The step's identifier, unique within its recipe.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
kindstringrequired

What this step does: request calls the provider, validate checks what it returned, calculate derives a value from earlier steps.

Validation rules
Allowed values
["request","validate","calculate"]
titlestringrequired

The step's short label, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
120
descriptionstringrequired

What this step does, for the reviewed catalog.

Validation rules
Minimum length
1
Maximum length
600
apiobjectoptional

The request this step makes, when it calls the provider.

Show attributes

The request this step makes, when it calls the provider.

methodstringrequired

The request's method or protocol.

Validation rules
Allowed values
["GET","POST","GRAPHQL"]
resourcestringrequired

The request's path or resource name.

Validation rules
Minimum length
1
Maximum length
160
Pattern
"^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$"
limitationsarrayrequired

What the recipe does not cover, in the reviewer's own words.

Show attributes

What the recipe does not cover, in the reviewer's own words.

Validation rules
Maximum items
6
Array items · string
Validation rules
Minimum length
1
Maximum length
600
fingerprintstringrequired

A content hash identifying this exact recipe, independent of execution or connection identity.

Validation rules
Pattern
"^[a-f0-9]{64}$"
startedAtstring · date-timerequired

When this check began.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
completedAtstring · date-timerequired

When this check finished.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
statusstringrequired

Whether every step completed.

Validation rules
Allowed values
["completed","failed"]
stepsarrayrequired

Each step's own recorded outcome, in order.

Show attributes

Each step's own recorded outcome, in order.

Validation rules
Maximum items
12
Array items · object

One recipe step's recorded outcome: counts and a closed reason only, never a URL, body, cursor, address or error message.

stepIdstringrequired

The declared recipe step this check reports on.

Validation rules
Pattern
"^[a-z][a-z0-9_-]{0,47}$"
outcomestringrequired

Whether the step completed or failed.

Validation rules
Allowed values
["completed","failed"]
requestCountintegeroptional

How many requests this step made, when it made any.

Validation rules
Minimum
0
Maximum
100000
itemCountintegeroptional

How many items this step processed, when counting applies.

Validation rules
Minimum
0
Maximum
1000000
durationMsintegeroptional

How long this step took, in milliseconds.

Validation rules
Minimum
0
Maximum
600000
reasonstringoptional

Why the step failed, when it did: not_configured the source lacks a needed setting, unavailable the provider did not answer, malformed its answer could not be read, oversized the answer exceeded a bound, stale or future a timestamp was out of range, incomplete part of the answer was missing, invalid the answer failed validation, canceled the check was stopped before finishing.

Validation rules
Allowed values
["not_configured","unavailable","malformed","oversized","stale","future","incomplete","invalid","canceled"]
statestringrequired

This occurrence's delivery state: pending waiting to run, deferred an admission attempt failed and is waiting to retry, accepted handed to a run, rejected the delivery policy refused it outright, or a non-retryable admission failure (or an exhausted retry deadline) stopped it, canceled stopped before running, skipped a previous occurrence was still active, coalesced merged into a newer match.

Validation rules
Allowed values
["pending","deferred","accepted","rejected","canceled","skipped","coalesced"]
reasonstring or nullrequired

Why the occurrence is in this state, when there is one to give.

createdAtstring · date-timerequired

When this occurrence was recorded.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
deliveryDeadlinestring · date-timerequired

The latest this occurrence could still be delivered.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
nextAttemptAtstring · date-timerequired

When the engine will next try to deliver this occurrence.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
lastAttemptAtanyOfrequired

When the engine last tried to deliver this occurrence, when it has tried.

Show attributes

When the engine last tried to deliver this occurrence, when it has tried.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
attemptsintegerrequired

How many delivery attempts this occurrence has had.

Validation rules
Minimum
0
Maximum
9007199254740991
conversationIdanyOfrequired

The conversation this occurrence ran in, once it has one.

Show attributes

The conversation this occurrence ran in, once it has one.

anyOf · 2 variants
Variant 1 · string · uuid

The conversation's id.

Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
Variant 2 · null
runIdanyOfrequired

The run this occurrence produced, once it has one.

Show attributes

The run this occurrence produced, once it has one.

anyOf · 2 variants
Variant 1 · string · uuid
Validation rules
Format
"uuid"
Pattern
"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
Variant 2 · null
runStatusanyOfrequired

That run's status, once it has one: running, paused while an approval waits, then completed, failed or aborted.

Show attributes

That run's status, once it has one: running, paused while an approval waits, then completed, failed or aborted.

anyOf · 2 variants
Variant 1 · string
Validation rules
Allowed values
["running","paused","completed","failed","aborted"]
Variant 2 · null
runErrorstring or nullrequired

Why the run failed, when it did.

pendingApprovalsintegerrequired

How many approvals this occurrence's run is waiting on.

Validation rules
Minimum
0
Maximum
9007199254740991
Variant 2 · null
contractanyOfrequired

The standing financial authority this automation's engine-fired runs execute under; null for an automation without one.

Show attributes

The standing financial authority this automation's engine-fired runs execute under; null for an automation without one.

anyOf · 2 variants
Variant 1 · object
termsoneOfrequired

The approved contract's exact terms.

Show attributes

The approved contract's exact terms.

oneOf · 1 variants
Variant 1 · type: near_intents_transfer
typestringrequired

Which contract template this is.

Validation rules
Exact value
"near_intents_transfer"
actionsarrayrequired

The actions this contract authorizes, executed in order.

Show attributes

The actions this contract authorizes, executed in order.

Validation rules
Minimum items
1
Maximum items
16
Array items · oneOf
oneOf · 3 variants
Variant 1 · kind: swap
kindstringrequired

Exchange one asset for another; custody never leaves the agent wallet.

Validation rules
Exact value
"swap"
inputanyOfrequired

The asset this action spends: pinned to one token, or any token the agent wallet holds.

Show attributes

The asset this action spends: pinned to one token, or any token the agent wallet holds.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
quantityoneOfrequired

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

Show attributes

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

oneOf · 5 variants
Variant 1 · kind: exact_input_tokens

Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw "5000000". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash.

kindstringrequired

Spend an exact amount of the input token.

Validation rules
Exact value
"exact_input_tokens"
amountRawstringrequired

The exact input amount, in the input token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 2 · kind: exact_input_value_usd

Spend a USD-denominated value of the input token: "$5 worth of USDC" means value "5". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity.

kindstringrequired

Spend a USD-denominated value of the input token.

Validation rules
Exact value
"exact_input_value_usd"
valuestringrequired

The USD value to spend, as a decimal string.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$"
Variant 3 · kind: exact_output_tokens

Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash.

kindstringrequired

Receive an exact amount of the output token.

Validation rules
Exact value
"exact_output_tokens"
amountRawstringrequired

The exact output amount, in the output token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 4 · kind: all_of_input
kindstringrequired

Spend everything the agent wallet holds of the input asset.

Validation rules
Exact value
"all_of_input"
Variant 5 · kind: fraction_of_input
kindstringrequired

Spend a fraction of the input asset.

Validation rules
Exact value
"fraction_of_input"
bpsstringrequired

The fraction to spend, in basis points of the input asset.

Validation rules
Pattern
"^(0|[1-9]\\d{0,4})$"
outputanyOfrequired

The asset this action produces: pinned to one token, or left open.

Show attributes

The asset this action produces: pinned to one token, or left open.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
Variant 2 · kind: withdraw_to_owner
kindstringrequired

Return an asset to the account that owns the agent wallet.

Validation rules
Exact value
"withdraw_to_owner"
inputanyOfrequired

The asset this action spends: pinned to one token, or any token the agent wallet holds.

Show attributes

The asset this action spends: pinned to one token, or any token the agent wallet holds.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
quantityoneOfrequired

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

Show attributes

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

oneOf · 5 variants
Variant 1 · kind: exact_input_tokens

Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw "5000000". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash.

kindstringrequired

Spend an exact amount of the input token.

Validation rules
Exact value
"exact_input_tokens"
amountRawstringrequired

The exact input amount, in the input token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 2 · kind: exact_input_value_usd

Spend a USD-denominated value of the input token: "$5 worth of USDC" means value "5". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity.

kindstringrequired

Spend a USD-denominated value of the input token.

Validation rules
Exact value
"exact_input_value_usd"
valuestringrequired

The USD value to spend, as a decimal string.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$"
Variant 3 · kind: exact_output_tokens

Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash.

kindstringrequired

Receive an exact amount of the output token.

Validation rules
Exact value
"exact_output_tokens"
amountRawstringrequired

The exact output amount, in the output token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 4 · kind: all_of_input
kindstringrequired

Spend everything the agent wallet holds of the input asset.

Validation rules
Exact value
"all_of_input"
Variant 5 · kind: fraction_of_input
kindstringrequired

Spend a fraction of the input asset.

Validation rules
Exact value
"fraction_of_input"
bpsstringrequired

The fraction to spend, in basis points of the input asset.

Validation rules
Pattern
"^(0|[1-9]\\d{0,4})$"
outputanyOfrequired

The asset this action produces: pinned to one token, or left open.

Show attributes

The asset this action produces: pinned to one token, or left open.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
Variant 3 · kind: send
kindstringrequired

Pay a pinned destination outside the agent wallet.

Validation rules
Exact value
"send"
inputanyOfrequired

The asset this action spends: pinned to one token, or any token the agent wallet holds.

Show attributes

The asset this action spends: pinned to one token, or any token the agent wallet holds.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
quantityoneOfrequired

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

Show attributes

How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it.

oneOf · 5 variants
Variant 1 · kind: exact_input_tokens

Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw "5000000". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash.

kindstringrequired

Spend an exact amount of the input token.

Validation rules
Exact value
"exact_input_tokens"
amountRawstringrequired

The exact input amount, in the input token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 2 · kind: exact_input_value_usd

Spend a USD-denominated value of the input token: "$5 worth of USDC" means value "5". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity.

kindstringrequired

Spend a USD-denominated value of the input token.

Validation rules
Exact value
"exact_input_value_usd"
valuestringrequired

The USD value to spend, as a decimal string.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$"
Variant 3 · kind: exact_output_tokens

Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash.

kindstringrequired

Receive an exact amount of the output token.

Validation rules
Exact value
"exact_output_tokens"
amountRawstringrequired

The exact output amount, in the output token's smallest unit.

Validation rules
Pattern
"^(0|[1-9]\\d{0,38})$"
Variant 4 · kind: all_of_input
kindstringrequired

Spend everything the agent wallet holds of the input asset.

Validation rules
Exact value
"all_of_input"
Variant 5 · kind: fraction_of_input
kindstringrequired

Spend a fraction of the input asset.

Validation rules
Exact value
"fraction_of_input"
bpsstringrequired

The fraction to spend, in basis points of the input asset.

Validation rules
Pattern
"^(0|[1-9]\\d{0,4})$"
outputanyOfrequired

The asset this action produces: pinned to one token, or left open.

Show attributes

The asset this action produces: pinned to one token, or left open.

anyOf · 2 variants
Variant 1 · object
pinnedobjectrequired

The exact token this asset is pinned to.

Show attributes

The exact token this asset is pinned to.

tokenIdstringrequired

The token's NEP-141 identifier.

Validation rules
Pattern
"^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$"
decimalsintegerrequired

How many decimal places the token's smallest unit represents.

Validation rules
Minimum
0
Maximum
38
Variant 2 · object
anybooleanrequired

Any token the agent wallet holds; the executor picks one at execution.

Validation rules
Exact value
true
recipientobjectrequired

The pinned destination this action pays.

Show attributes

The pinned destination this action pays.

chainstringrequired

Which chain the destination address is on.

Validation rules
Minimum length
1
Maximum length
32
addressstringrequired

The destination address on that chain.

Validation rules
Pattern
"^[\\x21-\\x7e]{1,128}$"
validUntilstring · date-timerequired

When this contract's authority expires.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
maxExecutionsintegerrequired

How many times this contract may be executed before it is exhausted.

Validation rules
Minimum
1
Maximum
10000
boundsobjectrequired

The value-loss and signature-lifetime limits every execution must respect.

Show attributes

The value-loss and signature-lifetime limits every execution must respect.

maxValueLossBpsstringrequired

The most value an execution may give up to price movement and fees together, in basis points.

Validation rules
Pattern
"^(0|[1-9]\\d{0,4})$"
maxSignatureLifetimeSecondsintegerrequired

Explicit maximum lifetime of each released transfer signature, in seconds. 1Click confidential swaps require up to 259500 seconds (72 hours 5 minutes). This does not extend the short execution window or approval validity.

Validation rules
Minimum
1
Maximum
259500
accountIdstringrequired

The intents account this contract authorizes.

Validation rules
Minimum length
1
approvedAtstring · date-timerequired

When the owner approved this contract.

Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
revokedAtanyOfrequired

When this contract was withdrawn, when it has been.

Show attributes

When this contract was withdrawn, when it has been.

anyOf · 2 variants
Variant 1 · string · date-time
Validation rules
Format
"date-time"
Pattern
"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
Variant 2 · null
executionsUsedintegerrequired

Plans that consumed allowance, from the plan and leg ledger.

Validation rules
Minimum
0
Maximum
9007199254740991
Variant 2 · null
400 The request could not be read as this operation expects.

The request could not be read as this operation expects.

  • invalid_input — the body or query failed validation; issues names each field
  • invalid_cursor — the cursor is not one this list minted

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

401 A credential is missing, invalid or expired.

A credential is missing, invalid or expired.

  • partner_key_required — no X-Api-Key header was sent
  • partner_key_invalid — the X-Api-Key is unknown or revoked
  • credential_expired — the user token has expired; obtain a fresh one

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

403 The credentials are valid but may not do this.

The credentials are valid but may not do this.

  • subject_mismatch — the {userId} in the path is not the token's user
  • account_disabled — an operator disabled the account
  • origin_rejected — a browser Origin other than the configured web origin

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

404 The resource is missing, belongs to someone else, or its id is malformed: all three answer alike.

The resource is missing, belongs to someone else, or its id is malformed: all three answer alike.

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

409 The operation lost to the current state.

The operation lost to the current state.

  • automation_held — an operator holds the automation; it fires again when released
  • automation_invalid — the automation's definition cannot run as written
  • automation_changed — the revision sent is stale; reload the automation

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

412 The identity is verified but has no account yet.

The identity is verified but has no account yet.

  • account_not_provisioned — the identity is verified but has no account yet; call users.ensure first

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

413 The body exceeds the size this deployment accepts.

The body exceeds the size this deployment accepts.

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

429 A limiter refused the request; honour `Retry-After`.

A limiter refused the request; honour Retry-After.

  • rate_limited — the per-key or per-user limit is spent; honour Retry-After

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

500 A fault on our side; quote `requestId` when reporting it.

A fault on our side; quote requestId when reporting it.

  • internal — a fault on our side; quote requestId when reporting it

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

503 The replica is draining or a dependency did not answer; `retryable` says whether to try again.

The replica is draining or a dependency did not answer; retryable says whether to try again.

  • internal — a fault on our side; quote requestId when reporting it

application/problem+json · object

RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack.

typestringrequired

The kind of problem as a URN, urn:fin:error:<kind>; stable, compare against it

titlestringrequired

The kind's human title, for logs; never parse it

statusintegerrequired

The HTTP status, repeated in the body

Validation rules
Minimum
400
Maximum
599
reasonstringoptional

The machine-readable why. One of:

  • run_active (409) — a run already holds this conversation
  • budget_exhausted (409) — the user's spend headroom is gone, or an operator froze it
  • approval_not_pending (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation
  • execution_capacity (409) — no execution capacity is free right now; retryable says whether to try again
  • execution_unavailable (409) — the execution engine could not take the work
  • stop_pending (409) — a stop is already in progress and its cleanup is not yet confirmed
  • automation_changed (409) — the revision sent is stale; reload the automation
  • automation_held (409) — an operator holds the automation; it fires again when released
  • automation_invalid (409) — the automation's definition cannot run as written
  • automation_completed (409) — the automation has finished for good and cannot fire again
  • automation_limit (409) — the user already has as many automations as the deployment allows
  • profile_unknown_tool (409) — the run profile names a tool this deployment does not have
  • deployment_paused (409) — an operator paused a deployment control; nothing was admitted or fired
  • run_not_active (409) — the run named in the path is not the conversation's live run
  • withdrawal_changed (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress
  • credential_expired (401) — the user token has expired; obtain a fresh one
  • account_disabled (403) — an operator disabled the account
  • account_not_provisioned (412) — the identity is verified but has no account yet; call users.ensure first
  • provider_unavailable (503) — an external provider the call depends on did not answer
  • engine_unavailable (503) — the execution engine did not answer
  • invalid_input (400) — the body or query failed validation; issues names each field
  • internal (500) — a fault on our side; quote requestId when reporting it
  • partner_key_required (401) — no X-Api-Key header was sent
  • partner_key_invalid (401) — the X-Api-Key is unknown or revoked
  • subject_mismatch (403) — the {userId} in the path is not the token's user
  • origin_rejected (403) — a browser Origin other than the configured web origin
  • permission_required (403) — the operator credential lacks the scope this call needs
  • rate_limited (429) — the per-key or per-user limit is spent; honour Retry-After
  • stream_capacity (429) — no stream socket is free on this replica or for this user; honour Retry-After
  • invalid_cursor (400) — the cursor is not one this list minted
Validation rules
Allowed values
["run_active","budget_exhausted","approval_not_pending","execution_capacity","execution_unavailable","stop_pending","automation_changed","automation_held","automation_invalid","automation_completed","automation_limit","profile_unknown_tool","deployment_paused","run_not_active","withdrawal_changed","credential_expired","account_disabled","account_not_provisioned","provider_unavailable","engine_unavailable","invalid_input","internal","partner_key_required","partner_key_invalid","subject_mismatch","origin_rejected","permission_required","rate_limited","stream_capacity","invalid_cursor"]
requestIdstringrequired

The id Fin used for this request; quote it when reporting a problem

retryablebooleanrequired

Whether repeating the same request later can succeed without changing it

detailstringoptional

Only on invalid_input: which part of the request failed validation

issuesarrayoptional

Only on invalid_input: one entry per failing field

Show attributes

Only on invalid_input: one entry per failing field

Array items · object
pathstringrequired

The JSON pointer of the failing field; empty for the root object

messagestringrequired

Why the field failed

Complete OpenAPI definition

The exact operation and all referenced components, including recursive schemas.

{
  "operation": {
    "operationId": "automations.enable",
    "summary": "Resume firing",
    "tags": [
      "automations"
    ],
    "description": "Resumes a paused automation: its clock and readers restart, and its sources are re-planned before firing resumes. Refused if an operator holds the automation, if its rule no longer compiles or plans cleanly, or if the automation carries a contract — once withdrawn, a contract's standing authority cannot be re-approved by resuming; create a new automation instead.",
    "parameters": [
      {
        "schema": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "in": "path",
        "name": "userId",
        "required": true,
        "description": "The user in the path; must equal the token's own account."
      },
      {
        "schema": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "in": "path",
        "name": "automationId",
        "required": true,
        "description": "The automation's id."
      }
    ],
    "security": [
      {
        "apiKey": [],
        "userToken": []
      }
    ],
    "responses": {
      "200": {
        "description": "The automation, updated.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Automation"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/InvalidInput"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "description": "The operation lost to the current state.\n\n- `automation_held` — an operator holds the automation; it fires again when released\n- `automation_invalid` — the automation's definition cannot run as written\n- `automation_changed` — the `revision` sent is stale; reload the automation",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "412": {
        "$ref": "#/components/responses/AccountNotProvisioned"
      },
      "413": {
        "$ref": "#/components/responses/PayloadTooLarge"
      },
      "429": {
        "$ref": "#/components/responses/TooManyRequests"
      },
      "500": {
        "$ref": "#/components/responses/Internal"
      },
      "503": {
        "$ref": "#/components/responses/Unavailable"
      }
    }
  },
  "components": {
    "schemas": {
      "Automation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The automation's id."
          },
          "name": {
            "type": "string",
            "description": "The automation's name."
          },
          "prompt": {
            "type": "string",
            "description": "The instructions given to the model each time this automation fires."
          },
          "rule": {
            "$ref": "#/components/schemas/AutomationRule"
          },
          "sourcePlans": {
            "maxItems": 4,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "binding": {
                  "type": "string",
                  "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                  "description": "The binding name a rule or a plan gives one configured source."
                },
                "result": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "const": "ready",
                          "description": "The binding is fully planned and ready to collect."
                        },
                        "plan": {
                          "type": "object",
                          "properties": {
                            "operationId": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_.-]{0,79}$",
                              "description": "The collection operation this plan uses."
                            },
                            "operationVersion": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991,
                              "description": "The collection operation's version."
                            },
                            "descriptorFingerprint": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$",
                              "description": "A content hash of the source descriptor this plan was built from."
                            },
                            "config": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "$ref": "#/components/schemas/AutomationJsonValue"
                              },
                              "description": "Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries."
                            },
                            "requirement": {
                              "type": "object",
                              "properties": {
                                "maxLatencySeconds": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 2147483
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline."
                                },
                                "maxAgeSeconds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 86400,
                                  "description": "Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window."
                                },
                                "allowDegradedLatency": {
                                  "type": "boolean",
                                  "description": "Whether delivery slower than the target delay is still accepted."
                                },
                                "maxAcceptedLatencySeconds": {
                                  "description": "The slowest delivery still accepted, in seconds, when `allowDegradedLatency` is set.",
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2147483
                                }
                              },
                              "required": [
                                "maxLatencySeconds",
                                "maxAgeSeconds",
                                "allowDegradedLatency"
                              ],
                              "description": "What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable."
                            },
                            "guarantees": {
                              "type": "object",
                              "properties": {
                                "minCadenceSeconds": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483,
                                  "description": "The shortest interval between requests the provider permits, in seconds."
                                },
                                "expectedLatencySeconds": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 2147483
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here."
                                },
                                "maxAgeSeconds": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483,
                                  "description": "Maximum snapshot observation age accepted at collection. This acquisition guarantee does not shorten a reader's separately declared evaluation-age window."
                                },
                                "requestsPerMinute": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "exclusiveMinimum": 0,
                                      "maximum": 9007199254740991
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "The provider's own rate limit for this source, when it publishes one."
                                },
                                "observationReuseSeconds": {
                                  "description": "How long one provider observation may serve every reader watching the same subject under the same connection, in seconds. Absent or 0 means each reader causes its own request. A reused observation keeps the provider's own `sourceTime`, so declared freshness still governs; what reuse changes is how often the provider is asked, not how old an accepted observation may be. Keep it at or below the cadence readers are expected to poll at.",
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483
                                },
                                "batchLimit": {
                                  "description": "How many distinct subjects the provider can serve in one request. Absent or 1 means no batching. Only providers implementing `readBatch` may declare more: the framework cannot infer that an API accepts several subjects.",
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 1000
                                }
                              },
                              "required": [
                                "minCadenceSeconds",
                                "expectedLatencySeconds",
                                "maxAgeSeconds",
                                "requestsPerMinute"
                              ],
                              "description": "What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen."
                            },
                            "scopeKind": {
                              "type": "string",
                              "enum": [
                                "public",
                                "user"
                              ],
                              "description": "Who this binding is scoped to: `public` data anyone can read, `user` data read under the owner's own connection."
                            },
                            "explanation": {
                              "type": "string",
                              "maxLength": 2048,
                              "description": "Why this plan was chosen, in the reviewer's own words."
                            },
                            "recipe": {
                              "type": "object",
                              "properties": {
                                "version": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991,
                                  "description": "The recipe description's own version, bumped when its steps change."
                                },
                                "title": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 120,
                                  "description": "The recipe's short label, for the reviewed catalog."
                                },
                                "summary": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 600,
                                  "description": "What the recipe does, for the reviewed catalog."
                                },
                                "steps": {
                                  "minItems": 1,
                                  "maxItems": 12,
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                                        "description": "The step's identifier, unique within its recipe."
                                      },
                                      "kind": {
                                        "type": "string",
                                        "enum": [
                                          "request",
                                          "validate",
                                          "calculate"
                                        ],
                                        "description": "What this step does: `request` calls the provider, `validate` checks what it returned, `calculate` derives a value from earlier steps."
                                      },
                                      "title": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 120,
                                        "description": "The step's short label, for the reviewed catalog."
                                      },
                                      "description": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 600,
                                        "description": "What this step does, for the reviewed catalog."
                                      },
                                      "api": {
                                        "type": "object",
                                        "properties": {
                                          "method": {
                                            "type": "string",
                                            "enum": [
                                              "GET",
                                              "POST",
                                              "GRAPHQL"
                                            ],
                                            "description": "The request's method or protocol."
                                          },
                                          "resource": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 160,
                                            "pattern": "^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$",
                                            "description": "The request's path or resource name."
                                          }
                                        },
                                        "required": [
                                          "method",
                                          "resource"
                                        ],
                                        "description": "The request this step makes, when it calls the provider."
                                      }
                                    },
                                    "required": [
                                      "id",
                                      "kind",
                                      "title",
                                      "description"
                                    ]
                                  },
                                  "description": "The recipe's steps, in order."
                                },
                                "limitations": {
                                  "maxItems": 6,
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 600
                                  },
                                  "description": "What the recipe does not cover, in the reviewer's own words."
                                },
                                "fingerprint": {
                                  "type": "string",
                                  "pattern": "^[a-f0-9]{64}$",
                                  "description": "A content hash identifying this exact recipe, independent of execution or connection identity."
                                }
                              },
                              "required": [
                                "version",
                                "title",
                                "summary",
                                "steps",
                                "limitations",
                                "fingerprint"
                              ],
                              "description": "A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint."
                            },
                            "degraded": {
                              "type": "boolean",
                              "description": "Whether this plan settled for weaker guarantees than the rule asked for."
                            }
                          },
                          "required": [
                            "operationId",
                            "operationVersion",
                            "descriptorFingerprint",
                            "config",
                            "requirement",
                            "guarantees",
                            "scopeKind",
                            "explanation",
                            "degraded"
                          ],
                          "description": "How one binding will actually be collected: the operation, its guarantees and its configuration."
                        }
                      },
                      "required": [
                        "status",
                        "plan"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "const": "needs_connection",
                          "description": "The binding is plannable but needs a connection the owner has not granted yet."
                        },
                        "candidatePlan": {
                          "type": "object",
                          "properties": {
                            "operationId": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_.-]{0,79}$",
                              "description": "The collection operation this plan uses."
                            },
                            "operationVersion": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991,
                              "description": "The collection operation's version."
                            },
                            "descriptorFingerprint": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$",
                              "description": "A content hash of the source descriptor this plan was built from."
                            },
                            "config": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "$ref": "#/components/schemas/AutomationJsonValue"
                              },
                              "description": "Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries."
                            },
                            "requirement": {
                              "type": "object",
                              "properties": {
                                "maxLatencySeconds": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 2147483
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline."
                                },
                                "maxAgeSeconds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 86400,
                                  "description": "Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window."
                                },
                                "allowDegradedLatency": {
                                  "type": "boolean",
                                  "description": "Whether delivery slower than the target delay is still accepted."
                                },
                                "maxAcceptedLatencySeconds": {
                                  "description": "The slowest delivery still accepted, in seconds, when `allowDegradedLatency` is set.",
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2147483
                                }
                              },
                              "required": [
                                "maxLatencySeconds",
                                "maxAgeSeconds",
                                "allowDegradedLatency"
                              ],
                              "description": "What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable."
                            },
                            "guarantees": {
                              "type": "object",
                              "properties": {
                                "minCadenceSeconds": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483,
                                  "description": "The shortest interval between requests the provider permits, in seconds."
                                },
                                "expectedLatencySeconds": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 2147483
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "How stale the provider's own value may be when it answers, in seconds; null when the provider establishes no bound. A reader with a delivery deadline cannot use a source that promises nothing here."
                                },
                                "maxAgeSeconds": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483,
                                  "description": "Maximum snapshot observation age accepted at collection. This acquisition guarantee does not shorten a reader's separately declared evaluation-age window."
                                },
                                "requestsPerMinute": {
                                  "anyOf": [
                                    {
                                      "type": "integer",
                                      "exclusiveMinimum": 0,
                                      "maximum": 9007199254740991
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ],
                                  "description": "The provider's own rate limit for this source, when it publishes one."
                                },
                                "observationReuseSeconds": {
                                  "description": "How long one provider observation may serve every reader watching the same subject under the same connection, in seconds. Absent or 0 means each reader causes its own request. A reused observation keeps the provider's own `sourceTime`, so declared freshness still governs; what reuse changes is how often the provider is asked, not how old an accepted observation may be. Keep it at or below the cadence readers are expected to poll at.",
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 2147483
                                },
                                "batchLimit": {
                                  "description": "How many distinct subjects the provider can serve in one request. Absent or 1 means no batching. Only providers implementing `readBatch` may declare more: the framework cannot infer that an API accepts several subjects.",
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 1000
                                }
                              },
                              "required": [
                                "minCadenceSeconds",
                                "expectedLatencySeconds",
                                "maxAgeSeconds",
                                "requestsPerMinute"
                              ],
                              "description": "What an operation promises about the snapshots it serves: cadence, freshness and how many subjects it can batch. Describes sampled state; nothing here promises that a change between two polls was seen."
                            },
                            "scopeKind": {
                              "type": "string",
                              "enum": [
                                "public",
                                "user"
                              ],
                              "description": "Who this binding is scoped to: `public` data anyone can read, `user` data read under the owner's own connection."
                            },
                            "explanation": {
                              "type": "string",
                              "maxLength": 2048,
                              "description": "Why this plan was chosen, in the reviewer's own words."
                            },
                            "recipe": {
                              "type": "object",
                              "properties": {
                                "version": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "maximum": 9007199254740991,
                                  "description": "The recipe description's own version, bumped when its steps change."
                                },
                                "title": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 120,
                                  "description": "The recipe's short label, for the reviewed catalog."
                                },
                                "summary": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 600,
                                  "description": "What the recipe does, for the reviewed catalog."
                                },
                                "steps": {
                                  "minItems": 1,
                                  "maxItems": 12,
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                                        "description": "The step's identifier, unique within its recipe."
                                      },
                                      "kind": {
                                        "type": "string",
                                        "enum": [
                                          "request",
                                          "validate",
                                          "calculate"
                                        ],
                                        "description": "What this step does: `request` calls the provider, `validate` checks what it returned, `calculate` derives a value from earlier steps."
                                      },
                                      "title": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 120,
                                        "description": "The step's short label, for the reviewed catalog."
                                      },
                                      "description": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 600,
                                        "description": "What this step does, for the reviewed catalog."
                                      },
                                      "api": {
                                        "type": "object",
                                        "properties": {
                                          "method": {
                                            "type": "string",
                                            "enum": [
                                              "GET",
                                              "POST",
                                              "GRAPHQL"
                                            ],
                                            "description": "The request's method or protocol."
                                          },
                                          "resource": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 160,
                                            "pattern": "^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$",
                                            "description": "The request's path or resource name."
                                          }
                                        },
                                        "required": [
                                          "method",
                                          "resource"
                                        ],
                                        "description": "The request this step makes, when it calls the provider."
                                      }
                                    },
                                    "required": [
                                      "id",
                                      "kind",
                                      "title",
                                      "description"
                                    ]
                                  },
                                  "description": "The recipe's steps, in order."
                                },
                                "limitations": {
                                  "maxItems": 6,
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 600
                                  },
                                  "description": "What the recipe does not cover, in the reviewer's own words."
                                },
                                "fingerprint": {
                                  "type": "string",
                                  "pattern": "^[a-f0-9]{64}$",
                                  "description": "A content hash identifying this exact recipe, independent of execution or connection identity."
                                }
                              },
                              "required": [
                                "version",
                                "title",
                                "summary",
                                "steps",
                                "limitations",
                                "fingerprint"
                              ],
                              "description": "A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint."
                            },
                            "degraded": {
                              "type": "boolean",
                              "description": "Whether this plan settled for weaker guarantees than the rule asked for."
                            }
                          },
                          "required": [
                            "operationId",
                            "operationVersion",
                            "descriptorFingerprint",
                            "config",
                            "requirement",
                            "guarantees",
                            "scopeKind",
                            "explanation",
                            "degraded"
                          ],
                          "description": "The plan that would apply once the missing connection is granted."
                        },
                        "reasons": {
                          "minItems": 1,
                          "maxItems": 32,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 80,
                                "description": "A machine-readable reason code."
                              },
                              "path": {
                                "description": "The field this reason is about, when it is about one.",
                                "type": "string",
                                "maxLength": 256
                              },
                              "message": {
                                "type": "string",
                                "maxLength": 2048,
                                "description": "The reason, in the reviewer's own words."
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ]
                          },
                          "description": "Why this binding could not be planned as asked."
                        }
                      },
                      "required": [
                        "status",
                        "candidatePlan",
                        "reasons"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "const": "unsupported",
                          "description": "The binding cannot be planned at all, as asked."
                        },
                        "reasons": {
                          "minItems": 1,
                          "maxItems": 32,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 80,
                                "description": "A machine-readable reason code."
                              },
                              "path": {
                                "description": "The field this reason is about, when it is about one.",
                                "type": "string",
                                "maxLength": 256
                              },
                              "message": {
                                "type": "string",
                                "maxLength": 2048,
                                "description": "The reason, in the reviewer's own words."
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ]
                          },
                          "description": "Why this binding could not be planned as asked."
                        }
                      },
                      "required": [
                        "status",
                        "reasons"
                      ]
                    }
                  ],
                  "description": "Whether this binding is ready, needs a connection, or is unsupported, and why."
                }
              },
              "required": [
                "binding",
                "result"
              ]
            },
            "description": "How each of the rule's bindings will actually be collected."
          },
          "revision": {
            "type": "string",
            "pattern": "^[1-9]\\d*\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "description": "The automation's concurrency token, `<definitionVersion>.<activationEpoch>`, unique to one exact version. Writes must echo the value just read back unchanged; a stale one is refused as `automation_changed`."
          },
          "enabled": {
            "type": "boolean",
            "description": "Whether this automation is currently firing."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
            "description": "When this automation was created."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
            "description": "When this automation was last changed."
          },
          "archivedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this automation was archived, when it has been."
          },
          "hold": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "at": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                    "description": "When the hold began."
                  },
                  "reason": {
                    "description": "Why an operator placed the hold, when they gave one.",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "at",
                  "reason"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "An operator's hold: why future work is stopped, so the owner does not read it as their own doing."
          },
          "nextFireAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this automation's clock will next wake it, when it has a schedule and is enabled."
          },
          "monitoring": {
            "$ref": "#/components/schemas/AutomationMonitoring"
          },
          "activeOccurrence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AutomationOccurrence"
              },
              {
                "type": "null"
              }
            ],
            "description": "The occurrence currently running, when one is."
          },
          "latestOccurrence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AutomationOccurrence"
              },
              {
                "type": "null"
              }
            ],
            "description": "The most recent occurrence, running or not, when there has been one."
          },
          "contract": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "terms": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "near_intents_transfer",
                            "description": "Which contract template this is."
                          },
                          "actions": {
                            "minItems": 1,
                            "maxItems": 16,
                            "type": "array",
                            "items": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "kind": {
                                      "type": "string",
                                      "const": "swap",
                                      "description": "Exchange one asset for another; custody never leaves the agent wallet."
                                    },
                                    "input": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action spends: pinned to one token, or any token the agent wallet holds."
                                    },
                                    "quantity": {
                                      "oneOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_tokens",
                                              "description": "Spend an exact amount of the input token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact input amount, in the input token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw \"5000000\". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_value_usd",
                                              "description": "Spend a USD-denominated value of the input token."
                                            },
                                            "value": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$",
                                              "description": "The USD value to spend, as a decimal string."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "value"
                                          ],
                                          "description": "Spend a USD-denominated value of the input token: \"$5 worth of USDC\" means value \"5\". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_output_tokens",
                                              "description": "Receive an exact amount of the output token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact output amount, in the output token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "all_of_input",
                                              "description": "Spend everything the agent wallet holds of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "fraction_of_input",
                                              "description": "Spend a fraction of the input asset."
                                            },
                                            "bps": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,4})$",
                                              "description": "The fraction to spend, in basis points of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "bps"
                                          ]
                                        }
                                      ],
                                      "description": "How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it."
                                    },
                                    "output": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action produces: pinned to one token, or left open."
                                    }
                                  },
                                  "required": [
                                    "kind",
                                    "input",
                                    "quantity",
                                    "output"
                                  ]
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "kind": {
                                      "type": "string",
                                      "const": "withdraw_to_owner",
                                      "description": "Return an asset to the account that owns the agent wallet."
                                    },
                                    "input": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action spends: pinned to one token, or any token the agent wallet holds."
                                    },
                                    "quantity": {
                                      "oneOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_tokens",
                                              "description": "Spend an exact amount of the input token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact input amount, in the input token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw \"5000000\". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_value_usd",
                                              "description": "Spend a USD-denominated value of the input token."
                                            },
                                            "value": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$",
                                              "description": "The USD value to spend, as a decimal string."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "value"
                                          ],
                                          "description": "Spend a USD-denominated value of the input token: \"$5 worth of USDC\" means value \"5\". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_output_tokens",
                                              "description": "Receive an exact amount of the output token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact output amount, in the output token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "all_of_input",
                                              "description": "Spend everything the agent wallet holds of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "fraction_of_input",
                                              "description": "Spend a fraction of the input asset."
                                            },
                                            "bps": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,4})$",
                                              "description": "The fraction to spend, in basis points of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "bps"
                                          ]
                                        }
                                      ],
                                      "description": "How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it."
                                    },
                                    "output": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action produces: pinned to one token, or left open."
                                    }
                                  },
                                  "required": [
                                    "kind",
                                    "input",
                                    "quantity",
                                    "output"
                                  ]
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "kind": {
                                      "type": "string",
                                      "const": "send",
                                      "description": "Pay a pinned destination outside the agent wallet."
                                    },
                                    "input": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action spends: pinned to one token, or any token the agent wallet holds."
                                    },
                                    "quantity": {
                                      "oneOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_tokens",
                                              "description": "Spend an exact amount of the input token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact input amount, in the input token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Spend an exact quantity of the input token, not its USD value. Exactly 5 USDC with verified input decimals 6 means amountRaw \"5000000\". Scale the requested decimal digits using the verified input decimals; reject excess fractional digits. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_input_value_usd",
                                              "description": "Spend a USD-denominated value of the input token."
                                            },
                                            "value": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})(?:\\.\\d{1,18})?$",
                                              "description": "The USD value to spend, as a decimal string."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "value"
                                          ],
                                          "description": "Spend a USD-denominated value of the input token: \"$5 worth of USDC\" means value \"5\". The host calculates token units from live prices. This does not mean exactly 5 USDC; never substitute it for a token-denominated quantity."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "exact_output_tokens",
                                              "description": "Receive an exact amount of the output token."
                                            },
                                            "amountRaw": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,38})$",
                                              "description": "The exact output amount, in the output token's smallest unit."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "amountRaw"
                                          ],
                                          "description": "Receive an exact quantity of the output token. Scale the requested decimal digits using the verified output decimals to obtain amountRaw; reject excess fractional digits. The host calculates the required input. No floating-point arithmetic or bash."
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "all_of_input",
                                              "description": "Spend everything the agent wallet holds of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "kind": {
                                              "type": "string",
                                              "const": "fraction_of_input",
                                              "description": "Spend a fraction of the input asset."
                                            },
                                            "bps": {
                                              "type": "string",
                                              "pattern": "^(0|[1-9]\\d{0,4})$",
                                              "description": "The fraction to spend, in basis points of the input asset."
                                            }
                                          },
                                          "required": [
                                            "kind",
                                            "bps"
                                          ]
                                        }
                                      ],
                                      "description": "How much moves: an exact token amount, an exact USD value, an exact output amount, all of the input, or a fraction of it."
                                    },
                                    "output": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "pinned": {
                                              "type": "object",
                                              "properties": {
                                                "tokenId": {
                                                  "type": "string",
                                                  "pattern": "^nep141:[a-z0-9]+(?:[._-][a-z0-9]+)*$",
                                                  "description": "The token's NEP-141 identifier."
                                                },
                                                "decimals": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 38,
                                                  "description": "How many decimal places the token's smallest unit represents."
                                                }
                                              },
                                              "required": [
                                                "tokenId",
                                                "decimals"
                                              ],
                                              "description": "The exact token this asset is pinned to."
                                            }
                                          },
                                          "required": [
                                            "pinned"
                                          ]
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "any": {
                                              "type": "boolean",
                                              "const": true,
                                              "description": "Any token the agent wallet holds; the executor picks one at execution."
                                            }
                                          },
                                          "required": [
                                            "any"
                                          ]
                                        }
                                      ],
                                      "description": "The asset this action produces: pinned to one token, or left open."
                                    },
                                    "recipient": {
                                      "type": "object",
                                      "properties": {
                                        "chain": {
                                          "type": "string",
                                          "minLength": 1,
                                          "maxLength": 32,
                                          "description": "Which chain the destination address is on."
                                        },
                                        "address": {
                                          "type": "string",
                                          "pattern": "^[\\x21-\\x7e]{1,128}$",
                                          "description": "The destination address on that chain."
                                        }
                                      },
                                      "required": [
                                        "chain",
                                        "address"
                                      ],
                                      "description": "The pinned destination this action pays."
                                    }
                                  },
                                  "required": [
                                    "kind",
                                    "input",
                                    "quantity",
                                    "output",
                                    "recipient"
                                  ]
                                }
                              ]
                            },
                            "description": "The actions this contract authorizes, executed in order."
                          },
                          "validUntil": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                            "description": "When this contract's authority expires."
                          },
                          "maxExecutions": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 10000,
                            "description": "How many times this contract may be executed before it is exhausted."
                          },
                          "bounds": {
                            "type": "object",
                            "properties": {
                              "maxValueLossBps": {
                                "type": "string",
                                "pattern": "^(0|[1-9]\\d{0,4})$",
                                "description": "The most value an execution may give up to price movement and fees together, in basis points."
                              },
                              "maxSignatureLifetimeSeconds": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 259500,
                                "description": "Explicit maximum lifetime of each released transfer signature, in seconds. 1Click confidential swaps require up to 259500 seconds (72 hours 5 minutes). This does not extend the short execution window or approval validity."
                              }
                            },
                            "required": [
                              "maxValueLossBps",
                              "maxSignatureLifetimeSeconds"
                            ],
                            "description": "The value-loss and signature-lifetime limits every execution must respect."
                          }
                        },
                        "required": [
                          "type",
                          "actions",
                          "validUntil",
                          "maxExecutions",
                          "bounds"
                        ]
                      }
                    ],
                    "description": "The approved contract's exact terms."
                  },
                  "accountId": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The intents account this contract authorizes."
                  },
                  "approvedAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                    "description": "When the owner approved this contract."
                  },
                  "revokedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "When this contract was withdrawn, when it has been."
                  },
                  "executionsUsed": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991,
                    "description": "Plans that consumed allowance, from the plan and leg ledger."
                  }
                },
                "required": [
                  "terms",
                  "accountId",
                  "approvedAt",
                  "revokedAt",
                  "executionsUsed"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "The standing financial authority this automation's engine-fired runs execute under; null for an automation without one."
          }
        },
        "required": [
          "id",
          "name",
          "prompt",
          "rule",
          "sourcePlans",
          "revision",
          "enabled",
          "createdAt",
          "updatedAt",
          "archivedAt",
          "hold",
          "nextFireAt",
          "monitoring",
          "activeOccurrence",
          "latestOccurrence",
          "contract"
        ],
        "description": "One automation: its rule, its current sources, its monitoring health, and the occurrences it has fired."
      },
      "AutomationRule": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "number",
            "const": 1,
            "description": "The rule schema's version; always `1`."
          },
          "delivery": {
            "default": {
              "overlap": "queue",
              "maxPendingOccurrences": 100
            },
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "overlap": {
                    "type": "string",
                    "const": "queue",
                    "description": "Queue a new occurrence and run it once the active one finishes."
                  },
                  "maxPendingOccurrences": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100,
                    "description": "How many occurrences may wait in the queue, not counting the one currently active, including one whose run is itself waiting on an approval."
                  }
                },
                "required": [
                  "overlap",
                  "maxPendingOccurrences"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "overlap": {
                    "type": "string",
                    "const": "coalesce",
                    "description": "Close the occurrence already pending as `coalesced` and record the new match as a fresh occurrence, rather than queuing a second."
                  }
                },
                "required": [
                  "overlap"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "overlap": {
                    "type": "string",
                    "const": "skip",
                    "description": "Drop a new match while an occurrence is already active."
                  }
                },
                "required": [
                  "overlap"
                ]
              }
            ],
            "description": "What happens when a new occurrence is ready before the previous one has finished."
          },
          "maxDeliveryLatenessSeconds": {
            "default": 86400,
            "description": "How long a new occurrence may wait to be delivered before its deadline passes and it is refused, in seconds.",
            "type": "integer",
            "minimum": 1,
            "maximum": 86400
          },
          "maxEvaluationGapSeconds": {
            "default": 600,
            "description": "The longest gap allowed between evaluations before `firing.mode: rising_edge` treats its history as broken and waits for a fresh baseline, in seconds.",
            "type": "integer",
            "minimum": 1,
            "maximum": 2678400
          },
          "wakes": {
            "minItems": 1,
            "maxItems": 7,
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "at",
                      "description": "A one-time wake at an exact moment; exhausted after that check, even if its condition is false."
                    },
                    "runAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "description": "The exact moment this wake fires, as an ISO 8601 timestamp with an offset."
                    },
                    "misfire": {
                      "default": {
                        "mode": "latest",
                        "maxLatenessSeconds": null
                      },
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "skip",
                              "description": "Drop a wake the engine could not evaluate in time; wait for the next one."
                            },
                            "graceSeconds": {
                              "default": 5,
                              "description": "How late this wake may still run before it counts as missed, in seconds.",
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 60
                            }
                          },
                          "required": [
                            "mode",
                            "graceSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "latest",
                              "description": "Run once for the most recently missed wake, dropping any earlier ones."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "all",
                              "description": "Run once for every missed wake, oldest first."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        }
                      ],
                      "description": "What happens when the engine could not evaluate this wake on time."
                    },
                    "evaluationTime": {
                      "default": "detection_time",
                      "description": "Which moment this wake is evaluated as of: `scheduled_time` the time it was due, `detection_time` when the engine actually ran it.",
                      "type": "string",
                      "enum": [
                        "scheduled_time",
                        "detection_time"
                      ]
                    }
                  },
                  "required": [
                    "kind",
                    "runAt",
                    "misfire",
                    "evaluationTime"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "interval",
                      "description": "A wake that repeats on a fixed elapsed interval."
                    },
                    "intervalMinutes": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 44640,
                      "description": "How often this wake repeats, in minutes."
                    },
                    "misfire": {
                      "default": {
                        "mode": "latest",
                        "maxLatenessSeconds": null
                      },
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "skip",
                              "description": "Drop a wake the engine could not evaluate in time; wait for the next one."
                            },
                            "graceSeconds": {
                              "default": 5,
                              "description": "How late this wake may still run before it counts as missed, in seconds.",
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 60
                            }
                          },
                          "required": [
                            "mode",
                            "graceSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "latest",
                              "description": "Run once for the most recently missed wake, dropping any earlier ones."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "all",
                              "description": "Run once for every missed wake, oldest first."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        }
                      ],
                      "description": "What happens when the engine could not evaluate this wake on time."
                    },
                    "evaluationTime": {
                      "default": "detection_time",
                      "description": "Which moment this wake is evaluated as of: `scheduled_time` the time it was due, `detection_time` when the engine actually ran it.",
                      "type": "string",
                      "enum": [
                        "scheduled_time",
                        "detection_time"
                      ]
                    }
                  },
                  "required": [
                    "kind",
                    "intervalMinutes",
                    "misfire",
                    "evaluationTime"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "calendar",
                      "description": "A wake on a recurring calendar schedule: local times, weekdays, months and days of the month."
                    },
                    "timeZone": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80,
                      "description": "The IANA time zone a calendar wake's local times are interpreted in."
                    },
                    "localTimes": {
                      "minItems": 1,
                      "maxItems": 24,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
                      },
                      "description": "The times of day this wake fires, each in 24-hour `HH:MM` form, in `timeZone`."
                    },
                    "weekdays": {
                      "default": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7
                      ],
                      "description": "Which ISO weekdays this wake fires on, 1 (Monday) through 7 (Sunday). Defaults to every day.",
                      "minItems": 1,
                      "maxItems": 7,
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 7
                      }
                    },
                    "months": {
                      "default": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        9,
                        10,
                        11,
                        12
                      ],
                      "description": "Which months this wake fires in, 1 (January) through 12 (December). Defaults to every month.",
                      "minItems": 1,
                      "maxItems": 12,
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 12
                      }
                    },
                    "monthDays": {
                      "default": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        9,
                        10,
                        11,
                        12,
                        13,
                        14,
                        15,
                        16,
                        17,
                        18,
                        19,
                        20,
                        21,
                        22,
                        23,
                        24,
                        25,
                        26,
                        27,
                        28,
                        29,
                        30,
                        31
                      ],
                      "description": "Which days of the month this wake fires on, 1 through 31. Defaults to every day.",
                      "minItems": 1,
                      "maxItems": 31,
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 31
                      }
                    },
                    "misfire": {
                      "default": {
                        "mode": "latest",
                        "maxLatenessSeconds": null
                      },
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "skip",
                              "description": "Drop a wake the engine could not evaluate in time; wait for the next one."
                            },
                            "graceSeconds": {
                              "default": 5,
                              "description": "How late this wake may still run before it counts as missed, in seconds.",
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 60
                            }
                          },
                          "required": [
                            "mode",
                            "graceSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "latest",
                              "description": "Run once for the most recently missed wake, dropping any earlier ones."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": "string",
                              "const": "all",
                              "description": "Run once for every missed wake, oldest first."
                            },
                            "maxLatenessSeconds": {
                              "default": null,
                              "description": "How late a missed wake may still run, in seconds; null for no limit.",
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 2678400
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "maxLatenessSeconds"
                          ]
                        }
                      ],
                      "description": "What happens when the engine could not evaluate this wake on time."
                    },
                    "evaluationTime": {
                      "default": "detection_time",
                      "description": "Which moment this wake is evaluated as of: `scheduled_time` the time it was due, `detection_time` when the engine actually ran it.",
                      "type": "string",
                      "enum": [
                        "scheduled_time",
                        "detection_time"
                      ]
                    }
                  },
                  "required": [
                    "kind",
                    "timeZone",
                    "localTimes",
                    "weekdays",
                    "months",
                    "monthDays",
                    "misfire",
                    "evaluationTime"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "event",
                      "description": "A wake evaluated each time a matching custom webhook event arrives."
                    },
                    "eventType": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_.:-]{0,79}$",
                      "description": "The event `type` this wake matches; a live webhook delivery of a different type is ignored before it reaches the condition."
                    },
                    "fields": {
                      "maxItems": 32,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "minItems": 1,
                            "maxItems": 8,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,63}$"
                            },
                            "description": "The keys to walk, in order, from an observation's top level down to this field."
                          },
                          "valueType": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "boolean",
                                    "description": "A true/false value."
                                  }
                                },
                                "required": [
                                  "type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "string",
                                    "description": "A text value."
                                  }
                                },
                                "required": [
                                  "type"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "integer",
                                    "description": "A whole-number value, compared exactly."
                                  },
                                  "unit": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 64,
                                    "description": "The unit an integer or decimal value is measured in, as the source or literal declares it."
                                  }
                                },
                                "required": [
                                  "type",
                                  "unit"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "const": "decimal",
                                    "description": "An exact decimal value, as text, compared exactly."
                                  },
                                  "unit": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 64,
                                    "description": "The unit an integer or decimal value is measured in, as the source or literal declares it."
                                  }
                                },
                                "required": [
                                  "type",
                                  "unit"
                                ]
                              }
                            ],
                            "description": "What type this field's value has, and the unit it carries when it has one."
                          },
                          "optional": {
                            "description": "Whether the provider may genuinely not observe this field, rather than fail to read it. When true, a missing value resolves a condition over it to `missing_field` and the rule's verdict to `unknown`, rather than zero, null or false.",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "path",
                          "valueType"
                        ],
                        "description": "One data field an event or a source's observation carries: where it lives, and its type."
                      },
                      "description": "The data fields an event of this type is declared to carry."
                    }
                  },
                  "required": [
                    "kind",
                    "eventType",
                    "fields"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "reader_update",
                      "description": "A wake evaluated each time the named reader delivers a fresh observation."
                    },
                    "binding": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                      "description": "The binding name a rule or a plan gives one configured source."
                    }
                  },
                  "required": [
                    "kind",
                    "binding"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "manual",
                      "description": "A wake fired only by `automations.invoke` or `automations.signal`, never on its own."
                    }
                  },
                  "required": [
                    "kind"
                  ]
                }
              ]
            },
            "description": "Occasions to evaluate the rule's condition: alternatives, not an AND of conditions. At most one clock, one event stream and one manual wake."
          },
          "readers": {
            "maxItems": 4,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                  "description": "The binding name a rule or a plan gives one configured source."
                },
                "readerId": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_.-]{0,79}$",
                  "description": "The installed source operation's id, as returned by `automationSources.list`."
                },
                "config": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "$ref": "#/components/schemas/AutomationJsonValue"
                  },
                  "description": "Arbitrary JSON data for this event: a manual invocation's or signal's payload, a reader's configuration, or a source plan's configuration. Bounded to 16 KiB, 8 levels of nesting and 256 entries."
                },
                "pollIntervalSeconds": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 2147483,
                  "description": "How often this reader polls its source, in seconds."
                },
                "maxAgeSeconds": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 86400,
                  "description": "Maximum retained input age at evaluation, matching requirement.maxAgeSeconds when present. Snapshots use observation time; events use trusted receipt time. Collection separately enforces the provider's acquisition-age guarantee."
                },
                "requirement": {
                  "type": "object",
                  "properties": {
                    "maxLatencySeconds": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 2147483
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "The target delay between an observation and its delivery, in seconds; null when delivery has no target deadline."
                    },
                    "maxAgeSeconds": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 86400,
                      "description": "Maximum acceptable input age at evaluation, matching the reader's maxAgeSeconds, measured from the provider's own observation time. The selected provider's acquisition guarantee must fit within this limit and does not reduce this evaluation window."
                    },
                    "allowDegradedLatency": {
                      "type": "boolean",
                      "description": "Whether delivery slower than the target delay is still accepted."
                    },
                    "maxAcceptedLatencySeconds": {
                      "description": "The slowest delivery still accepted, in seconds, when `allowDegradedLatency` is set.",
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 2147483
                    }
                  },
                  "required": [
                    "maxLatencySeconds",
                    "maxAgeSeconds",
                    "allowDegradedLatency"
                  ],
                  "description": "What a reader needs from its source: how fresh an answer must be, and whether a slower one is still acceptable."
                }
              },
              "required": [
                "name",
                "readerId",
                "config",
                "pollIntervalSeconds",
                "maxAgeSeconds"
              ]
            },
            "description": "The named source bindings this rule reads from, referenced by `condition` and by each `reader_update` wake's `binding`."
          },
          "condition": {
            "description": "The rule's condition tree, up to 8 levels deep and 128 nodes total, built from five node kinds: `{op:\"bool\", value}` a fixed true/false leaf; `{op:\"compare\", comparator, left, right}` one of `eq`/`ne`/`lt`/`lte`/`gt`/`gte` between two operands — `lt`/`lte`/`gt`/`gte` require both operands to be `integer` or `decimal`, and both sides must share the same type and, for `integer`/`decimal`, the same unit; `{op:\"all\", args}` / `{op:\"any\", args}` AND/OR over one or more child nodes; `{op:\"not\", arg}` negates one child node. An operand is either `{kind:\"field\", binding, path}` — a bound reader's name and the key path into its data — or `{kind:\"literal\", type, value, unit?}` with `type` one of `boolean`/`string`/`integer`/`decimal` (`integer`/`decimal` values are exact decimal strings and carry `unit`). `automations.testCondition` evaluates the tree against a given event without firing."
          },
          "firing": {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "each_match",
                  "rising_edge"
                ],
                "description": "When a qualifying evaluation fires: `each_match` fires on every qualifying evaluation, including the first; `rising_edge` fires only on a known false-to-true transition."
              },
              "repeat": {
                "type": "string",
                "enum": [
                  "once",
                  "repeating"
                ],
                "description": "Whether this rule fires at most once, or keeps watching after it fires."
              },
              "maxRuns": {
                "description": "Maximum deliverable runs recorded for this automation across pauses and resumes. Missed or refused deliveries do not count; recorded runs count even if later canceled, coalesced or failed. Omit for no finite limit beyond repeat=once.",
                "type": "integer",
                "minimum": 1,
                "maximum": 1000000
              },
              "initial": {
                "type": "string",
                "enum": [
                  "baseline",
                  "fire_if_true"
                ],
                "description": "How `rising_edge` treats the first known state: `baseline` records it without firing, `fire_if_true` fires immediately if it is already true."
              },
              "cooldownSeconds": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2678400,
                "description": "The minimum time between firings, in seconds; it does not require the condition to stay true that whole time. For `rising_edge`, a false-to-true edge that lands inside cooldown is discarded, not queued: it is not replayed once cooldown ends, so the rule needs an entirely fresh edge after cooldown lapses before it fires again — simply remaining true past the cooldown boundary does not trigger a firing."
              }
            },
            "required": [
              "mode",
              "repeat",
              "initial",
              "cooldownSeconds"
            ],
            "description": "How this rule turns a qualifying evaluation into a firing: which ones count, how often, and how many."
          },
          "maxSnapshotSkewSeconds": {
            "type": "integer",
            "minimum": 0,
            "maximum": 86400,
            "description": "The most that bound readers' observation times may disagree before evaluation reports `snapshot_skew`, in seconds."
          }
        },
        "required": [
          "schemaVersion",
          "delivery",
          "maxDeliveryLatenessSeconds",
          "maxEvaluationGapSeconds",
          "wakes",
          "readers",
          "condition",
          "firing",
          "maxSnapshotSkewSeconds"
        ],
        "description": "One automation's rule: when it wakes, what condition it evaluates, and how it fires."
      },
      "AutomationJsonValue": {
        "description": "Any JSON value: a string, number, boolean, null, array or object, nested to any depth.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "type": "null"
          },
          {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AutomationJsonValue"
            }
          },
          {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "$ref": "#/components/schemas/AutomationJsonValue"
            }
          }
        ]
      },
      "AutomationMonitoring": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "waiting",
              "healthy",
              "stale",
              "unavailable",
              "paused",
              "completed"
            ],
            "description": "The automation's overall monitoring status: `waiting` no evaluation yet, `healthy` sources and evaluation are current, `stale` an input is older than expected, `unavailable` a source could not be reached, `paused` firing is paused, `completed` its run policy is spent."
          },
          "lastCheckedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When monitoring last checked this automation's sources."
          },
          "sources": {
            "maxItems": 5,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "binding": {
                  "type": "string",
                  "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                  "description": "The binding name a rule or a plan gives one configured source."
                },
                "sourceId": {
                  "type": "string",
                  "description": "The source's id within its provider."
                },
                "check": {
                  "description": "The most recent recipe check against this source, when evidence review is configured.",
                  "type": "object",
                  "properties": {
                    "recipe": {
                      "type": "object",
                      "properties": {
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The recipe description's own version, bumped when its steps change."
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "description": "The recipe's short label, for the reviewed catalog."
                        },
                        "summary": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 600,
                          "description": "What the recipe does, for the reviewed catalog."
                        },
                        "steps": {
                          "minItems": 1,
                          "maxItems": 12,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                                "description": "The step's identifier, unique within its recipe."
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "request",
                                  "validate",
                                  "calculate"
                                ],
                                "description": "What this step does: `request` calls the provider, `validate` checks what it returned, `calculate` derives a value from earlier steps."
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120,
                                "description": "The step's short label, for the reviewed catalog."
                              },
                              "description": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 600,
                                "description": "What this step does, for the reviewed catalog."
                              },
                              "api": {
                                "type": "object",
                                "properties": {
                                  "method": {
                                    "type": "string",
                                    "enum": [
                                      "GET",
                                      "POST",
                                      "GRAPHQL"
                                    ],
                                    "description": "The request's method or protocol."
                                  },
                                  "resource": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 160,
                                    "pattern": "^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$",
                                    "description": "The request's path or resource name."
                                  }
                                },
                                "required": [
                                  "method",
                                  "resource"
                                ],
                                "description": "The request this step makes, when it calls the provider."
                              }
                            },
                            "required": [
                              "id",
                              "kind",
                              "title",
                              "description"
                            ]
                          },
                          "description": "The recipe's steps, in order."
                        },
                        "limitations": {
                          "maxItems": 6,
                          "type": "array",
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 600
                          },
                          "description": "What the recipe does not cover, in the reviewer's own words."
                        },
                        "fingerprint": {
                          "type": "string",
                          "pattern": "^[a-f0-9]{64}$",
                          "description": "A content hash identifying this exact recipe, independent of execution or connection identity."
                        }
                      },
                      "required": [
                        "version",
                        "title",
                        "summary",
                        "steps",
                        "limitations",
                        "fingerprint"
                      ],
                      "description": "A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint."
                    },
                    "startedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                      "description": "When this check began."
                    },
                    "completedAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                      "description": "When this check finished."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "completed",
                        "failed"
                      ],
                      "description": "Whether every step completed."
                    },
                    "steps": {
                      "maxItems": 12,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "stepId": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                            "description": "The declared recipe step this check reports on."
                          },
                          "outcome": {
                            "type": "string",
                            "enum": [
                              "completed",
                              "failed"
                            ],
                            "description": "Whether the step completed or failed."
                          },
                          "requestCount": {
                            "description": "How many requests this step made, when it made any.",
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000
                          },
                          "itemCount": {
                            "description": "How many items this step processed, when counting applies.",
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 1000000
                          },
                          "durationMs": {
                            "description": "How long this step took, in milliseconds.",
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 600000
                          },
                          "reason": {
                            "description": "Why the step failed, when it did: `not_configured` the source lacks a needed setting, `unavailable` the provider did not answer, `malformed` its answer could not be read, `oversized` the answer exceeded a bound, `stale` or `future` a timestamp was out of range, `incomplete` part of the answer was missing, `invalid` the answer failed validation, `canceled` the check was stopped before finishing.",
                            "type": "string",
                            "enum": [
                              "not_configured",
                              "unavailable",
                              "malformed",
                              "oversized",
                              "stale",
                              "future",
                              "incomplete",
                              "invalid",
                              "canceled"
                            ]
                          }
                        },
                        "required": [
                          "stepId",
                          "outcome"
                        ],
                        "description": "One recipe step's recorded outcome: counts and a closed reason only, never a URL, body, cursor, address or error message."
                      },
                      "description": "Each step's own recorded outcome, in order."
                    }
                  },
                  "required": [
                    "recipe",
                    "startedAt",
                    "completedAt",
                    "status",
                    "steps"
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "waiting",
                    "healthy",
                    "stale",
                    "unavailable"
                  ],
                  "description": "This source's health: `waiting` no observation yet, `healthy` fresh, `stale` older than expected, `unavailable` the provider could not be reached."
                },
                "sourceTime": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "When the provider says the most recent observation was true."
                },
                "receivedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "When the engine received the most recent observation."
                },
                "reason": {
                  "description": "Why the source is not healthy, when it is not.",
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "binding",
                "sourceId",
                "status",
                "sourceTime",
                "receivedAt",
                "reason"
              ]
            },
            "description": "Each bound source's own health."
          },
          "lastEvaluation": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "verdict": {
                    "type": "string",
                    "enum": [
                      "true",
                      "false",
                      "unknown"
                    ],
                    "description": "Whether the rule's condition holds: `true` it fires, `false` it does not, `unknown` an input could not be read, so the rule neither fires nor is treated as false."
                  },
                  "evaluatedAt": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                    "description": "When this evaluation ran."
                  },
                  "reasons": {
                    "maxItems": 256,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "nodePath": {
                          "maxItems": 8,
                          "type": "array",
                          "items": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "description": "The path to the condition node this reason explains, as indices into the rule tree."
                        },
                        "code": {
                          "type": "string",
                          "enum": [
                            "missing_source",
                            "unavailable",
                            "gap",
                            "stale",
                            "future",
                            "missing_field",
                            "invalid_value",
                            "snapshot_skew"
                          ],
                          "description": "Why this node could not cleanly resolve: `missing_source` no binding was configured, `unavailable` the provider did not answer, `gap` a break in coverage was recorded, `stale` or `future` a timestamp was out of range, `missing_field` the observation lacked this field, `invalid_value` the value did not match its declared type, `snapshot_skew` the inputs disagreed on when they were true."
                        },
                        "binding": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                          "description": "The binding name a rule or a plan gives one configured source."
                        }
                      },
                      "required": [
                        "nodePath",
                        "code"
                      ]
                    },
                    "description": "Why the verdict is what it is, one entry per condition node that did not cleanly resolve."
                  },
                  "inputs": {
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "binding": {
                              "type": "string",
                              "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                              "description": "The binding name a rule or a plan gives one configured source."
                            },
                            "sourceId": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 128,
                              "description": "The source's id within its provider."
                            },
                            "eventId": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 128,
                              "description": "The observation or event's id."
                            },
                            "receivedAt": {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                              "description": "When the engine received this observation."
                            },
                            "maxAgeSeconds": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991,
                              "description": "How old this observation was allowed to be at evaluation, in seconds."
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "ready",
                                "unavailable",
                                "gap"
                              ],
                              "description": "Whether this input was ready to evaluate, the provider was unavailable, or a gap was recorded instead."
                            },
                            "reason": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 512
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Why the input is not ready, when it is not."
                            },
                            "kind": {
                              "type": "string",
                              "const": "snapshot",
                              "description": "A point-in-time read of current state."
                            },
                            "sourceTime": {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                              "description": "When the provider says this snapshot was true."
                            }
                          },
                          "required": [
                            "binding",
                            "sourceId",
                            "eventId",
                            "receivedAt",
                            "maxAgeSeconds",
                            "status",
                            "reason",
                            "kind",
                            "sourceTime"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "binding": {
                              "type": "string",
                              "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                              "description": "The binding name a rule or a plan gives one configured source."
                            },
                            "sourceId": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 128,
                              "description": "The source's id within its provider."
                            },
                            "eventId": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 128,
                              "description": "The observation or event's id."
                            },
                            "receivedAt": {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                              "description": "When the engine received this observation."
                            },
                            "maxAgeSeconds": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991,
                              "description": "How old this observation was allowed to be at evaluation, in seconds."
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "ready",
                                "unavailable",
                                "gap"
                              ],
                              "description": "Whether this input was ready to evaluate, the provider was unavailable, or a gap was recorded instead."
                            },
                            "reason": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 512
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Why the input is not ready, when it is not."
                            },
                            "kind": {
                              "type": "string",
                              "const": "received_event",
                              "description": "An event the source pushed, or the engine collected as it happened."
                            },
                            "sourceTime": {
                              "type": "null",
                              "description": "Not applicable to a received event; see `occurredAt` and `providerPublishedAt` instead."
                            },
                            "providerPublishedAt": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "maxLength": 64,
                                  "format": "date-time",
                                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "When the provider says it published this event, when it reports one."
                            },
                            "occurredAt": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "date-time",
                                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "When the event actually happened, when the provider reports that separately from when it was published."
                            },
                            "finalizedAt": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "date-time",
                                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "When the provider considers this event no longer subject to correction, when it reports one."
                            }
                          },
                          "required": [
                            "binding",
                            "sourceId",
                            "eventId",
                            "receivedAt",
                            "maxAgeSeconds",
                            "status",
                            "reason",
                            "kind",
                            "sourceTime",
                            "providerPublishedAt",
                            "occurredAt",
                            "finalizedAt"
                          ]
                        }
                      ]
                    },
                    "description": "Each input this evaluation read, without its raw data."
                  }
                },
                "required": [
                  "verdict",
                  "evaluatedAt",
                  "reasons",
                  "inputs"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "The rule's most recent evaluation, when it has run at least once."
          },
          "webhook": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "configured": {
                    "type": "boolean",
                    "description": "Whether a webhook secret has been minted."
                  },
                  "keyId": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The current webhook secret's id, for rotation."
                  },
                  "lastReceivedAt": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "When the webhook last received a request."
                  }
                },
                "required": [
                  "configured",
                  "keyId",
                  "lastReceivedAt"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "This automation's inbound webhook, when its rule listens for one."
          },
          "reason": {
            "description": "Why status is not healthy, when it is not.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "status",
          "lastCheckedAt",
          "sources",
          "lastEvaluation",
          "webhook",
          "reason"
        ],
        "description": "An automation's current health: its sources, its most recent evaluation, and its inbound webhook, if it has one."
      },
      "AutomationOccurrence": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The occurrence's id."
          },
          "deliverySequence": {
            "type": "string",
            "pattern": "^[1-9]\\d*$",
            "description": "This occurrence's place in its automation's delivery order, as a string so it sorts and compares exactly at any size."
          },
          "automationId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The automation's id."
          },
          "definitionVersion": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "description": "The automation definition version this occurrence fired under."
          },
          "activationEpoch": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The activation epoch this occurrence fired under."
          },
          "name": {
            "type": "string",
            "description": "The automation's name at the time this occurrence fired."
          },
          "prompt": {
            "type": "string",
            "description": "The automation's prompt at the time this occurrence fired."
          },
          "evidence": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "decision",
                  "manual",
                  "external"
                ],
                "description": "What produced this occurrence: `decision` the rule's own condition, `manual` an owner's invoke or signal, `external` a source that decided on the engine's behalf."
              },
              "identity": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256,
                "description": "A stable string identifying this exact decision, used to deduplicate replays."
              },
              "evaluatedAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                "description": "When this decision was made."
              },
              "data": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "$ref": "#/components/schemas/AutomationJsonValue"
                },
                "description": "The observations behind one decision, exactly as evaluated. Bounded to 256 KiB, 24 levels of nesting and 16384 entries."
              },
              "sourceChecks": {
                "description": "Recipe checks recorded for each source this decision read, when evidence review is configured.",
                "maxItems": 4,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "binding": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
                      "description": "The binding this check was collected for."
                    },
                    "sourceId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "The source's id within its provider."
                    },
                    "eventId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128,
                      "description": "The specific event or observation this check backs."
                    },
                    "operationId": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_.-]{0,79}$",
                      "description": "The collection operation this check ran."
                    },
                    "operationVersion": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "The collection operation's version."
                    },
                    "check": {
                      "type": "object",
                      "properties": {
                        "recipe": {
                          "type": "object",
                          "properties": {
                            "version": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "maximum": 9007199254740991,
                              "description": "The recipe description's own version, bumped when its steps change."
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 120,
                              "description": "The recipe's short label, for the reviewed catalog."
                            },
                            "summary": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 600,
                              "description": "What the recipe does, for the reviewed catalog."
                            },
                            "steps": {
                              "minItems": 1,
                              "maxItems": 12,
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                                    "description": "The step's identifier, unique within its recipe."
                                  },
                                  "kind": {
                                    "type": "string",
                                    "enum": [
                                      "request",
                                      "validate",
                                      "calculate"
                                    ],
                                    "description": "What this step does: `request` calls the provider, `validate` checks what it returned, `calculate` derives a value from earlier steps."
                                  },
                                  "title": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 120,
                                    "description": "The step's short label, for the reviewed catalog."
                                  },
                                  "description": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 600,
                                    "description": "What this step does, for the reviewed catalog."
                                  },
                                  "api": {
                                    "type": "object",
                                    "properties": {
                                      "method": {
                                        "type": "string",
                                        "enum": [
                                          "GET",
                                          "POST",
                                          "GRAPHQL"
                                        ],
                                        "description": "The request's method or protocol."
                                      },
                                      "resource": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 160,
                                        "pattern": "^\\/?[A-Za-z0-9_{}][A-Za-z0-9_./{} -]*$",
                                        "description": "The request's path or resource name."
                                      }
                                    },
                                    "required": [
                                      "method",
                                      "resource"
                                    ],
                                    "description": "The request this step makes, when it calls the provider."
                                  }
                                },
                                "required": [
                                  "id",
                                  "kind",
                                  "title",
                                  "description"
                                ]
                              },
                              "description": "The recipe's steps, in order."
                            },
                            "limitations": {
                              "maxItems": 6,
                              "type": "array",
                              "items": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 600
                              },
                              "description": "What the recipe does not cover, in the reviewer's own words."
                            },
                            "fingerprint": {
                              "type": "string",
                              "pattern": "^[a-f0-9]{64}$",
                              "description": "A content hash identifying this exact recipe, independent of execution or connection identity."
                            }
                          },
                          "required": [
                            "version",
                            "title",
                            "summary",
                            "steps",
                            "limitations",
                            "fingerprint"
                          ],
                          "description": "A reviewed, public description of how a source is collected: the steps a reviewer confirmed, never an executable request or a resolved private endpoint."
                        },
                        "startedAt": {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                          "description": "When this check began."
                        },
                        "completedAt": {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
                          "description": "When this check finished."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "completed",
                            "failed"
                          ],
                          "description": "Whether every step completed."
                        },
                        "steps": {
                          "maxItems": 12,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "stepId": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_-]{0,47}$",
                                "description": "The declared recipe step this check reports on."
                              },
                              "outcome": {
                                "type": "string",
                                "enum": [
                                  "completed",
                                  "failed"
                                ],
                                "description": "Whether the step completed or failed."
                              },
                              "requestCount": {
                                "description": "How many requests this step made, when it made any.",
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100000
                              },
                              "itemCount": {
                                "description": "How many items this step processed, when counting applies.",
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 1000000
                              },
                              "durationMs": {
                                "description": "How long this step took, in milliseconds.",
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 600000
                              },
                              "reason": {
                                "description": "Why the step failed, when it did: `not_configured` the source lacks a needed setting, `unavailable` the provider did not answer, `malformed` its answer could not be read, `oversized` the answer exceeded a bound, `stale` or `future` a timestamp was out of range, `incomplete` part of the answer was missing, `invalid` the answer failed validation, `canceled` the check was stopped before finishing.",
                                "type": "string",
                                "enum": [
                                  "not_configured",
                                  "unavailable",
                                  "malformed",
                                  "oversized",
                                  "stale",
                                  "future",
                                  "incomplete",
                                  "invalid",
                                  "canceled"
                                ]
                              }
                            },
                            "required": [
                              "stepId",
                              "outcome"
                            ],
                            "description": "One recipe step's recorded outcome: counts and a closed reason only, never a URL, body, cursor, address or error message."
                          },
                          "description": "Each step's own recorded outcome, in order."
                        }
                      },
                      "required": [
                        "recipe",
                        "startedAt",
                        "completedAt",
                        "status",
                        "steps"
                      ],
                      "description": "A recorded run of a recipe's steps against the real source, kept as evidence."
                    }
                  },
                  "required": [
                    "binding",
                    "sourceId",
                    "eventId",
                    "operationId",
                    "operationVersion",
                    "check"
                  ],
                  "description": "Frozen recipe evidence tied to the actual observation used by one decision."
                }
              }
            },
            "required": [
              "kind",
              "identity",
              "evaluatedAt",
              "data"
            ],
            "description": "What triggered this occurrence: the decision, its evaluated data, and any recipe checks behind it."
          },
          "state": {
            "type": "string",
            "enum": [
              "pending",
              "deferred",
              "accepted",
              "rejected",
              "canceled",
              "skipped",
              "coalesced"
            ],
            "description": "This occurrence's delivery state: `pending` waiting to run, `deferred` an admission attempt failed and is waiting to retry, `accepted` handed to a run, `rejected` the delivery policy refused it outright, or a non-retryable admission failure (or an exhausted retry deadline) stopped it, `canceled` stopped before running, `skipped` a previous occurrence was still active, `coalesced` merged into a newer match."
          },
          "reason": {
            "description": "Why the occurrence is in this state, when there is one to give.",
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
            "description": "When this occurrence was recorded."
          },
          "deliveryDeadline": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
            "description": "The latest this occurrence could still be delivered."
          },
          "nextAttemptAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
            "description": "When the engine will next try to deliver this occurrence."
          },
          "lastAttemptAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the engine last tried to deliver this occurrence, when it has tried."
          },
          "attempts": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "How many delivery attempts this occurrence has had."
          },
          "conversationId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                "description": "The conversation's id."
              },
              {
                "type": "null"
              }
            ],
            "description": "The conversation this occurrence ran in, once it has one."
          },
          "runId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run this occurrence produced, once it has one."
          },
          "runStatus": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "running",
                  "paused",
                  "completed",
                  "failed",
                  "aborted"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "That run's status, once it has one: `running`, `paused` while an approval waits, then `completed`, `failed` or `aborted`."
          },
          "runError": {
            "description": "Why the run failed, when it did.",
            "type": [
              "string",
              "null"
            ]
          },
          "pendingApprovals": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "How many approvals this occurrence's run is waiting on."
          }
        },
        "required": [
          "id",
          "deliverySequence",
          "automationId",
          "definitionVersion",
          "activationEpoch",
          "name",
          "prompt",
          "evidence",
          "state",
          "reason",
          "createdAt",
          "deliveryDeadline",
          "nextAttemptAt",
          "lastAttemptAt",
          "attempts",
          "conversationId",
          "runId",
          "runStatus",
          "runError",
          "pendingApprovals"
        ],
        "description": "One firing of an automation: what evidence triggered it, its delivery state, and the run it produced, if any."
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "The kind of problem as a URN, `urn:fin:error:<kind>`; stable, compare against it"
          },
          "title": {
            "type": "string",
            "description": "The kind's human title, for logs; never parse it"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599,
            "description": "The HTTP status, repeated in the body"
          },
          "reason": {
            "description": "The machine-readable why. One of:\n\n- `run_active` (409) — a run already holds this conversation\n- `budget_exhausted` (409) — the user's spend headroom is gone, or an operator froze it\n- `approval_not_pending` (409) — the approval was already decided or has expired, or its id does not exist or belongs to a different conversation\n- `execution_capacity` (409) — no execution capacity is free right now; `retryable` says whether to try again\n- `execution_unavailable` (409) — the execution engine could not take the work\n- `stop_pending` (409) — a stop is already in progress and its cleanup is not yet confirmed\n- `automation_changed` (409) — the `revision` sent is stale; reload the automation\n- `automation_held` (409) — an operator holds the automation; it fires again when released\n- `automation_invalid` (409) — the automation's definition cannot run as written\n- `automation_completed` (409) — the automation has finished for good and cannot fire again\n- `automation_limit` (409) — the user already has as many automations as the deployment allows\n- `profile_unknown_tool` (409) — the run profile names a tool this deployment does not have\n- `deployment_paused` (409) — an operator paused a deployment control; nothing was admitted or fired\n- `run_not_active` (409) — the run named in the path is not the conversation's live run\n- `withdrawal_changed` (409) — the withdrawal cannot be prepared or confirmed as asked: the balance no longer covers it, its terms changed or expired, or it is already in progress\n- `credential_expired` (401) — the user token has expired; obtain a fresh one\n- `account_disabled` (403) — an operator disabled the account\n- `account_not_provisioned` (412) — the identity is verified but has no account yet; call `users.ensure` first\n- `provider_unavailable` (503) — an external provider the call depends on did not answer\n- `engine_unavailable` (503) — the execution engine did not answer\n- `invalid_input` (400) — the body or query failed validation; `issues` names each field\n- `internal` (500) — a fault on our side; quote `requestId` when reporting it\n- `partner_key_required` (401) — no `X-Api-Key` header was sent\n- `partner_key_invalid` (401) — the `X-Api-Key` is unknown or revoked\n- `subject_mismatch` (403) — the `{userId}` in the path is not the token's user\n- `origin_rejected` (403) — a browser `Origin` other than the configured web origin\n- `permission_required` (403) — the operator credential lacks the scope this call needs\n- `rate_limited` (429) — the per-key or per-user limit is spent; honour `Retry-After`\n- `stream_capacity` (429) — no stream socket is free on this replica or for this user; honour `Retry-After`\n- `invalid_cursor` (400) — the `cursor` is not one this list minted",
            "type": "string",
            "enum": [
              "run_active",
              "budget_exhausted",
              "approval_not_pending",
              "execution_capacity",
              "execution_unavailable",
              "stop_pending",
              "automation_changed",
              "automation_held",
              "automation_invalid",
              "automation_completed",
              "automation_limit",
              "profile_unknown_tool",
              "deployment_paused",
              "run_not_active",
              "withdrawal_changed",
              "credential_expired",
              "account_disabled",
              "account_not_provisioned",
              "provider_unavailable",
              "engine_unavailable",
              "invalid_input",
              "internal",
              "partner_key_required",
              "partner_key_invalid",
              "subject_mismatch",
              "origin_rejected",
              "permission_required",
              "rate_limited",
              "stream_capacity",
              "invalid_cursor"
            ]
          },
          "requestId": {
            "type": "string",
            "description": "The id Fin used for this request; quote it when reporting a problem"
          },
          "retryable": {
            "type": "boolean",
            "description": "Whether repeating the same request later can succeed without changing it"
          },
          "detail": {
            "description": "Only on `invalid_input`: which part of the request failed validation",
            "type": "string"
          },
          "issues": {
            "description": "Only on `invalid_input`: one entry per failing field",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string",
                  "description": "The JSON pointer of the failing field; empty for the root object"
                },
                "message": {
                  "type": "string",
                  "description": "Why the field failed"
                }
              },
              "required": [
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "requestId",
          "retryable"
        ],
        "description": "RFC 9457 problem details: what every error response carries. Never a provider's message, a query or a stack."
      }
    },
    "responses": {
      "InvalidInput": {
        "description": "The request could not be read as this operation expects.\n\n- `invalid_input` — the body or query failed validation; `issues` names each field\n- `invalid_cursor` — the `cursor` is not one this list minted",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "A credential is missing, invalid or expired.\n\n- `partner_key_required` — no `X-Api-Key` header was sent\n- `partner_key_invalid` — the `X-Api-Key` is unknown or revoked\n- `credential_expired` — the user token has expired; obtain a fresh one",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The credentials are valid but may not do this.\n\n- `subject_mismatch` — the `{userId}` in the path is not the token's user\n- `account_disabled` — an operator disabled the account\n- `origin_rejected` — a browser `Origin` other than the configured web origin",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "NotFound": {
        "description": "The resource is missing, belongs to someone else, or its id is malformed: all three answer alike.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "AccountNotProvisioned": {
        "description": "The identity is verified but has no account yet.\n\n- `account_not_provisioned` — the identity is verified but has no account yet; call `users.ensure` first",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "The body exceeds the size this deployment accepts.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "A limiter refused the request; honour `Retry-After`.\n\n- `rate_limited` — the per-key or per-user limit is spent; honour `Retry-After`",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "Internal": {
        "description": "A fault on our side; quote `requestId` when reporting it.\n\n- `internal` — a fault on our side; quote `requestId` when reporting it",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      },
      "Unavailable": {
        "description": "The replica is draining or a dependency did not answer; `retryable` says whether to try again.\n\n- `internal` — a fault on our side; quote `requestId` when reporting it",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ProblemDetails"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Api-Key"
      },
      "userToken": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}
Fin documentation Built from the API contract · v1

Search all documentation