Creates a new trigger in an Application and optionally binds it to agents atomically.
Creates the trigger together with any initial agent bindings supplied in the request, in a single transaction. The trigger `Kind` (schedule, webhook, or integration event) is fixed at creation — changing it later requires recreating the trigger, since each kind carries its own configuration shape. The owning Application is the `network` path segment. Every trigger belongs to exactly one, and an unowned trigger would be listed by no Application while still firing, so ownership is part of the address rather than an omittable body field. The created trigger is read and edited on the flat `{tenant}/triggers/{trigger}` tree, which is where the Location header points.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The Application (Network) that will own the trigger.
uuidThe tenant identifier
The trigger configuration and initial agent bindings.
Discriminates between the different ways a trigger can fire an agent. Fruxon.Model.Triggers.TriggerKind.Schedule (cron / interval) and Fruxon.Model.Triggers.TriggerKind.IntegrationEvent (events emitted by a configured integration — Slack messages, GitHub pull requests, inbound Gmail / Outlook mail, …) are both implemented and fire agents in production. Fruxon.Model.Triggers.TriggerKind.Webhook is the only value still reserved: no dispatcher consumes it yet, and it exists so the wire format stays stable when that work lands.
"UNSPECIFIED" | "SCHEDULE" | "WEBHOOK" | "INTEGRATION_EVENT"Integration id (slack, github, telegram, …) when the trigger sources from one. Null for Schedule and other integration-less kinds.
Optional pin to a specific TenantIntegrationConfig — used when the trigger needs to know which workspace/bot/token to listen on.
uuidFor Fruxon.Model.Triggers.TriggerKind.IntegrationEvent: the descriptor id of
the event to listen for (e.g. slack.message.received). Null
means "any event from this integration" — the legacy semantic
preserved for backward compatibility with rows created before this
field landed.
int3260 <= value <= 2147483647"UNSPECIFIED" | "DAILY" | "WEEKLY" | "MONTHLY" | "INTERVAL""UNSPECIFIED" | "MONDAY" | "TUESDAY" | "WEDNESDAY" | "THURSDAY" | "FRIDAY" | "SATURDAY" | "SUNDAY"Day of the month for monthly schedules: 1..31 for a
specific day, or -1 for the last day of the month (RFC 5545
BYMONTHDAY convention). Service-layer validation rejects
0 and out-of-range values.
int32Multiple intra-day fire times for a Fruxon.Model.Jobs.ScheduleFrequency.Daily schedule. When non-empty this is the authoritative set of times; the scalar Fruxon.Model.Triggers.CreateTriggerRequest.ScheduleHour/Fruxon.Model.Triggers.CreateTriggerRequest.ScheduleMinute are derived from the first slot. Only valid for Daily; entries must be ≥30 minutes apart. Null/empty uses the scalar time.
int32"UNSPECIFIED" | "MINUTES" | "HOURS" | "DAYS"Optional content predicate for Fruxon.Model.Triggers.TriggerKind.IntegrationEvent triggers — only events whose payload matches are forwarded to the bound agents. Rejected on non-integration-event kinds. Null (or no conditions) fires always. See Fruxon.Model.Triggers.TriggerEventFilter.
Optional work shape — the source door whose items this automation admits into a durable
ledger. Only valid on Fruxon.Model.Triggers.TriggerKind.Schedule triggers in V0. Null for an
ordinary agent-firing trigger. See docs/design/item-ledger.md §8.1.
Legacy bindings field — agent ids only, no parameter mappings. When Fruxon.Model.Triggers.CreateTriggerRequest.Bindings is non-empty, this is ignored. Kept for one release so existing CLI / dashboard clients keep working until they migrate to the structured shape. The service expands each id into a binding with an empty parameter-mapping list; the operator wires inputs explicitly on the Mappings tab.
Agents to bind to this trigger on creation, with each binding's payload→parameter mappings. May be empty. When non-empty, the trigger and its bindings are created atomically — a failure mid-way leaves no orphaned trigger row. Takes precedence over Fruxon.Model.Triggers.CreateTriggerRequest.AgentIds.
Response Body
curl -X POST "https://api.fruxon.com/v1/tenants/string/networks/497f6eca-6276-4993-bfeb-53cbbbba6f08/triggers" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "00000000-0000-0000-0000-000000000000",
"networkId": "00000000-0000-0000-0000-000000000000",
"kind": "SCHEDULE",
"integrationId": "string",
"integrationConfigId": "00000000-0000-0000-0000-000000000000",
"eventType": "string",
"displayName": "string",
"active": false,
"timeout": 0,
"scheduleFrequency": "DAILY",
"scheduleDay": "MONDAY",
"scheduleDayOfMonth": 0,
"scheduleHour": "string",
"scheduleMinute": "string",
"scheduleTimes": [
{
"hour": 0,
"minute": 0
}
],
"intervalValue": 0,
"intervalUnit": "MINUTES",
"timezone": "string",
"filter": {
"match": "ALL",
"conditions": [
{
"path": "string",
"operator": "UNSPECIFIED",
"value": "string",
"values": null,
"caseSensitive": false
}
]
},
"workShape": {
"door": {
"doorId": "string",
"integrationConfigId": "string",
"query": "string"
},
"source": {
"kind": "TOOL",
"ragAssetId": "string",
"ragReadMode": "DOCUMENTS",
"ragSearch": "string",
"pageSize": 0,
"integrationConfigId": "string",
"listToolId": "string",
"getToolId": "string",
"recordsPath": "string",
"cursorParamName": "string",
"parameters": {},
"itemIdPath": "string",
"sinkTargetPath": "string",
"skipWhen": {
"match": "UNSPECIFIED",
"conditions": []
},
"sourceUrlPath": "string",
"cursorPath": "string",
"watermarkParamName": "string",
"watermarkFormat": "RAW",
"overlapWindowMs": 0,
"flattenSheetRows": false
},
"stages": [
{
"id": "string",
"displayName": "string",
"kind": "UNSPECIFIED",
"agentId": "string",
"instruction": "string",
"ask": null,
"sink": null,
"actionTypeCeiling": null,
"claimLimit": null,
"parameters": [],
"produces": [],
"requires": [],
"dedupeKey": []
}
],
"parameters": [
{
"name": "string",
"value": "string",
"description": "string"
}
],
"policy": {
"claimLimit": 0,
"maxAttempts": 0,
"leaseSeconds": 0,
"actionTypeCeiling": "READ_ONLY",
"effectiveClaimLimit": 1,
"effectiveMaxAttempts": 1,
"effectiveLeaseSeconds": 1
}
},
"createdAt": 0,
"modifiedAt": 0,
"lastFiredAt": 0,
"hasWebhookKey": false,
"webhookOwnership": "PER_BINDING",
"agentIds": [
"string"
],
"bindings": [
{
"agentId": "string",
"parameterMappings": [],
"environmentSlug": "string",
"outputBindingId": "00000000-0000-0000-0000-000000000000",
"outputDestination": {
"bindingId": "00000000-0000-0000-0000-000000000000",
"participantId": "00000000-0000-0000-0000-000000000000",
"integrationConfigId": "00000000-0000-0000-0000-000000000000",
"provider": "string",
"address": "string"
},
"defaultOutputDestinations": []
}
]
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}Answers a question on behalf of the person who could not be reached.
The answer travels the same path a channel reply takes, so the two behaviours that make batch answering safe are preserved rather than reimplemented: the reply interpreter fails closed (anything it cannot map with confidence advances nothing), and each item advances only when the ASK stage's `answeredWhenPath` is actually filled in — answering two of three advances two and leaves one WAITING for the deadline. Write it the way you would write it to a colleague. A conforming `{"answers":{"<item key>":"…"}}` payload is also accepted verbatim and skips the model. Returns 400 when nothing in the answer could be matched to an item — the interpreter refuses to guess, so nothing moves and the question stays open and answerable; 409 when a reply, a cancellation or the expiry sweeper settled it first.
Removes the binding between the trigger and an agent
Unbinds the trigger from an agent so the agent no longer runs when the trigger fires. The call is idempotent: removing a binding that does not exist still succeeds with 204. Neither the trigger nor the agent is deleted.