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. TriggerKind.Schedule (cron / interval) and 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. 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 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"The days of the week a ScheduleFrequency.Weekly schedule fires on (e.g. SUNDAY..THURSDAY). When non-empty this is the authoritative set; the scalar CreateTriggerRequest.ScheduleDay is derived from its first day. Only valid for Weekly; no duplicates. Null/empty uses the scalar day.
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 ScheduleFrequency.Daily or ScheduleFrequency.Weekly schedule. When non-empty this is the authoritative set of times; the scalar CreateTriggerRequest.ScheduleHour/CreateTriggerRequest.ScheduleMinute are derived from the first slot. Only valid for Daily/Weekly; entries must be ≥30 minutes apart. Null/empty uses the scalar time.
int32"UNSPECIFIED" | "MINUTES" | "HOURS" | "DAYS"Optional content predicate for 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 Triggers.TriggerEventFilter.
Optional work shape whose source items are admitted to a durable ledger. Currently supported only for SCHEDULE triggers. Null for an ordinary trigger that fires an agent.
How often this automation reports what its work came to, and at what hour. Omit for the default — daily at 08:00 in the automation's own timezone.
Legacy bindings field — agent ids only, no parameter mappings. When 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 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",
"scheduleDays": [
"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",
"parameters": {},
"startFrom": 0,
"skipWhen": {
"match": "UNSPECIFIED",
"conditions": []
},
"projection": [
"string"
]
},
"source": {
"kind": "TOOL",
"ragAssetId": "string",
"ragReadMode": "DOCUMENTS",
"ragSearch": "string",
"pageSize": 0,
"integrationConfigId": "string",
"integrationId": "string",
"listToolId": "string",
"getToolId": "string",
"recordsPath": "string",
"cursorParamName": "string",
"totalPath": "string",
"pageOrder": "SOURCE_ORDER",
"parameters": {},
"itemIdPath": "string",
"itemVersionPath": "string",
"previousVersionField": "string",
"sinkTargetPath": "string",
"sinkTargetKind": "ROW",
"skipWhen": {
"match": "UNSPECIFIED",
"conditions": []
},
"sourceUrlPath": "string",
"cursorPath": "string",
"watermarkParamName": "string",
"watermarkFormat": "RAW",
"overlapWindowMs": 0,
"startFrom": 0,
"flattenSheetRows": false
},
"onDemand": {
"keyPaths": [
"string"
],
"labelPaths": [
"string"
],
"inputs": [],
"tool": {
"enabled": false,
"description": "string"
},
"agentsMayStart": false
},
"stages": [
{
"id": "string",
"displayName": "string",
"kind": "UNSPECIFIED",
"agentId": "string",
"instruction": "string",
"ask": null,
"wait": null,
"batch": null,
"sink": null,
"actionTypeCeiling": null,
"claimLimit": null,
"maxRunning": null,
"parameters": [],
"produces": [],
"requires": [],
"dedupeKey": [],
"routes": [],
"ignoreReasons": []
}
],
"parameters": [
{
"name": "string",
"value": "string",
"description": "string"
}
],
"policy": {
"claimLimit": 0,
"maxAttempts": 0,
"leaseSeconds": 0,
"actionTypeCeiling": "READ_ONLY",
"itemCostCapUsd": 0,
"effectiveClaimLimit": 1,
"effectiveMaxAttempts": 1,
"effectiveLeaseSeconds": 1
},
"outcomeUnit": {
"singular": "string",
"plural": "string"
},
"cohorts": {
"window": "DAY",
"settleWithinHours": 0,
"confirmAboveCredits": 0,
"followUp": []
}
},
"outcomeDigest": {
"frequency": "DAILY",
"sendHour": 0,
"report": {
"agentId": "string",
"contactSlot": "string",
"labelPaths": [
"string"
],
"isComplete": true,
"effectiveLabelPaths": [
"string"
]
}
},
"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": []
}
],
"warnings": [
"string"
],
"managedBy": {
"ownerKind": "KNOWLEDGE_SOURCE",
"ownerId": "00000000-0000-0000-0000-000000000000",
"roles": [
"SOURCE"
],
"ownership": "MANAGED",
"ownerDisplayName": "string",
"ownerContainerId": "00000000-0000-0000-0000-000000000000",
"ownerContainerDisplayName": "string",
"linkedOwnerCount": 0
}
}{
"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.