diff --git a/apps/docs/.plans/integrations-ia.md b/apps/docs/.plans/integrations-ia.md new file mode 100644 index 00000000000..c1b671fe658 --- /dev/null +++ b/apps/docs/.plans/integrations-ia.md @@ -0,0 +1,85 @@ +# Spec: integration pages as per-service block indexes + +Status: approved, in progress. Owner: docs reorg (`feat/docs-reorg`). + +## Ontology (the thing we're encoding) + +Everything in a workflow is a **block**. A workflow is **blocks + connections**. Some +blocks are **triggers** — they take no input and start the run. This is literal in the +code: `BlockCategory = 'blocks' | 'tools' | 'triggers'`, and integration blocks +(`gmail`, `github`, …) additionally carry a `triggers: {}` capability — the same block +does actions *and* can start a workflow. There is no separate "trigger" species, and we +stop using the word **"Tools"** in user-facing docs. + +Encoding: a small **Trigger** badge on any block that starts a workflow (driven by +`category: 'triggers'` or a `triggers:{}` capability). Native trigger blocks and an +integration's trigger use the same badge. + +## Target IA + +- **`/integrations/`** (generated, one page per service) — a **block index for + that service**: its capabilities listed, trigger capability(ies) badged **Trigger**. + This single page is the per-integration unified reference. Replaces `/tools/` + **and** `/triggers/`. +- **Blocks reference** (hand-written: core blocks + the ~10 trigger blocks) — same + pattern: a block index with triggers badged. Folds today's *Core Blocks* + *Core + Triggers* into one "blocks, some are triggers" surface. +- **Retire** `/tools/*`, `/triggers/`, and the interim `integration-triggers/` + folder → all become `/integrations/`. + +## Resolved decisions + +- **A. Native trigger blocks** live in the **Blocks** reference, badged **Trigger**, kept + in a scannable "Triggers" sub-grouping within it. (Done as the final step, after the + generator work.) +- **B. Navbar / section label = "Integrations".** Users search by service; the ontology + ("it's a block") is taught in prose, not the nav label. +- **C. Redirects added.** Initially decided as a fresh start, revised before merge: + `/tools/*` are live, indexed URLs referenced by deployed app docsLink fields and + marketplace listings, so next.config now 308s them (and the old + `/triggers/` pages) to `/integrations/`. +- **D. Integration page = one page per service** listing the service's operations + its + trigger(s), triggers badged. Not Tools/Triggers tabs; a single badged block index. + +## Generator (`scripts/generate-docs.ts`) + +Today: `generateAllBlockDocs()` → writes `tools/.mdx` (per `category:'tools'` +block) + `generateAllTriggerDocs()` writes `triggers/.mdx` from +`apps/sim/triggers//` + rewrites `triggers/meta.json` + emits +icons/icon-mapping/landing `integrations.json`. **One integration = two pages today.** + +Changes: +1. New output root `content/docs/en/integrations/`; stop writing `tools/` and integration + `triggers/`. +2. **Join by service:** for each integration gather (a) the block's operations/actions and + (b) the trigger config from `apps/sim/triggers//` if present. +3. Emit `integrations/.mdx`: header (icon + name) + block index, trigger entries + badged. Generate `integrations/meta.json`. +4. Repoint landing/icon `docsUrl` (`/tools/` → `/integrations/`); keep the landing + `integrations.json` shape intact. +5. Keep hand-written core blocks + native triggers (`HANDWRITTEN_*` / `SKIP_*`). Remove + the old `tools`/`triggers` meta writers. + +## Redirects (`apps/docs/next.config.ts`) + +- `/tools` -> `/integrations`; `/tools/:slug` -> `/integrations/:slug` (custom-tools -> building-agents) +- `/triggers/` -> `/integrations/` (enumerated; provider-slug mappings for jsm/google-*/microsoft-teams) +- `/blocks` -> `/workflows#blocks`; `/triggers` -> `/workflows#triggers` +- Native trigger pages (`/triggers/start|schedule|webhook|rss|table`) unaffected. + +## Migration order + +1. Trigger badge component + the integration-page template. +2. Rewrite the generator to emit `/integrations/`; regenerate; delete old + `tools/` + integration `triggers/` + `integration-triggers/`. +3. Redirects; rename the navbar surface to Integrations; update `meta.json`. +4. Fold native triggers into the Blocks reference (badged); retire the separate Core + Triggers framing. +5. Build + link-check. + +## Notes / risk + +- The generator also feeds the **landing page** via `integrations.json` — changes must not + break its shape, only repoint doc URLs. +- The interim `integration-triggers/` folder and the *Core Triggers* accordion are + scaffolding that this supersedes. diff --git a/apps/docs/.plans/visuals-manifest.md b/apps/docs/.plans/visuals-manifest.md new file mode 100644 index 00000000000..2c2d526b872 --- /dev/null +++ b/apps/docs/.plans/visuals-manifest.md @@ -0,0 +1,164 @@ +# Visuals manifest — screenshots and walkthroughs to recapture + +Generated from the live content tree. CURRENT = captured against the new UI +this cycle; everything else predates the UI changes (Integrations moved out of +Settings, Agent block Messages field, new sidebar IA, block colors) and should +be assumed stale until verified. + +## Screenshots (120 unique) + +- [ ] `/static/api-deployment/api-info.png` — deployment/api.mdx +- [ ] `/static/api-deployment/api-select-outputs.png` — deployment/api.mdx +- [ ] `/static/api-deployment/api-tab.png` — deployment/api.mdx +- [ ] `/static/api-deployment/api-update-button.png` — deployment/api.mdx +- [ ] `/static/api-deployment/api-versions-menu.png` — deployment/api.mdx +- [ ] `/static/api-deployment/api-versions.png` — deployment/api.mdx +- [ ] `/static/blocks/credential-loop.png` — blocks/credential.mdx +- [ ] `/static/blocks/guardrails-2.png` — blocks/guardrails.mdx +- [ ] `/static/blocks/hitl-2.png` — blocks/human-in-the-loop.mdx +- [ ] `/static/blocks/loop-1.png` — blocks/loop.mdx +- [ ] `/static/blocks/loop-2.png` — blocks/loop.mdx +- [ ] `/static/blocks/loop-3.png` — blocks/loop.mdx +- [ ] `/static/blocks/loop-4.png` — blocks/loop.mdx +- [ ] `/static/blocks/mcp-add-modal.png` — mcp/index.mdx +- [ ] `/static/blocks/mcp-agent-dropdown.png` — mcp/index.mdx +- [ ] `/static/blocks/mcp-agent-tools.png` — mcp/index.mdx +- [ ] `/static/blocks/mcp-client-config.png` — deployment/mcp.mdx +- [ ] `/static/blocks/mcp-deploy-modal.png` — deployment/mcp.mdx +- [ ] `/static/blocks/mcp-server-add-modal.png` — deployment/mcp.mdx +- [ ] `/static/blocks/mcp-server-details.png` — deployment/mcp.mdx +- [ ] `/static/blocks/mcp-servers-settings.png` — deployment/mcp.mdx +- [ ] `/static/blocks/mcp-settings.png` — mcp/index.mdx +- [ ] `/static/blocks/mcp-tool-block.png` — mcp/index.mdx +- [ ] `/static/blocks/parallel-1.png` — blocks/parallel.mdx +- [ ] `/static/blocks/parallel-2.png` — blocks/parallel.mdx +- [ ] `/static/blocks/schedule-3.png` — triggers/schedule.mdx +- [ ] `/static/chat/chat-deploy-access-email.png` — deployment/chat.mdx +- [ ] `/static/chat/chat-deploy-config.png` — deployment/chat.mdx +- [ ] `/static/chat/chat-deploy-output.png` — deployment/chat.mdx +- [ ] `/static/chat/chat-live.png` — deployment/chat.mdx +- [ ] `/static/connectors/connectors-excluded.png` — knowledgebase/connectors.mdx +- [ ] `/static/connectors/connectors-list.png` — knowledgebase/connectors.mdx +- [ ] `/static/connectors/connectors-sources.png` — knowledgebase/connectors.mdx +- [ ] `/static/connectors/connectors-sync-history.png` — knowledgebase/connectors.mdx +- [ ] `/static/credentials/add-service-account.png` — integrations/google-service-account.mdx +- [ ] `/static/credentials/atlassian/admin-auth-type-picker.png` — integrations/atlassian-service-account.mdx +- [ ] `/static/credentials/atlassian/admin-scope-picker.png` — integrations/atlassian-service-account.mdx +- [ ] `/static/credentials/atlassian/sim-add-modal.png` — integrations/atlassian-service-account.mdx +- [ ] `/static/credentials/atlassian/sim-jira-block-credential.png` — integrations/atlassian-service-account.mdx +- [ ] `/static/credentials/gcp-add-client-id.png` — integrations/google-service-account.mdx +- [ ] `/static/credentials/gcp-create-private-key.png` — integrations/google-service-account.mdx +- [ ] `/static/credentials/gcp-create-service-account.png` — integrations/google-service-account.mdx +- [ ] `/static/credentials/integrations-service-account.png` — integrations/google-service-account.mdx +- [ ] `/static/credentials/oauth-selector.png` — integrations/index.mdx +- [ ] `/static/credentials/secret-dropdown.png` — credentials/index.mdx +- [ ] `/static/credentials/secret-resolved.png` — credentials/index.mdx +- [ ] `/static/credentials/workflow-impersonated-account.png` — integrations/google-service-account.mdx +- [ ] `/static/enterprise/access-control-blocks.png` — enterprise/access-control.mdx +- [ ] `/static/enterprise/access-control-groups.png` — enterprise/access-control.mdx +- [ ] `/static/enterprise/access-control-model-providers.png` — enterprise/access-control.mdx +- [ ] `/static/enterprise/access-control-platform.png` — enterprise/access-control.mdx +- [ ] `/static/enterprise/audit-logs.png` — enterprise/audit-logs.mdx +- [ ] `/static/enterprise/data-drains-list.png` — enterprise/data-drains.mdx +- [ ] `/static/enterprise/data-drains-new.png` — enterprise/data-drains.mdx +- [ ] `/static/enterprise/data-retention.png` — enterprise/data-retention.mdx +- [ ] `/static/enterprise/sso-form.png` — enterprise/sso.mdx +- [ ] `/static/enterprise/whitelabeling.png` — enterprise/whitelabeling.mdx +- [ ] `/static/execution/combination.png` — workflows/how-it-runs.mdx +- [ ] `/static/execution/concurrency.png` — workflows/how-it-runs.mdx +- [ ] `/static/execution/routing.png` — workflows/how-it-runs.mdx +- [ ] `/static/getting-started/started-1.png` — getting-started/index.mdx +- [x] `/static/integrations/hubspot/connect-hubspot-modal.png` — integrations/hubspot-setup.mdx, integrations/index.mdx +- [x] `/static/integrations/hubspot/hubspot-oauth-signin.png` — integrations/hubspot-setup.mdx +- [x] `/static/integrations/hubspot/hubspot-page-add-to-sim.png` — integrations/hubspot-setup.mdx, integrations/index.mdx +- [x] `/static/integrations/hubspot/integrations-page.png` — integrations/hubspot-setup.mdx, integrations/index.mdx +- [ ] `/static/integrations/manual-credential-id.png` — integrations/index.mdx +- [ ] `/static/integrations/switch-to-manual-id.png` — integrations/index.mdx +- [ ] `/static/introduction.png` — introduction/index.mdx +- [ ] `/static/logs/console.png` — logs-debugging/logging.mdx +- [ ] `/static/logs/logs-cost.png` — costs.mdx +- [ ] `/static/logs/logs-frozen-canvas.png` — logs-debugging/logging.mdx +- [ ] `/static/logs/logs-sidebar.png` — logs-debugging/logging.mdx +- [ ] `/static/logs/logs.png` — logs-debugging/logging.mdx +- [ ] `/static/mothership/chart-example.png` — mothership/files.mdx +- [ ] `/static/mothership/image-example.png` — mothership/files.mdx +- [ ] `/static/mothership/pptx-example.png` — mothership/files.mdx +- [ ] `/static/mothership/table-example.png` — mothership/tables.mdx +- [ ] `/static/quick-reference/add-env-variable.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/clear-chat.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/clear-terminal.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/copy-api.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/copy-log.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/create-workflow.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/delete-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/deploy.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/disable-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/env-variable-reference.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/filter-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/folder-context-menu.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/import-workflow.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/lock-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/output-select.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/promote-deployment.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/run-from-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/run-until-block.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/run-workflow.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/search-everything.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/stop-workflow.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/terminal-search.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/terminal.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/test-chat.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/toggle-manual-mode.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/update-deployment.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/variable-reference.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/variables.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/view-deployment.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/workflow-context-menu.png` — quick-reference/index.mdx +- [ ] `/static/quick-reference/workspace-context-menu.png` — quick-reference/index.mdx +- [ ] `/static/secrets/secret-details.png` — credentials/index.mdx +- [ ] `/static/secrets/secrets-list.png` — credentials/index.mdx +- [x] `/static/skills/add-skill-create.png` — skills/index.mdx +- [x] `/static/skills/add-skill-import.png` — skills/index.mdx +- [ ] `/static/skills/add-skill.png` — skills/index.mdx +- [x] `/static/skills/skills-tab.png` — skills/index.mdx +- [ ] `/static/start.png` — triggers/start.mdx +- [ ] `/static/tables/tables-overview.png` — tables/index.mdx +- [ ] `/static/tags/tags-create.png` — knowledgebase/tags.mdx +- [ ] `/static/tags/tags-document-list.png` — knowledgebase/tags.mdx +- [ ] `/static/tags/tags-kb-menu.png` — knowledgebase/tags.mdx +- [ ] `/static/tags/tags-knowledge-block.png` — knowledgebase/tags.mdx + +## Walkthrough videos (23 unique, CDN-served) + +All predate the current UI. getting-started/* confirmed stale (System/User +Prompt era). Mothership set may be closest to current — verify before re-recording. + +- [ ] `getting-started/started-2.mp4` — getting-started/index.mdx +- [ ] `getting-started/started-3.mp4` — getting-started/index.mdx +- [ ] `getting-started/started-4.mp4` — getting-started/index.mdx +- [ ] `getting-started/started-5.mp4` — getting-started/index.mdx +- [ ] `getting-started/started-6.mp4` — getting-started/index.mdx +- [ ] `guardrails.mp4` — blocks/guardrails.mdx +- [ ] `hitl-resume.mp4` — blocks/human-in-the-loop.mdx +- [ ] `introduction/build-workflow.mp4` — introduction/index.mdx +- [ ] `invitations.mp4` — permissions/roles-and-permissions.mdx +- [ ] `knowledgebase-1.mp4` — knowledgebase/index.mdx +- [ ] `mcp/mcp-deploy-tool.mp4` — deployment/mcp.mdx +- [ ] `mcp/mcp-server.mp4` — deployment/mcp.mdx +- [ ] `mcp/settings-mcp-tools.mp4` — mcp/index.mdx +- [ ] `mothership/context-menu.mp4` — mothership/index.mdx +- [ ] `mothership/create-workflow.mp4` — mothership/index.mdx, mothership/workflows.mdx +- [ ] `mothership/files-pipeline-deals-summarizer.mp4` — mothership/files.mdx +- [ ] `mothership/job-create.mp4` — mothership/tasks.mdx +- [ ] `mothership/kb.mp4` — mothership/knowledge.mdx +- [ ] `mothership/research-agent.mp4` — mothership/research.mdx +- [ ] `mothership/run-workflow.mp4` — mothership/workflows.mdx +- [ ] `mothership/split-view.mp4` — mothership/index.mdx +- [ ] `mothership/toggle-file-view.mp4` — mothership/files.mdx +- [ ] `slack-trigger.mp4` — triggers/webhook.mdx + +## Also missing entirely (no asset yet) + +39 `{/* VISUAL */}` placeholder slots + 16 `{/* TODO */}` screenshot markers — +see `grep -rn 'VISUAL\|TODO' content/docs/en/` for the live list (concentrated +in tables, mothership, logs-debugging, files, workspaces, deployment). diff --git a/apps/docs/app/[lang]/[[...slug]]/page.tsx b/apps/docs/app/[lang]/[[...slug]]/page.tsx index 6fb69448f8b..eaae5fe1c57 100644 --- a/apps/docs/app/[lang]/[[...slug]]/page.tsx +++ b/apps/docs/app/[lang]/[[...slug]]/page.tsx @@ -5,11 +5,12 @@ import type { ApiPageProps } from 'fumadocs-openapi/ui' import { createAPIPage } from 'fumadocs-openapi/ui' import { Pre } from 'fumadocs-ui/components/codeblock' import defaultMdxComponents from 'fumadocs-ui/mdx' -import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page' +import { DocsBody, DocsPage, DocsTitle } from 'fumadocs-ui/page' import { notFound } from 'next/navigation' import { PageFooter } from '@/components/docs-layout/page-footer' import { PageNavigationArrows } from '@/components/docs-layout/page-navigation-arrows' import { LLMCopyButton } from '@/components/page-actions' +import { PageTypeBadge } from '@/components/page-type-badge' import { StructuredData } from '@/components/structured-data' import { CodeBlock } from '@/components/ui/code-block' import { Heading } from '@/components/ui/heading' @@ -173,7 +174,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l {data.title} - {data.description} @@ -222,8 +222,8 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l + {data.pageType && } {data.title} - {data.description} + +interface PageTypeBadgeProps { + type: DocsPageType + className?: string +} + +/** + * Small label that tells the reader which Diátaxis mode a page is — learning, + * task, lookup, or understanding. Rendered only when a page declares `type`. + */ +export function PageTypeBadge({ type, className }: PageTypeBadgeProps) { + const config = CONFIG[type] + if (!config) return null + + return ( + + {config.label} + + ) +} diff --git a/apps/docs/components/workflow-preview/block-display-specs.ts b/apps/docs/components/workflow-preview/block-display-specs.ts new file mode 100644 index 00000000000..16f36e5f0fe --- /dev/null +++ b/apps/docs/components/workflow-preview/block-display-specs.ts @@ -0,0 +1,220 @@ +/** + * A hand-authored block, described as what the builder canvas displays. + * + * - `rows` are the visible sub-block rows; use `'-'` for an empty/unset field (the canvas + * shows a dash), or a representative value where the field has a default. + * - `branches` render one output handle per entry (Condition's if/else-if/else, Router's + * routes); when set, also set `hideSourceHandle: true` so the single output is replaced. + * - `showError: true` adds the bottom `Error` row + red handle (action blocks, not triggers). + * - `hideTargetHandle: true` for triggers (entry points — no input). + * - `bgColor` is the resolved hex; the Agent uses Sim green `#33C482` (`var(--brand)`). + */ +export interface BlockDisplaySpec { + name: string + /** Block type — drives the header icon (see `BLOCK_ICONS`). */ + type: string + /** Resolved brand color (hex). */ + bgColor: string + rows: Array<{ title: string; value: string }> + branches?: string[] + showError?: boolean + hideTargetHandle?: boolean + hideSourceHandle?: boolean +} + +/** + * Display specs for the block reference previews — one per block, edited to match exactly + * what the builder canvas shows. Source of truth for the `` heroes. + */ + +export const BLOCK_DISPLAY_SPECS: Record = { + agent: { + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + showError: true, + rows: [ + { title: 'Messages', value: '-' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Files', value: '-' }, + { title: 'Tools', value: '-' }, + { title: 'Skills', value: '-' }, + { title: 'Memory', value: 'None' }, + { title: 'Response Format', value: '-' }, + ], + }, + api: { + name: 'API', + type: 'api', + bgColor: '#2F55FF', + showError: true, + rows: [ + { title: 'URL', value: '-' }, + { title: 'Method', value: 'GET' }, + { title: 'Query Params', value: '-' }, + { title: 'Headers', value: '-' }, + { title: 'Body', value: '-' }, + ], + }, + condition: { + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + showError: true, + hideSourceHandle: true, + rows: [], + branches: ['if', 'else if', 'else'], + }, + credential: { + name: 'Credential', + type: 'credential', + bgColor: '#6366F1', + showError: true, + rows: [ + { title: 'Operation', value: 'Select Credential' }, + { title: 'Credential', value: '-' }, + ], + }, + evaluator: { + name: 'Evaluator', + type: 'evaluator', + bgColor: '#4D5FFF', + showError: true, + rows: [ + { title: 'Evaluation Metrics', value: '-' }, + { title: 'Content', value: '-' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + ], + }, + function: { + name: 'Function', + type: 'function', + bgColor: '#FF402F', + showError: true, + rows: [ + { title: 'Language', value: 'JavaScript' }, + { title: 'Code', value: '-' }, + ], + }, + guardrails: { + name: 'Guardrails', + type: 'guardrails', + bgColor: '#3D642D', + showError: true, + rows: [ + { title: 'Content to Validate', value: '-' }, + { title: 'Validation Type', value: 'Valid JSON' }, + ], + }, + response: { + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + showError: true, + hideSourceHandle: true, + rows: [ + { title: 'Response Data Mode', value: 'Builder' }, + { title: 'Response Structure', value: '-' }, + { title: 'Status Code', value: '-' }, + { title: 'Response Headers', value: '-' }, + ], + }, + router: { + name: 'Router', + type: 'router', + bgColor: '#28C43F', + showError: true, + hideSourceHandle: true, + rows: [{ title: 'Context', value: '-' }], + branches: ['route 1'], + }, + variables: { + name: 'Variables', + type: 'variables', + bgColor: '#8B5CF6', + showError: true, + rows: [{ title: 'Variable Assignments', value: '-' }], + }, + wait: { + name: 'Wait', + type: 'wait', + bgColor: '#F59E0B', + showError: true, + rows: [ + { title: 'Wait Amount', value: '-' }, + { title: 'Unit', value: 'Seconds' }, + ], + }, + webhook: { + name: 'Webhook', + type: 'webhook', + bgColor: '#10B981', + showError: true, + rows: [ + { title: 'Webhook URL', value: '-' }, + { title: 'Payload', value: '-' }, + { title: 'Signing Secret', value: '-' }, + { title: 'Additional Headers', value: '-' }, + ], + }, + workflow: { + name: 'Workflow', + type: 'workflow', + bgColor: '#6366F1', + showError: true, + rows: [ + { title: 'Select Workflow', value: '-' }, + { title: 'Input Variable', value: '-' }, + ], + }, + human_in_the_loop: { + name: 'Human in the Loop', + type: 'human_in_the_loop', + bgColor: '#10B981', + showError: true, + rows: [ + { title: 'Display Data', value: '-' }, + { title: 'Notification', value: '-' }, + { title: 'Resume Form', value: '-' }, + ], + }, + schedule: { + name: 'Schedule', + type: 'schedule', + bgColor: '#6366F1', + hideTargetHandle: true, + rows: [ + { title: 'Run frequency', value: 'Every X Minutes' }, + { title: 'Interval (minutes)', value: '-' }, + ], + }, + rss: { + name: 'RSS Feed', + type: 'rss', + bgColor: '#F97316', + hideTargetHandle: true, + rows: [{ title: 'Feed URL', value: '-' }], + }, + webhook_trigger: { + name: 'Webhook', + type: 'webhook', + bgColor: '#10B981', + hideTargetHandle: true, + rows: [ + { title: 'Webhook URL', value: '-' }, + { title: 'Require Authentication', value: '-' }, + { title: 'Input Format', value: '-' }, + ], + }, + table: { + name: 'Table', + type: 'table', + bgColor: '#10B981', + hideTargetHandle: true, + rows: [ + { title: 'Table', value: '-' }, + { title: 'Event type', value: 'Row updated' }, + { title: 'Watch columns', value: '-' }, + ], + }, +} diff --git a/apps/docs/components/workflow-preview/block-icons.tsx b/apps/docs/components/workflow-preview/block-icons.tsx new file mode 100644 index 00000000000..94bbfbd0352 --- /dev/null +++ b/apps/docs/components/workflow-preview/block-icons.tsx @@ -0,0 +1,103 @@ +import type { SVGProps } from 'react' +import { Clock, Database, Layers, Repeat, Table } from 'lucide-react' +import { + ApiIcon, + ChartBarIcon, + CodeIcon, + ConditionalIcon, + ConnectIcon, + CredentialIcon, + HumanInTheLoopIcon, + ResponseIcon, + RssIcon, + ScheduleIcon, + ShieldCheckIcon, + VariableIcon, + WebhookIcon, + WorkflowIcon, +} from '@/components/icons' + +/** + * The two Sim-specific block glyphs we need, ported verbatim from + * `apps/sim/components/icons.tsx` so the preview matches the real builder. + * Other block types fall back to lucide-react stand-ins for now. + */ +export function StartIcon(props: SVGProps) { + return ( + + + + ) +} + +export function AgentIcon(props: SVGProps) { + return ( + + + + + + ) +} + +/** Block type → glyph. Brand glyphs from the app for core blocks; lucide stand-ins for the rest. */ +export const BLOCK_ICONS: Record> = { + starter: StartIcon, + start_trigger: StartIcon, + agent: AgentIcon, + api: ApiIcon, + condition: ConditionalIcon, + credential: CredentialIcon, + evaluator: ChartBarIcon, + function: CodeIcon, + guardrails: ShieldCheckIcon, + human_in_the_loop: HumanInTheLoopIcon, + response: ResponseIcon, + router: ConnectIcon, + variables: VariableIcon, + wait: Clock, + webhook: WebhookIcon, + workflow: WorkflowIcon, + schedule: ScheduleIcon, + rss: RssIcon, + loop: Repeat, + parallel: Layers, + knowledge_base: Database, + knowledge: Database, + table: Table, +} diff --git a/apps/docs/components/workflow-preview/block-inspector.tsx b/apps/docs/components/workflow-preview/block-inspector.tsx new file mode 100644 index 00000000000..55bdd3417e2 --- /dev/null +++ b/apps/docs/components/workflow-preview/block-inspector.tsx @@ -0,0 +1,227 @@ +'use client' + +import { BookOpen, ChevronDown, ChevronRight, Pencil } from 'lucide-react' +import { blockTypeToIconMap } from '@/components/ui/icon-mapping' +import { BLOCK_ICONS } from '@/components/workflow-preview/block-icons' + +type FieldKind = 'select' | 'input' | 'textarea' | 'code' | 'slider' | 'toggle' + +interface InspectorField { + label: string + required?: boolean + kind?: FieldKind + /** Shown inside the control. For 'toggle', "on"/"off". For 'slider', the number. */ + value?: string + /** Muted placeholder when there's no value. */ + placeholder?: string + /** Slider fill, 0–100. */ + percent?: number +} + +interface InspectorConnection { + name: string + type?: string + color?: string +} + +interface InspectorTool { + type: string + name: string + bgColor: string +} + +interface BlockInspectorProps { + /** Block name in the header, e.g. "Agent 1". */ + name: string + /** Block type, for the header icon. */ + type?: string + color?: string + fields: InspectorField[] + tools?: InspectorTool[] + connections?: InspectorConnection[] + /** Render as a borderless panel filling its parent (the lightbox sidebar). */ + embedded?: boolean +} + +function resolveIcon(type: string) { + return BLOCK_ICONS[type] ?? blockTypeToIconMap[type] ?? null +} + +const CONTROL = + 'flex w-full items-center justify-between gap-2 rounded-[10px] bg-[#262626] px-3 py-2.5 text-[13px]' + +function FieldControl({ field }: { field: InspectorField }) { + const kind = field.kind ?? 'input' + const hasValue = field.value !== undefined && field.value !== '' + const textColor = hasValue ? '#e6e6e6' : '#7a7a7a' + const text = hasValue ? field.value : (field.placeholder ?? '—') + + if (kind === 'textarea' || kind === 'code') { + return ( +
+ {text} +
+ ) + } + + if (kind === 'toggle') { + const on = field.value === 'on' + return ( +
+
+
+
+ {on ? 'On' : 'Off'} +
+ ) + } + + if (kind === 'slider') { + const percent = field.percent ?? 50 + return ( +
+
+
+
+
+ {field.value} +
+ ) + } + + return ( +
+ + {text} + + {kind === 'select' && } +
+ ) +} + +/** + * A read-only facsimile of the editor's right-hand block inspector: the block + * header, its configuration fields as static controls, and its connections. + * Hand-authored per usage, like {@link WorkflowPreview} examples. + */ +export function BlockInspector({ + name, + type = 'agent', + color = '#33C482', + fields, + tools, + connections, + embedded = false, +}: BlockInspectorProps) { + const Icon = resolveIcon(type) + + return ( +
+
+
+ {Icon && } +
+ {name} + + + + +
+ +
+ {fields.map((field, i) => ( +
0 ? { borderTop: '1px dashed #333333' } : undefined} + > + + {field.label} + {field.required && *} + + +
+ ))} + + {tools && tools.length > 0 && ( +
0 ? { borderTop: '1px dashed #333333' } : undefined} + > + Tools +
+ {tools.map((tool) => { + const TIcon = resolveIcon(tool.type) + return ( +
+
+ {TIcon && } +
+ {tool.name} +
+ ) + })} +
+
+ )} +
+ + {connections && connections.length > 0 && ( +
+
+ + Connections +
+ {connections.map((c) => { + const CIcon = c.type ? resolveIcon(c.type) : null + return ( +
+
+ {CIcon && } +
+ {c.name} + +
+ ) + })} +
+ )} +
+ ) +} diff --git a/apps/docs/components/workflow-preview/block-preview.tsx b/apps/docs/components/workflow-preview/block-preview.tsx new file mode 100644 index 00000000000..c28697190a0 --- /dev/null +++ b/apps/docs/components/workflow-preview/block-preview.tsx @@ -0,0 +1,107 @@ +'use client' + +import { + BLOCK_DISPLAY_SPECS, + type BlockDisplaySpec, +} from '@/components/workflow-preview/block-display-specs' +import { BLOCK_ICONS } from '@/components/workflow-preview/block-icons' + +/** Display scale for the hero — bump this one number to resize. */ +const SCALE = 1.3 + +const DOT = '-translate-y-1/2 absolute top-1/2 h-5 w-[7px]' +const HEADER_DOT = '-translate-y-1/2 absolute top-[20px] h-5 w-[7px]' + +/** + * Static, app-styled block card — the same visual as the canvas WorkflowBlock, but + * with non-interactive decorative handles (no ReactFlow, so it can't be panned/dragged). + */ +function BlockCard({ spec }: { spec: BlockDisplaySpec }) { + const Icon = BLOCK_ICONS[spec.type] + const branches = spec.branches ?? [] + const hasContent = spec.rows.length > 0 || branches.length > 0 || Boolean(spec.showError) + + return ( +
+ {!spec.hideTargetHandle && ( + + )} + {!spec.hideSourceHandle && ( + + )} + +
+
+
+ {Icon && } +
+ {spec.name} +
+
+ + {hasContent && ( +
+ {spec.rows.map((row) => ( +
+ + {row.title} + + {row.value && ( + + {row.value} + + )} +
+ ))} + + {branches.map((branch) => ( +
+ + {branch} + + - + +
+ ))} + + {spec.showError && ( +
+ + error + + +
+ )} +
+ )} +
+ ) +} + +interface BlockPreviewProps { + /** Block key from {@link BLOCK_DISPLAY_SPECS} (e.g. `agent`, `condition`, `webhook_trigger`). */ + type: string +} + +/** + * Renders a single block exactly as it appears on the builder canvas, from its + * hand-authored display spec — static (no canvas) and scaled up. Use as the hero on a + * block reference page: ``. Edit specs in `block-display-specs.ts`. + */ +export function BlockPreview({ type }: BlockPreviewProps) { + const spec = BLOCK_DISPLAY_SPECS[type] + if (!spec) return null + + return ( +
+
+ +
+
+ ) +} diff --git a/apps/docs/components/workflow-preview/examples.ts b/apps/docs/components/workflow-preview/examples.ts new file mode 100644 index 00000000000..ac9fa588f68 --- /dev/null +++ b/apps/docs/components/workflow-preview/examples.ts @@ -0,0 +1,1692 @@ +import type { PreviewWorkflow } from '@/components/workflow-preview/workflow-data' + +/** + * The running example used across the Workflows overview: a workflow that takes + * an incoming customer message, classifies its category and urgency, and returns + * the result. Colors match the real Start / Agent / Response blocks. + */ +export const CLASSIFY_WORKFLOW: PreviewWorkflow = { + id: 'classify-message', + name: 'Classify customer message', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Customer message' }], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 340, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Classify ' }, + ], + }, + ], + edges: [{ id: 'start-agent', source: 'start', target: 'agent' }], +} + +/** + * A three-block chain used on the Data flow page: the message is classified, then + * a reply is drafted from that classification. Shows values moving forward along + * the chain (Reply reads Classify's output; Classify reads the Start input). + */ +export const CLASSIFY_REPLY_WORKFLOW: PreviewWorkflow = { + id: 'classify-reply', + name: 'Classify and reply', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Customer message' }], + }, + { + id: 'classify', + name: 'Classify', + type: 'agent', + bgColor: '#33C482', + position: { x: 330, y: 0 }, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Classify ' }, + ], + }, + { + id: 'reply', + name: 'Reply', + type: 'agent', + bgColor: '#33C482', + position: { x: 660, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Draft a reply for ' }, + ], + }, + ], + edges: [ + { id: 'start-classify', source: 'start', target: 'classify' }, + { id: 'classify-reply', source: 'classify', target: 'reply' }, + ], +} + +/** + * A support workflow used on the "Using a knowledge base" page: a question is + * searched against a knowledge base, and an Agent answers from the matches. + */ +export const SUPPORT_KB_WORKFLOW: PreviewWorkflow = { + id: 'support-kb', + name: 'Answer from docs', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Customer question' }], + }, + { + id: 'knowledge', + name: 'Knowledge', + type: 'knowledge', + bgColor: '#00B0B0', + position: { x: 330, y: 0 }, + rows: [ + { title: 'Operation', value: 'Search' }, + { title: 'Query', value: '' }, + ], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 660, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Answer from ' }, + ], + }, + ], + edges: [ + { id: 'start-knowledge', source: 'start', target: 'knowledge' }, + { id: 'knowledge-agent', source: 'knowledge', target: 'agent' }, + ], +} + +/** + * The lead-enrichment chain from the "Using tables in workflows" page: query + * unprocessed rows, classify each with an Agent, write the result back. The + * first Table block is named "Table 1" to match the `` references + * in the prose. + */ +export const TABLE_ENRICH_WORKFLOW: PreviewWorkflow = { + id: 'table-enrich', + name: 'Enrich leads', + blocks: [ + { + id: 'table1', + name: 'Table 1', + type: 'table', + bgColor: '#10B981', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [ + { title: 'Operation', value: 'Query Rows' }, + { title: 'Filter', value: 'status = unprocessed' }, + ], + }, + { + id: 'classify', + name: 'Classify', + type: 'agent', + bgColor: '#33C482', + position: { x: 330, y: 0 }, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Classify each lead' }, + ], + }, + { + id: 'table2', + name: 'Table 2', + type: 'table', + bgColor: '#10B981', + position: { x: 660, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Operation', value: 'Update Rows' }, + { title: 'Set', value: 'status = qualified' }, + ], + }, + ], + edges: [ + { id: 'table1-classify', source: 'table1', target: 'classify' }, + { id: 'classify-table2', source: 'classify', target: 'table2' }, + ], +} + +/** + * The example on the API block page: fetch data over HTTP, then summarize the + * response with an Agent. + */ +export const API_FETCH_WORKFLOW: PreviewWorkflow = { + id: 'api-fetch', + name: 'Fetch and summarize', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'City' }], + }, + { + id: 'api', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 330, y: 0 }, + rows: [ + { title: 'Method', value: 'GET' }, + { title: 'URL', value: 'api.weather.com/' }, + ], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 660, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Model', value: 'claude-sonnet-4-6' }, + { title: 'Messages', value: 'Summarize ' }, + ], + }, + ], + edges: [ + { id: 'start-api', source: 'start', target: 'api' }, + { id: 'api-agent', source: 'api', target: 'agent' }, + ], +} + +/** + * The example on the Condition block page: route a ticket to a different path + * based on its priority. + */ +export const CONDITION_ROUTE_WORKFLOW: PreviewWorkflow = { + id: 'condition-route', + name: 'Route by priority', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 60 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Ticket' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 330, y: 60 }, + rows: [{ title: 'If', value: " === 'high'" }], + }, + { + id: 'escalate', + name: 'Escalate', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Escalate this ticket' }], + }, + { + id: 'reply', + name: 'Reply', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 130 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Draft a standard reply' }], + }, + ], + edges: [ + { id: 'start-condition', source: 'start', target: 'condition' }, + { id: 'condition-escalate', source: 'condition', target: 'escalate' }, + { id: 'condition-reply', source: 'condition', target: 'reply' }, + ], +} + +/** Condition example: gate publishing on a moderation score. */ +export const CONDITION_MODERATE_WORKFLOW: PreviewWorkflow = { + id: 'condition-moderate', + name: 'Moderate content', + blocks: [ + { + id: 'moderate', + name: 'Moderate', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 60 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Score toxicity of ' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 330, y: 60 }, + rows: [{ title: 'If', value: ' > 0.7' }], + }, + { + id: 'block', + name: 'Block', + type: 'function', + bgColor: '#FF402F', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Code', value: "throw 'blocked'" }], + }, + { + id: 'publish', + name: 'Publish', + type: 'api', + bgColor: '#2F55FF', + position: { x: 700, y: 130 }, + hideSourceHandle: true, + rows: [{ title: 'Method', value: 'POST' }], + }, + ], + edges: [ + { id: 'moderate-condition', source: 'moderate', target: 'condition' }, + { id: 'condition-block', source: 'condition', target: 'block' }, + { id: 'condition-publish', source: 'condition', target: 'publish' }, + ], +} + +/** Condition example: branch onboarding on the account tier. */ +export const CONDITION_ONBOARD_WORKFLOW: PreviewWorkflow = { + id: 'condition-onboard', + name: 'Branch onboarding', + blocks: [ + { + id: 'plan', + name: 'Plan', + type: 'function', + bgColor: '#FF402F', + position: { x: 0, y: 60 }, + hideTargetHandle: true, + rows: [{ title: 'Code', value: 'return ' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 330, y: 60 }, + rows: [{ title: 'If', value: " === 'enterprise'" }], + }, + { + id: 'guided', + name: 'Guided setup', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Walk through SSO and SCIM' }], + }, + { + id: 'quickstart', + name: 'Quick start', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 130 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Send the 2-minute setup' }], + }, + ], + edges: [ + { id: 'plan-condition', source: 'plan', target: 'condition' }, + { id: 'condition-guided', source: 'condition', target: 'guided' }, + { id: 'condition-quickstart', source: 'condition', target: 'quickstart' }, + ], +} + +/** Function example: reshape an API response into the field a later block needs. */ +export const FUNCTION_RESHAPE_WORKFLOW: PreviewWorkflow = { + id: 'function-reshape', + name: 'Reshape a response', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'User ID' }], + }, + { + id: 'api', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Method', value: 'GET' }, + { title: 'URL', value: 'api.example.com/users/' }, + ], + }, + { + id: 'extract', + name: 'Extract', + type: 'function', + bgColor: '#FF402F', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Language', value: 'JavaScript' }, + { title: 'Code', value: 'return .profile' }, + ], + }, + ], + edges: [ + { id: 'start-api', source: 'start', target: 'api' }, + { id: 'api-extract', source: 'api', target: 'extract' }, + ], +} + +/** Function example: validate and clean input before writing it. */ +export const FUNCTION_VALIDATE_WORKFLOW: PreviewWorkflow = { + id: 'function-validate', + name: 'Validate before write', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Form' }], + }, + { + id: 'clean', + name: 'Clean', + type: 'function', + bgColor: '#FF402F', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Language', value: 'JavaScript' }, + { title: 'Code', value: 'return sanitize()' }, + ], + }, + { + id: 'save', + name: 'Save', + type: 'api', + bgColor: '#2F55FF', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Method', value: 'POST' }, + { title: 'Body', value: '' }, + ], + }, + ], + edges: [ + { id: 'start-clean', source: 'start', target: 'clean' }, + { id: 'clean-save', source: 'clean', target: 'save' }, + ], +} + +/** Router example: a model triages a ticket to the right team. */ +export const ROUTER_TRIAGE_WORKFLOW: PreviewWorkflow = { + id: 'router-triage', + name: 'Triage a ticket', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 95 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Ticket' }], + }, + { + id: 'router', + name: 'Router', + type: 'router', + bgColor: '#28C43F', + position: { x: 320, y: 95 }, + rows: [ + { title: 'Context', value: '' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + ], + }, + { + id: 'sales', + name: 'Sales', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Answer the pricing question' }], + }, + { + id: 'support', + name: 'Support', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 95 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Help with the issue' }], + }, + { + id: 'billing', + name: 'Billing', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 190 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Resolve the billing question' }], + }, + ], + edges: [ + { id: 'start-router', source: 'start', target: 'router' }, + { id: 'router-sales', source: 'router', target: 'sales' }, + { id: 'router-support', source: 'router', target: 'support' }, + { id: 'router-billing', source: 'router', target: 'billing' }, + ], +} + +/** Response example: return a structured answer from an API-triggered workflow. */ +export const RESPONSE_API_WORKFLOW: PreviewWorkflow = { + id: 'response-api', + name: 'Answer over the API', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Question' }], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 320, y: 0 }, + rows: [{ title: 'Messages', value: 'Answer ' }], + }, + { + id: 'response', + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Data', value: '{ "answer": }' }, + { title: 'Status', value: '200' }, + ], + }, + ], + edges: [ + { id: 'start-agent', source: 'start', target: 'agent' }, + { id: 'agent-response', source: 'agent', target: 'response' }, + ], +} + +/** Router example: classify incoming feedback into the right child workflow. */ +export const ROUTER_CLASSIFY_WORKFLOW: PreviewWorkflow = { + id: 'router-classify', + name: 'Classify feedback', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 50 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Feedback' }], + }, + { + id: 'router', + name: 'Router', + type: 'router', + bgColor: '#28C43F', + position: { x: 320, y: 50 }, + rows: [{ title: 'Context', value: '' }], + }, + { + id: 'product', + name: 'Product', + type: 'workflow', + bgColor: '#6366F1', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Workflow', value: 'product-intake' }], + }, + { + id: 'bug', + name: 'Bug report', + type: 'workflow', + bgColor: '#6366F1', + position: { x: 700, y: 110 }, + hideSourceHandle: true, + rows: [{ title: 'Workflow', value: 'bug-triage' }], + }, + ], + edges: [ + { id: 'start-router', source: 'start', target: 'router' }, + { id: 'router-product', source: 'router', target: 'product' }, + { id: 'router-bug', source: 'router', target: 'bug' }, + ], +} + +/** Router example: qualify a lead into sales or self-serve. */ +export const ROUTER_LEAD_WORKFLOW: PreviewWorkflow = { + id: 'router-lead', + name: 'Qualify a lead', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 50 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Lead' }], + }, + { + id: 'router', + name: 'Router', + type: 'router', + bgColor: '#28C43F', + position: { x: 320, y: 50 }, + rows: [{ title: 'Context', value: '' }], + }, + { + id: 'enterprise', + name: 'Enterprise', + type: 'agent', + bgColor: '#33C482', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Book a sales call' }], + }, + { + id: 'selfserve', + name: 'Self-serve', + type: 'workflow', + bgColor: '#6366F1', + position: { x: 700, y: 110 }, + hideSourceHandle: true, + rows: [{ title: 'Workflow', value: 'onboarding' }], + }, + ], + edges: [ + { id: 'start-router', source: 'start', target: 'router' }, + { id: 'router-enterprise', source: 'router', target: 'enterprise' }, + { id: 'router-selfserve', source: 'router', target: 'selfserve' }, + ], +} + +/** Response example: acknowledge a webhook after processing it. */ +export const RESPONSE_WEBHOOK_WORKFLOW: PreviewWorkflow = { + id: 'response-webhook', + name: 'Acknowledge a webhook', + blocks: [ + { + id: 'webhook', + name: 'Webhook', + type: 'webhook', + bgColor: '#10B981', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Format', value: 'JSON' }], + }, + { + id: 'process', + name: 'Process', + type: 'function', + bgColor: '#FF402F', + position: { x: 320, y: 0 }, + rows: [{ title: 'Code', value: 'save()' }], + }, + { + id: 'ack', + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Data', value: '{ "received": true }' }, + { title: 'Status', value: '200' }, + ], + }, + ], + edges: [ + { id: 'webhook-process', source: 'webhook', target: 'process' }, + { id: 'process-ack', source: 'process', target: 'ack' }, + ], +} + +/** Response example: return a different status on each branch. */ +export const RESPONSE_ERROR_WORKFLOW: PreviewWorkflow = { + id: 'response-error', + name: 'Status per branch', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 60 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Request' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 320, y: 60 }, + rows: [{ title: 'If', value: '' }], + }, + { + id: 'ok', + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Status', value: '200' }], + }, + { + id: 'bad', + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + position: { x: 700, y: 130 }, + hideSourceHandle: true, + rows: [{ title: 'Status', value: '400' }], + }, + ], + edges: [ + { id: 'start-condition', source: 'start', target: 'condition' }, + { id: 'condition-ok', source: 'condition', target: 'ok' }, + { id: 'condition-bad', source: 'condition', target: 'bad' }, + ], +} + +/** Variables example: count retries across attempts. */ +export const VARIABLES_RETRY_WORKFLOW: PreviewWorkflow = { + id: 'variables-retry', + name: 'Count retries', + blocks: [ + { + id: 'api', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Method', value: 'GET' }], + }, + { + id: 'vars', + name: 'Variables', + type: 'variables', + bgColor: '#8B5CF6', + position: { x: 320, y: 0 }, + rows: [{ title: 'Set', value: 'retryCount + 1' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'If', value: ' < 3' }], + }, + ], + edges: [ + { id: 'api-vars', source: 'api', target: 'vars' }, + { id: 'vars-condition', source: 'vars', target: 'condition' }, + ], +} + +/** Variables example: hold fetched config for the rest of the run. */ +export const VARIABLES_CONFIG_WORKFLOW: PreviewWorkflow = { + id: 'variables-config', + name: 'Hold config', + blocks: [ + { + id: 'api', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'URL', value: 'api.example.com/profile' }], + }, + { + id: 'vars', + name: 'Variables', + type: 'variables', + bgColor: '#8B5CF6', + position: { x: 320, y: 0 }, + rows: [{ title: 'Set', value: 'userId, userTier' }], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Personalize for ' }], + }, + ], + edges: [ + { id: 'api-vars', source: 'api', target: 'vars' }, + { id: 'vars-agent', source: 'vars', target: 'agent' }, + ], +} + +/** Wait example: space out two API calls to respect a rate limit. */ +export const WAIT_RATELIMIT_WORKFLOW: PreviewWorkflow = { + id: 'wait-ratelimit', + name: 'Space out calls', + blocks: [ + { + id: 'first', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Method', value: 'GET' }], + }, + { + id: 'wait', + name: 'Wait', + type: 'wait', + bgColor: '#F59E0B', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Amount', value: '2' }, + { title: 'Unit', value: 'Seconds' }, + ], + }, + { + id: 'second', + name: 'API', + type: 'api', + bgColor: '#2F55FF', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Method', value: 'GET' }], + }, + ], + edges: [ + { id: 'first-wait', source: 'first', target: 'wait' }, + { id: 'wait-second', source: 'wait', target: 'second' }, + ], +} + +/** Wait example: send a follow-up after a delay. */ +export const WAIT_FOLLOWUP_WORKFLOW: PreviewWorkflow = { + id: 'wait-followup', + name: 'Delayed follow-up', + blocks: [ + { + id: 'send', + name: 'Send', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Send the welcome email' }], + }, + { + id: 'wait', + name: 'Wait', + type: 'wait', + bgColor: '#F59E0B', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Amount', value: '2' }, + { title: 'Unit', value: 'Days' }, + ], + }, + { + id: 'followup', + name: 'Follow up', + type: 'agent', + bgColor: '#33C482', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Send a check-in' }], + }, + ], + edges: [ + { id: 'send-wait', source: 'send', target: 'wait' }, + { id: 'wait-followup', source: 'wait', target: 'followup' }, + ], +} + +/** Evaluator example: gate a draft on a quality score before it ships. */ +export const EVALUATOR_GATE_WORKFLOW: PreviewWorkflow = { + id: 'evaluator-gate', + name: 'Gate on a score', + blocks: [ + { + id: 'draft', + name: 'Draft', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Write the announcement' }], + }, + { + id: 'evaluator', + name: 'Evaluator', + type: 'evaluator', + bgColor: '#4D5FFF', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Metrics', value: 'Accuracy, Clarity' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + ], + }, + { + id: 'gate', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'If', value: ' >= 4' }], + }, + ], + edges: [ + { id: 'draft-evaluator', source: 'draft', target: 'evaluator' }, + { id: 'evaluator-gate', source: 'evaluator', target: 'gate' }, + ], +} + +/** Credential example: select one Google account and reuse it across blocks. */ +export const CREDENTIAL_SHARE_WORKFLOW: PreviewWorkflow = { + id: 'credential-share', + name: 'Share a credential', + blocks: [ + { + id: 'credential', + name: 'Credential', + type: 'credential', + bgColor: '#6366F1', + position: { x: 0, y: 100 }, + hideTargetHandle: true, + rows: [ + { title: 'Operation', value: 'Select Credential' }, + { title: 'Account', value: 'Google' }, + ], + }, + { + id: 'gmail', + name: 'Gmail', + type: 'gmail', + bgColor: '#FFFFFF', + position: { x: 380, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Account', value: '' }], + }, + { + id: 'drive', + name: 'Drive', + type: 'google_drive', + bgColor: '#FFFFFF', + position: { x: 380, y: 100 }, + hideSourceHandle: true, + rows: [{ title: 'Account', value: '' }], + }, + { + id: 'calendar', + name: 'Calendar', + type: 'google_calendar', + bgColor: '#FFFFFF', + position: { x: 380, y: 200 }, + hideSourceHandle: true, + rows: [{ title: 'Account', value: '' }], + }, + ], + edges: [ + { id: 'credential-gmail', source: 'credential', target: 'gmail' }, + { id: 'credential-drive', source: 'credential', target: 'drive' }, + { id: 'credential-calendar', source: 'credential', target: 'calendar' }, + ], +} + +/** Credential example: pick a production or staging account at runtime. */ +export const CREDENTIAL_ROUTE_WORKFLOW: PreviewWorkflow = { + id: 'credential-route', + name: 'Route to an account', + blocks: [ + { + id: 'pick', + name: 'Pick account', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 60 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Production or staging?' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 330, y: 60 }, + rows: [{ title: 'If', value: " === 'prod'" }], + }, + { + id: 'prod', + name: 'Credential', + type: 'credential', + bgColor: '#6366F1', + position: { x: 700, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Account', value: 'Prod Slack' }], + }, + { + id: 'staging', + name: 'Credential', + type: 'credential', + bgColor: '#6366F1', + position: { x: 700, y: 130 }, + hideSourceHandle: true, + rows: [{ title: 'Account', value: 'Staging Slack' }], + }, + ], + edges: [ + { id: 'pick-condition', source: 'pick', target: 'condition' }, + { id: 'condition-prod', source: 'condition', target: 'prod' }, + { id: 'condition-staging', source: 'condition', target: 'staging' }, + ], +} + +const GUARDRAILS_START = { + id: 'start', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, +} as const + +const GUARDRAILS_GATE = { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 640, y: 0 }, + hideSourceHandle: true, +} as const + +/** Guardrails example: validate JSON before parsing it. */ +export const GUARDRAILS_JSON_WORKFLOW: PreviewWorkflow = { + id: 'guardrails-json', + name: 'Validate JSON', + blocks: [ + { ...GUARDRAILS_START, rows: [{ title: 'Messages', value: 'Return JSON' }] }, + { + id: 'guardrails', + name: 'Guardrails', + type: 'guardrails', + bgColor: '#3D642D', + position: { x: 320, y: 0 }, + rows: [{ title: 'Validation', value: 'Valid JSON' }], + }, + { ...GUARDRAILS_GATE, rows: [{ title: 'If', value: '' }] }, + ], + edges: [ + { id: 'start-guardrails', source: 'start', target: 'guardrails' }, + { id: 'guardrails-condition', source: 'guardrails', target: 'condition' }, + ], +} + +/** Guardrails example: check an answer is grounded in the knowledge base. */ +export const GUARDRAILS_HALLUCINATION_WORKFLOW: PreviewWorkflow = { + id: 'guardrails-hallucination', + name: 'Check grounding', + blocks: [ + { ...GUARDRAILS_START, rows: [{ title: 'Messages', value: 'Answer from the docs' }] }, + { + id: 'guardrails', + name: 'Guardrails', + type: 'guardrails', + bgColor: '#3D642D', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Validation', value: 'Hallucination' }, + { title: 'Knowledge Base', value: 'docs' }, + ], + }, + { ...GUARDRAILS_GATE, rows: [{ title: 'If', value: ' >= 3' }] }, + ], + edges: [ + { id: 'start-guardrails', source: 'start', target: 'guardrails' }, + { id: 'guardrails-condition', source: 'guardrails', target: 'condition' }, + ], +} + +/** Guardrails example: block user input that contains PII. */ +export const GUARDRAILS_PII_WORKFLOW: PreviewWorkflow = { + id: 'guardrails-pii', + name: 'Block PII', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'User message' }], + }, + { + id: 'guardrails', + name: 'Guardrails', + type: 'guardrails', + bgColor: '#3D642D', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Validation', value: 'PII Detection' }, + { title: 'Action', value: 'Block' }, + ], + }, + { ...GUARDRAILS_GATE, rows: [{ title: 'If', value: '' }] }, + ], + edges: [ + { id: 'start-guardrails', source: 'start', target: 'guardrails' }, + { id: 'guardrails-condition', source: 'guardrails', target: 'condition' }, + ], +} + +/** HITL example: a human approves AI content before it ships. */ +export const HITL_APPROVAL_WORKFLOW: PreviewWorkflow = { + id: 'hitl-approval', + name: 'Approve before publish', + blocks: [ + { + id: 'draft', + name: 'Draft', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Write the post' }], + }, + { + id: 'approve', + name: 'Human in the Loop', + type: 'human_in_the_loop', + bgColor: '#10B981', + position: { x: 300, y: 0 }, + rows: [ + { title: 'Display', value: '' }, + { title: 'Resume', value: 'approved' }, + ], + }, + { + id: 'publish', + name: 'Publish', + type: 'api', + bgColor: '#2F55FF', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Method', value: 'POST' }], + }, + ], + edges: [ + { id: 'draft-approve', source: 'draft', target: 'approve' }, + { id: 'approve-publish', source: 'approve', target: 'publish' }, + ], +} + +/** HITL example: chain two approvals for a high-stakes change. */ +export const HITL_MULTISTAGE_WORKFLOW: PreviewWorkflow = { + id: 'hitl-multistage', + name: 'Two-stage approval', + blocks: [ + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Draft the change' }], + }, + { + id: 'manager', + name: 'Manager', + type: 'human_in_the_loop', + bgColor: '#10B981', + position: { x: 280, y: 0 }, + rows: [{ title: 'Resume', value: 'approved' }], + }, + { + id: 'director', + name: 'Director', + type: 'human_in_the_loop', + bgColor: '#10B981', + position: { x: 580, y: 0 }, + rows: [{ title: 'Resume', value: 'approved' }], + }, + { + id: 'execute', + name: 'Execute', + type: 'function', + bgColor: '#FF402F', + position: { x: 880, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Code', value: 'apply()' }], + }, + ], + edges: [ + { id: 'agent-manager', source: 'agent', target: 'manager' }, + { id: 'manager-director', source: 'manager', target: 'director' }, + { id: 'director-execute', source: 'director', target: 'execute' }, + ], +} + +/** HITL example: a human verifies extracted data before processing. */ +export const HITL_VALIDATE_WORKFLOW: PreviewWorkflow = { + id: 'hitl-validate', + name: 'Verify before processing', + blocks: [ + { + id: 'extract', + name: 'Extract', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Extract the fields' }], + }, + { + id: 'validate', + name: 'Human in the Loop', + type: 'human_in_the_loop', + bgColor: '#10B981', + position: { x: 300, y: 0 }, + rows: [{ title: 'Display', value: '' }], + }, + { + id: 'process', + name: 'Process', + type: 'function', + bgColor: '#FF402F', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Code', value: 'process()' }], + }, + ], + edges: [ + { id: 'extract-validate', source: 'extract', target: 'validate' }, + { id: 'validate-process', source: 'validate', target: 'process' }, + ], +} + +/** Webhook example: post a formatted result to an external endpoint. */ +export const WEBHOOK_NOTIFY_WORKFLOW: PreviewWorkflow = { + id: 'webhook-notify', + name: 'Notify a service', + blocks: [ + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Messages', value: 'Summarize the run' }], + }, + { + id: 'format', + name: 'Format', + type: 'function', + bgColor: '#FF402F', + position: { x: 320, y: 0 }, + rows: [{ title: 'Code', value: 'toSlackBlocks()' }], + }, + { + id: 'webhook', + name: 'Webhook', + type: 'webhook', + bgColor: '#10B981', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'URL', value: 'hooks.slack.com/…' }], + }, + ], + edges: [ + { id: 'agent-format', source: 'agent', target: 'format' }, + { id: 'format-webhook', source: 'format', target: 'webhook' }, + ], +} + +/** Webhook example: fire an external process when a check passes. */ +export const WEBHOOK_TRIGGER_WORKFLOW: PreviewWorkflow = { + id: 'webhook-trigger', + name: 'Trigger on a check', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Event' }], + }, + { + id: 'condition', + name: 'Condition', + type: 'condition', + bgColor: '#FF752F', + position: { x: 320, y: 0 }, + rows: [{ title: 'If', value: " === 'done'" }], + }, + { + id: 'webhook', + name: 'Webhook', + type: 'webhook', + bgColor: '#10B981', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'URL', value: 'api.partner.com/hook' }], + }, + ], + edges: [ + { id: 'start-condition', source: 'start', target: 'condition' }, + { id: 'condition-webhook', source: 'condition', target: 'webhook' }, + ], +} + +/** Workflow-block example: call a child workflow and use its result. */ +export const WORKFLOW_CALL_WORKFLOW: PreviewWorkflow = { + id: 'workflow-call', + name: 'Call a child workflow', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Lead' }], + }, + { + id: 'child', + name: 'Workflow', + type: 'workflow', + bgColor: '#6366F1', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Workflow', value: 'enrich-lead' }, + { title: 'Input', value: '' }, + ], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 640, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Summarize ' }], + }, + ], + edges: [ + { id: 'start-child', source: 'start', target: 'child' }, + { id: 'child-agent', source: 'child', target: 'agent' }, + ], +} + +/** Loop example: run a block once per item, then use the collected results. */ +export const LOOP_WORKFLOW: PreviewWorkflow = { + id: 'loop-foreach', + name: 'Score each review', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 95 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Reviews' }], + }, + { + id: 'loop', + name: 'Loop', + type: 'loop', + bgColor: '#FAFAF9', + position: { x: 340, y: 30 }, + size: { width: 430, height: 170 }, + rows: [], + }, + { + id: 'score', + name: 'Score', + type: 'agent', + bgColor: '#33C482', + position: { x: 150, y: 62 }, + parentId: 'loop', + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Rate ' }], + }, + { + id: 'summary', + name: 'Summary', + type: 'agent', + bgColor: '#33C482', + position: { x: 860, y: 95 }, + hideSourceHandle: true, + rows: [{ title: 'Messages', value: 'Summarize ' }], + }, + ], + edges: [ + { id: 'start-loop', source: 'start', target: 'loop' }, + { id: 'loop-score', source: 'loop', target: 'score', sourceHandle: 'loop-start-source' }, + { id: 'loop-summary', source: 'loop', target: 'summary' }, + ], +} + +/** Parallel example: process every item concurrently, then aggregate the results. */ +export const PARALLEL_WORKFLOW: PreviewWorkflow = { + id: 'parallel-collection', + name: 'Process tasks in parallel', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 95 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Tasks' }], + }, + { + id: 'parallel', + name: 'Parallel', + type: 'parallel', + bgColor: '#1D1C1A', + position: { x: 340, y: 30 }, + size: { width: 430, height: 170 }, + rows: [], + }, + { + id: 'call', + name: 'Call', + type: 'api', + bgColor: '#2F55FF', + position: { x: 150, y: 62 }, + parentId: 'parallel', + hideSourceHandle: true, + rows: [{ title: 'URL', value: '/tasks/' }], + }, + { + id: 'aggregate', + name: 'Aggregate', + type: 'function', + bgColor: '#FF402F', + position: { x: 860, y: 95 }, + hideSourceHandle: true, + rows: [{ title: 'Code', value: 'merge()' }], + }, + ], + edges: [ + { id: 'start-parallel', source: 'start', target: 'parallel' }, + { id: 'parallel-call', source: 'parallel', target: 'call', sourceHandle: 'loop-start-source' }, + { id: 'parallel-aggregate', source: 'parallel', target: 'aggregate' }, + ], +} + +/** Building-agents overview: a minimal agent — the Agent block as the reasoning core. */ +export const BUILD_AGENT_WORKFLOW: PreviewWorkflow = { + id: 'build-agent', + name: 'A minimal agent', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Lead' }], + }, + { + id: 'agent', + name: 'Score lead', + type: 'agent', + bgColor: '#33C482', + position: { x: 320, y: 0 }, + rows: [ + { title: 'Messages', value: 'Score ' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + ], + tools: [ + { type: 'knowledge', name: 'Knowledge', bgColor: '#00B0B0' }, + { type: 'hubspot', name: 'HubSpot', bgColor: '#FF7A59' }, + ], + }, + { + id: 'response', + name: 'Response', + type: 'response', + bgColor: '#2F55FF', + position: { x: 680, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Data', value: '{ "score": }' }], + }, + ], + edges: [ + { id: 'start-agent', source: 'start', target: 'agent' }, + { id: 'agent-response', source: 'agent', target: 'response' }, + ], +} + +/** Files guide: read a file, summarize it, save the summary as a new file. */ +export const FILE_SUMMARY_WORKFLOW: PreviewWorkflow = { + id: 'file-summary', + name: 'Summarize a file', + blocks: [ + { + id: 'file', + name: 'File', + type: 'file', + bgColor: '#40916C', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [ + { title: 'Operation', value: 'Read' }, + { title: 'File', value: 'report.pdf' }, + ], + }, + { + id: 'agent', + name: 'Agent', + type: 'agent', + bgColor: '#33C482', + position: { x: 320, y: 0 }, + rows: [{ title: 'Messages', value: 'Summarize ' }], + }, + { + id: 'write', + name: 'File', + type: 'file', + bgColor: '#40916C', + position: { x: 660, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Operation', value: 'Write' }, + { title: 'File Name', value: 'summary.md' }, + ], + }, + ], + edges: [ + { id: 'file-agent', source: 'file', target: 'agent' }, + { id: 'agent-write', source: 'agent', target: 'write' }, + ], +} + +/** Tables guide: query rows, classify them, write the results back. */ +export const TABLE_ROUNDTRIP_WORKFLOW: PreviewWorkflow = { + id: 'table-roundtrip', + name: 'Classify and write back', + blocks: [ + { + id: 'query', + name: 'Table', + type: 'table', + bgColor: '#10B981', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [ + { title: 'Operation', value: 'Query Rows' }, + { title: 'Filter', value: "status = 'unprocessed'" }, + ], + }, + { + id: 'classify', + name: 'Classify', + type: 'agent', + bgColor: '#33C482', + position: { x: 340, y: 0 }, + rows: [{ title: 'Messages', value: 'Classify ' }], + }, + { + id: 'update', + name: 'Table', + type: 'table', + bgColor: '#10B981', + position: { x: 680, y: 0 }, + hideSourceHandle: true, + rows: [ + { title: 'Operation', value: 'Update Rows' }, + { title: 'Set', value: "category, status = 'qualified'" }, + ], + }, + ], + edges: [ + { id: 'query-classify', source: 'query', target: 'classify' }, + { id: 'classify-update', source: 'classify', target: 'update' }, + ], +} + +/** + * The running example of the choosing guide: a lead scorer combining a + * workflow-as-tool (enrich), a deterministic Function, an Agent with tools, + * and a deterministic Google Sheets append. + */ +export const LEAD_SCORER_WORKFLOW: PreviewWorkflow = { + id: 'lead-scorer', + name: 'Lead scorer', + blocks: [ + { + id: 'start', + name: 'Start', + type: 'start_trigger', + bgColor: '#2FB3FF', + position: { x: 0, y: 0 }, + hideTargetHandle: true, + rows: [{ title: 'Input', value: 'Lead' }], + }, + { + id: 'enrich', + name: 'Enrich', + type: 'workflow', + bgColor: '#6366F1', + position: { x: 290, y: 0 }, + rows: [{ title: 'Workflow', value: 'enrich-lead' }], + }, + { + id: 'reshape', + name: 'Reshape', + type: 'function', + bgColor: '#FF402F', + position: { x: 580, y: 0 }, + rows: [{ title: 'Code', value: 'return fields()' }], + }, + { + id: 'score', + name: 'Score lead', + type: 'agent', + bgColor: '#33C482', + position: { x: 870, y: 0 }, + rows: [ + { title: 'Messages', value: 'Score ' }, + { title: 'Model', value: 'claude-sonnet-4-6' }, + ], + tools: [ + { type: 'exa', name: 'Search', bgColor: '#1F40ED' }, + { type: 'gmail', name: 'Send Email', bgColor: '#E0E0E0' }, + { type: 'hubspot', name: 'CRM', bgColor: '#FF7A59' }, + ], + }, + { + id: 'log', + name: 'Log', + type: 'google_sheets', + bgColor: '#FFFFFF', + position: { x: 1200, y: 0 }, + hideSourceHandle: true, + rows: [{ title: 'Operation', value: 'Append' }], + }, + ], + edges: [ + { id: 'start-enrich', source: 'start', target: 'enrich' }, + { id: 'enrich-reshape', source: 'enrich', target: 'reshape' }, + { id: 'reshape-score', source: 'reshape', target: 'score' }, + { id: 'score-log', source: 'score', target: 'log' }, + ], +} diff --git a/apps/docs/components/workflow-preview/index.ts b/apps/docs/components/workflow-preview/index.ts new file mode 100644 index 00000000000..6c35e3738e0 --- /dev/null +++ b/apps/docs/components/workflow-preview/index.ts @@ -0,0 +1,48 @@ +export { BlockPreview } from '@/components/workflow-preview/block-preview' +export { + API_FETCH_WORKFLOW, + BUILD_AGENT_WORKFLOW, + CLASSIFY_REPLY_WORKFLOW, + CLASSIFY_WORKFLOW, + CONDITION_MODERATE_WORKFLOW, + CONDITION_ONBOARD_WORKFLOW, + CONDITION_ROUTE_WORKFLOW, + CREDENTIAL_ROUTE_WORKFLOW, + CREDENTIAL_SHARE_WORKFLOW, + EVALUATOR_GATE_WORKFLOW, + FILE_SUMMARY_WORKFLOW, + FUNCTION_RESHAPE_WORKFLOW, + FUNCTION_VALIDATE_WORKFLOW, + GUARDRAILS_HALLUCINATION_WORKFLOW, + GUARDRAILS_JSON_WORKFLOW, + GUARDRAILS_PII_WORKFLOW, + HITL_APPROVAL_WORKFLOW, + HITL_MULTISTAGE_WORKFLOW, + HITL_VALIDATE_WORKFLOW, + LEAD_SCORER_WORKFLOW, + LOOP_WORKFLOW, + PARALLEL_WORKFLOW, + RESPONSE_API_WORKFLOW, + RESPONSE_ERROR_WORKFLOW, + RESPONSE_WEBHOOK_WORKFLOW, + ROUTER_CLASSIFY_WORKFLOW, + ROUTER_LEAD_WORKFLOW, + ROUTER_TRIAGE_WORKFLOW, + SUPPORT_KB_WORKFLOW, + TABLE_ENRICH_WORKFLOW, + TABLE_ROUNDTRIP_WORKFLOW, + VARIABLES_CONFIG_WORKFLOW, + VARIABLES_RETRY_WORKFLOW, + WAIT_FOLLOWUP_WORKFLOW, + WAIT_RATELIMIT_WORKFLOW, + WEBHOOK_NOTIFY_WORKFLOW, + WEBHOOK_TRIGGER_WORKFLOW, + WORKFLOW_CALL_WORKFLOW, +} from '@/components/workflow-preview/examples' +export { OutputBundle } from '@/components/workflow-preview/output-bundle' +export type { + PreviewBlock, + PreviewTool, + PreviewWorkflow, +} from '@/components/workflow-preview/workflow-data' +export { WorkflowPreview } from '@/components/workflow-preview/workflow-preview' diff --git a/apps/docs/components/workflow-preview/output-bundle.tsx b/apps/docs/components/workflow-preview/output-bundle.tsx new file mode 100644 index 00000000000..07146697efa --- /dev/null +++ b/apps/docs/components/workflow-preview/output-bundle.tsx @@ -0,0 +1,164 @@ +'use client' + +import { ChevronDown, Clipboard, Download, Search } from 'lucide-react' +import { blockTypeToIconMap } from '@/components/ui/icon-mapping' +import { BLOCK_ICONS } from '@/components/workflow-preview/block-icons' + +type ValueType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null' + +/** Dark-theme equivalents of the app's type badges (string=green, number=blue, …). */ +const BADGE_COLORS: Record = { + string: { bg: '#1d3528', text: '#63d489' }, + number: { bg: '#232c4d', text: '#93a8f7' }, + boolean: { bg: '#3a2a16', text: '#f0a35e' }, + array: { bg: '#2e2347', text: '#b794f6' }, + object: { bg: '#2e2e2e', text: '#b3b3b3' }, + null: { bg: '#2e2e2e', text: '#b3b3b3' }, +} + +interface OutputNode { + key: string + type?: ValueType + /** Primitive value shown beneath the key when expanded. */ + value?: string + /** Nested fields for object/array nodes. */ + children?: OutputNode[] + /** Collapse the node (chevron points right, nothing rendered beneath). */ + expanded?: boolean + /** Emphasize this row as the one being read by the tag below. */ + highlight?: boolean +} + +interface LogRow { + name: string + type?: string + color?: string + duration?: string + selected?: boolean +} + +interface OutputBundleProps { + /** The block's name (unique within the workflow), e.g. "classify". */ + blockName: string + blockType?: string + blockColor?: string + /** Duration shown on the selected log row. */ + duration?: string + /** Override the Logs column; defaults to Start + this block (selected). */ + logs?: LogRow[] + values: OutputNode[] +} + +function resolveIcon(type: string) { + return BLOCK_ICONS[type] ?? blockTypeToIconMap[type] ?? null +} + +function TypeBadge({ type }: { type: ValueType }) { + const c = BADGE_COLORS[type] + return ( + + {type} + + ) +} + +function TreeNode({ node, depth = 0 }: { node: OutputNode; depth?: number }) { + const type = node.type ?? 'string' + const expanded = node.expanded ?? Boolean(node.children || node.value !== undefined) + return ( +
+
+ + {node.key} + + + +
+ {expanded && (node.children || node.value !== undefined) && ( +
+ {node.children + ? node.children.map((child) => ( + + )) + : node.value !== undefined && ( +
{node.value}
+ )} +
+ )} +
+ ) +} + +/** + * A miniature of the app's run inspector — the Logs list beside the Output + * panel's typed tree — teaching what a block's output is: named, typed values + * remembered under the block's name, read with a `` tag. + */ +export function OutputBundle({ + blockName, + blockType = 'agent', + blockColor = '#33C482', + duration = '1.2s', + logs, + values, +}: OutputBundleProps) { + const logRows: LogRow[] = logs ?? [ + { name: 'Start', type: 'start_trigger', color: '#2FB3FF', duration: '9ms' }, + { name: blockName, type: blockType, color: blockColor, duration, selected: true }, + ] + + return ( +
+
+
+
Logs
+ {logRows.map((row) => { + const Icon = row.type ? resolveIcon(row.type) : null + return ( +
+
+ {Icon && } +
+ {row.name} + {row.duration && ( + {row.duration} + )} +
+ ) + })} +
+ +
+
+ Output + Input + + + + + + +
+
+ {values.map((node) => ( + + ))} +
+
+
+
+ ) +} diff --git a/apps/docs/components/workflow-preview/preview-block-node.tsx b/apps/docs/components/workflow-preview/preview-block-node.tsx new file mode 100644 index 00000000000..be2746d344b --- /dev/null +++ b/apps/docs/components/workflow-preview/preview-block-node.tsx @@ -0,0 +1,168 @@ +'use client' + +import { memo } from 'react' +import { domAnimation, LazyMotion, m } from 'framer-motion' +import { Handle, type NodeProps, Position } from 'reactflow' +import { blockTypeToIconMap } from '@/components/ui/icon-mapping' +import { BLOCK_ICONS } from '@/components/workflow-preview/block-icons' +import { + BLOCK_STAGGER, + EASE_OUT, + type PreviewTool, +} from '@/components/workflow-preview/workflow-data' + +/** Core-block glyph first, then the integration icon map so diagrams can show tools too. */ +function resolveIcon(type: string) { + return BLOCK_ICONS[type] ?? blockTypeToIconMap[type] ?? null +} + +interface PreviewBlockData { + name: string + blockType: string + bgColor: string + rows: Array<{ title: string; value: string }> + tools?: PreviewTool[] + hideTargetHandle?: boolean + hideSourceHandle?: boolean + index?: number + animate?: boolean + isHighlighted?: boolean + isDimmed?: boolean +} + +/** + * Handle styling matching the real WorkflowBlock handles. + * --workflow-edge in dark mode: #454545 + */ +const HANDLE_BASE = '!z-[10] !border-none !bg-[#454545]' +const HANDLE_LEFT = `${HANDLE_BASE} !left-[-8px] !h-5 !w-[7px] !rounded-r-none !rounded-l-[2px]` +const HANDLE_RIGHT = `${HANDLE_BASE} !right-[-8px] !h-5 !w-[7px] !rounded-l-none !rounded-r-[2px]` + +/** + * Static preview block node matching the real WorkflowBlock styling. + * Renders a header (icon + name), sub-block rows, and tool chips. + * + * Dark-theme colors mirror the app canvas: + * surface #232323, border #3d3d3d, text #e6e6e6 / #b3b3b3. + */ +export const PreviewBlockNode = memo(function PreviewBlockNode({ + data, +}: NodeProps) { + const { + name, + blockType, + bgColor, + rows, + tools, + hideTargetHandle, + hideSourceHandle, + index = 0, + animate = false, + isHighlighted = false, + isDimmed = false, + } = data + const Icon = resolveIcon(blockType) + const delay = animate ? index * BLOCK_STAGGER : 0 + const hasContent = rows.length > 0 || (tools && tools.length > 0) + + return ( + + +
+ {isHighlighted && ( +
+ )} + {!hideTargetHandle && ( + + )} + +
+
+
+ {Icon && } +
+ {name} +
+
+ + {hasContent && ( +
+ {rows.map((row) => ( +
+ + {row.title} + + {row.value && ( + + {row.value} + + )} +
+ ))} + + {tools && tools.length > 0 && ( +
+ + Tools + +
+ {tools.map((tool) => { + const ToolIcon = resolveIcon(tool.type) + return ( +
+
+ {ToolIcon && } +
+ + {tool.name} + +
+ ) + })} +
+
+ )} +
+ )} + + {!hideSourceHandle && ( + + )} +
+ + + ) +}) diff --git a/apps/docs/components/workflow-preview/preview-container-node.tsx b/apps/docs/components/workflow-preview/preview-container-node.tsx new file mode 100644 index 00000000000..dc89a64155d --- /dev/null +++ b/apps/docs/components/workflow-preview/preview-container-node.tsx @@ -0,0 +1,94 @@ +'use client' + +import { memo } from 'react' +import { Handle, type NodeProps, Position } from 'reactflow' +import { BLOCK_ICONS } from '@/components/workflow-preview/block-icons' + +interface PreviewContainerData { + name: string + blockType: string + bgColor: string + rows: Array<{ title: string; value: string }> + hideTargetHandle?: boolean + hideSourceHandle?: boolean +} + +const HANDLE_BASE = '!z-[10] !border-none !bg-[#454545]' +const HANDLE_LEFT = `${HANDLE_BASE} !left-[-8px] !h-5 !w-[7px] !rounded-r-none !rounded-l-[2px]` +const HANDLE_RIGHT = `${HANDLE_BASE} !right-[-8px] !h-5 !w-[7px] !rounded-l-none !rounded-r-[2px]` +const HANDLE_START = `${HANDLE_BASE} !right-[-8px] !h-4 !w-[7px] !rounded-l-none !rounded-r-[2px]` + +/** Legible icon class for the header swatch — dark glyph on a light bg, white on a dark one. */ +function iconClassFor(bg: string): string { + const hex = bg.replace('#', '') + if (hex.length !== 6) return 'text-white' + const r = Number.parseInt(hex.slice(0, 2), 16) + const g = Number.parseInt(hex.slice(2, 4), 16) + const b = Number.parseInt(hex.slice(4, 6), 16) + const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255 + return luminance > 0.6 ? 'text-[#1c1c1c]' : 'text-white' +} + +/** + * Container node for Loop / Parallel blocks, mirroring the app's subflow node: + * a solid-bordered box with a header (icon + name), an internal "Start" pill + * whose right handle feeds the first nested block, and target/source handles at + * the vertical center. React Flow positions the child blocks inside via parentNode. + */ +export const PreviewContainerNode = memo(function PreviewContainerNode({ + data, +}: NodeProps) { + const { name, blockType, bgColor, hideTargetHandle, hideSourceHandle } = data + const Icon = BLOCK_ICONS[blockType] + + return ( +
+ {!hideTargetHandle && ( + + )} + +
+
+ {Icon && } +
+ {name} +
+ +
+ Start + +
+ + {!hideSourceHandle && ( + + )} +
+ ) +}) diff --git a/apps/docs/components/workflow-preview/workflow-data.ts b/apps/docs/components/workflow-preview/workflow-data.ts new file mode 100644 index 00000000000..218b350fa29 --- /dev/null +++ b/apps/docs/components/workflow-preview/workflow-data.ts @@ -0,0 +1,134 @@ +import { type Edge, type Node, Position } from 'reactflow' + +/** + * Tool entry displayed as a chip on a block (e.g. an Agent's attached tools). + */ +export interface PreviewTool { + name: string + type: string + bgColor: string +} + +/** + * A single block in a preview workflow. Presentational shape — authored by hand + * for docs diagrams, not the app's full serialized block state. + */ +export interface PreviewBlock { + id: string + name: string + type: string + bgColor: string + rows: Array<{ title: string; value: string }> + tools?: PreviewTool[] + position: { x: number; y: number } + hideTargetHandle?: boolean + hideSourceHandle?: boolean + /** When set, the block renders as a Loop/Parallel container sized to hold its children. */ + size?: { width: number; height: number } + /** Id of the container block this block sits inside. Its position is relative to the container. */ + parentId?: string +} + +/** + * A workflow rendered as a read-only, app-styled diagram in the docs. + */ +export interface PreviewWorkflow { + id: string + name: string + blocks: PreviewBlock[] + edges: Array<{ id: string; source: string; target: string; sourceHandle?: string }> +} + +export const BLOCK_STAGGER = 0.12 +export const EASE_OUT: [number, number, number, number] = [0.16, 1, 0.3, 1] + +const EDGE_STYLE = { stroke: '#454545', strokeWidth: 1.5 } as const +const EDGE_STYLE_HIGHLIGHT = { stroke: '#33b4ff', strokeWidth: 2.5 } as const + +/** Optional emphasis: light one block or one edge and dim everything else. */ +export interface HighlightOptions { + highlightBlock?: string + highlightEdge?: string + /** Ring one block (selection) without dimming the rest. */ + selectedBlock?: string +} + +/** + * Converts a {@link PreviewWorkflow} to React Flow nodes and edges. + * + * @param workflow - The workflow definition + * @param animate - When true, node/edge data carries stagger metadata + * @param highlight - Optional block/edge to emphasize (dims the rest) + */ +export function toReactFlowElements( + workflow: PreviewWorkflow, + animate = false, + highlight: HighlightOptions = {} +): { nodes: Node[]; edges: Edge[] } { + const { highlightBlock, highlightEdge, selectedBlock } = highlight + const hasHighlight = Boolean(highlightBlock || highlightEdge) + const blockIndexMap = new Map(workflow.blocks.map((b, i) => [b.id, i])) + + const blocksById = new Map(workflow.blocks.map((b) => [b.id, b])) + + const nodes: Node[] = workflow.blocks.map((block, index) => { + const isContainer = Boolean(block.size) + // Nested blocks are authored relative to their container; render them at + // absolute coordinates (not React Flow parentNode children) so the edges + // between a container and its nested blocks render reliably and on top. + const parent = block.parentId ? blocksById.get(block.parentId) : undefined + const position = parent + ? { x: parent.position.x + block.position.x, y: parent.position.y + block.position.y } + : block.position + return { + id: block.id, + type: isContainer ? 'previewContainer' : 'previewBlock', + position, + zIndex: isContainer ? 0 : 1, + ...(block.size ? { style: { width: block.size.width, height: block.size.height } } : {}), + data: { + name: block.name, + blockType: block.type, + bgColor: block.bgColor, + rows: block.rows, + tools: block.tools, + hideTargetHandle: block.hideTargetHandle, + hideSourceHandle: block.hideSourceHandle, + index, + animate, + isHighlighted: highlightBlock === block.id || selectedBlock === block.id, + isDimmed: hasHighlight && highlightBlock !== block.id, + }, + draggable: true, + selectable: false, + connectable: false, + sourcePosition: Position.Right, + targetPosition: Position.Left, + } + }) + + const edges: Edge[] = workflow.edges.map((e) => { + const sourceIndex = blockIndexMap.get(e.source) ?? 0 + const isEdgeHighlight = highlightEdge === e.id + const dimmed = hasHighlight && !isEdgeHighlight + return { + id: e.id, + source: e.source, + target: e.target, + type: 'previewEdge', + animated: false, + style: { + ...(isEdgeHighlight ? EDGE_STYLE_HIGHLIGHT : EDGE_STYLE), + opacity: dimmed ? 0.35 : 1, + }, + sourceHandle: e.sourceHandle ?? 'source', + targetHandle: 'target', + data: { + animate, + delay: animate ? sourceIndex * BLOCK_STAGGER + BLOCK_STAGGER : 0, + }, + } + }) + + return { nodes, edges } +} diff --git a/apps/docs/components/workflow-preview/workflow-preview.tsx b/apps/docs/components/workflow-preview/workflow-preview.tsx new file mode 100644 index 00000000000..272dff406c3 --- /dev/null +++ b/apps/docs/components/workflow-preview/workflow-preview.tsx @@ -0,0 +1,335 @@ +'use client' + +import { useCallback, useEffect, useMemo, useState } from 'react' +import { domAnimation, LazyMotion, m } from 'framer-motion' +import { Maximize2, X } from 'lucide-react' +import ReactFlow, { + applyEdgeChanges, + applyNodeChanges, + Background, + BackgroundVariant, + type Edge, + type EdgeProps, + type EdgeTypes, + getSmoothStepPath, + type Node, + type NodeTypes, + type OnEdgesChange, + type OnNodesChange, + ReactFlowProvider, +} from 'reactflow' +import 'reactflow/dist/style.css' +import { BlockInspector } from '@/components/workflow-preview/block-inspector' +import { PreviewBlockNode } from '@/components/workflow-preview/preview-block-node' +import { PreviewContainerNode } from '@/components/workflow-preview/preview-container-node' +import { + EASE_OUT, + type PreviewBlock, + type PreviewWorkflow, + toReactFlowElements, +} from '@/components/workflow-preview/workflow-data' + +interface WorkflowPreviewProps { + workflow: PreviewWorkflow + /** Canvas height in px. Default 260. */ + height?: number + animate?: boolean + /** Emphasize one block by id, dimming the rest. */ + highlightBlock?: string + /** Emphasize one edge by id, dimming the rest. */ + highlightEdge?: string +} + +/** Smooth-step edge, matching the app's connection styling. */ +function PreviewEdge({ + id, + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + style, + data, +}: EdgeProps) { + const [edgePath] = getSmoothStepPath({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + }) + + if (data?.animate) { + return ( + + ) + } + + return ( + + ) +} + +const NODE_TYPES: NodeTypes = { + previewBlock: PreviewBlockNode, + previewContainer: PreviewContainerNode, +} +const EDGE_TYPES: EdgeTypes = { previewEdge: PreviewEdge } +const PRO_OPTIONS = { hideAttribution: true } +const FIT_VIEW_OPTIONS = { padding: 0.25, maxZoom: 1 } as const +const LIGHTBOX_FIT_VIEW_OPTIONS = { padding: 0.3, maxZoom: 1.4 } as const + +/** Field titles rendered as multiline text in the inspector. */ +const TEXTAREA_TITLES = new Set(['Messages', 'Prompt', 'Code', 'Data', 'Body', 'Display']) +/** Field titles rendered as dropdowns in the inspector. */ +const SELECT_TITLES = new Set([ + 'Model', + 'Operation', + 'Method', + 'Unit', + 'Event type', + 'Validation', + 'Account', + 'Table', + 'Knowledge Base', + 'Language', + 'Workflow', + 'Format', +]) + +function inspectorFieldsFor(block: PreviewBlock) { + return block.rows.map((row) => ({ + label: row.title, + kind: + TEXTAREA_TITLES.has(row.title) || row.value.length > 40 + ? ('textarea' as const) + : SELECT_TITLES.has(row.title) + ? ('select' as const) + : ('input' as const), + value: row.value, + })) +} + +function PreviewFlow({ + workflow, + animate = false, + highlightBlock, + highlightEdge, + selectedBlock, + interactive = false, + onNodeClick, +}: WorkflowPreviewProps & { + selectedBlock?: string + interactive?: boolean + onNodeClick?: (blockId: string) => void +}) { + const { nodes: initialNodes, edges: initialEdges } = useMemo( + () => toReactFlowElements(workflow, animate, { highlightBlock, highlightEdge, selectedBlock }), + [workflow, animate, highlightBlock, highlightEdge, selectedBlock] + ) + + const [nodes, setNodes] = useState(initialNodes) + const [edges, setEdges] = useState(initialEdges) + + useEffect(() => { + setNodes(initialNodes) + setEdges(initialEdges) + }, [initialNodes, initialEdges]) + + const onNodesChange: OnNodesChange = useCallback( + (changes) => setNodes((nds) => applyNodeChanges(changes, nds)), + [] + ) + const onEdgesChange: OnEdgesChange = useCallback( + (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), + [] + ) + + return ( + onNodeClick(node.id) : undefined} + nodeTypes={NODE_TYPES} + edgeTypes={EDGE_TYPES} + defaultEdgeOptions={{ type: 'previewEdge' }} + elementsSelectable={false} + nodesDraggable + nodesConnectable={false} + zoomOnScroll={interactive} + zoomOnDoubleClick={interactive} + panOnScroll={false} + zoomOnPinch={interactive} + panOnDrag + preventScrolling={interactive} + autoPanOnNodeDrag={false} + proOptions={PRO_OPTIONS} + minZoom={0.2} + fitView + fitViewOptions={interactive ? LIGHTBOX_FIT_VIEW_OPTIONS : FIT_VIEW_OPTIONS} + className='h-full w-full' + > + + + ) +} + +/** + * Read-only, app-styled workflow diagram for docs pages. Renders a + * {@link PreviewWorkflow} with ReactFlow — draggable, non-editable, no app + * runtime. Clicking a block (or the expand control) opens a full-screen + * lightbox with zoom and pan, plus a read-only inspector panel showing the + * selected block's full configuration — canvas rows truncate, the inspector + * doesn't. + * + * @example + * + */ +export function WorkflowPreview({ + workflow, + height = 260, + animate = false, + highlightBlock, + highlightEdge, +}: WorkflowPreviewProps) { + const [expanded, setExpanded] = useState(false) + const [selectedId, setSelectedId] = useState(null) + + useEffect(() => { + if (!expanded) return + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') setExpanded(false) + } + document.addEventListener('keydown', onKey) + const previousOverflow = document.body.style.overflow + document.body.style.overflow = 'hidden' + return () => { + document.removeEventListener('keydown', onKey) + document.body.style.overflow = previousOverflow + } + }, [expanded]) + + const selectedBlock = selectedId + ? (workflow.blocks.find((b) => b.id === selectedId) ?? null) + : null + const incoming = selectedBlock + ? workflow.edges + .filter((e) => e.target === selectedBlock.id) + .map((e) => workflow.blocks.find((b) => b.id === e.source)) + .filter((b): b is PreviewBlock => Boolean(b)) + : [] + + const openWith = (blockId: string | null) => { + setSelectedId(blockId) + setExpanded(true) + } + + return ( + +
+ + openWith(id)} + /> + + +
+ + {expanded && ( +
setExpanded(false)} + onKeyDown={() => {}} + role='presentation' + > +
e.stopPropagation()} + onKeyDown={() => {}} + role='presentation' + > +
+
+ {workflow.name} + +
+ + setSelectedId(id)} + /> + +
+ +
+ {selectedBlock ? ( + ({ + name: b.name, + type: b.type, + color: b.bgColor, + }))} + /> + ) : ( +
+ Select a block to see its full configuration +
+ )} +
+
+
+ )} +
+ ) +} diff --git a/apps/docs/content/docs/en/blocks/agent.mdx b/apps/docs/content/docs/en/blocks/agent.mdx index 18d337bc7f5..e98bffb9d66 100644 --- a/apps/docs/content/docs/en/blocks/agent.mdx +++ b/apps/docs/content/docs/en/blocks/agent.mdx @@ -1,89 +1,63 @@ --- title: Agent +description: The Agent block runs a model over your inputs to reason, call tools, and return text or structured output. +pageType: reference --- -import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, CLASSIFY_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Agent block connects your workflow to Large Language Models (LLMs). It processes natural language inputs, calls external tools, and generates structured or unstructured outputs. +The **Agent block** runs a model inside a workflow. You give it instructions, context, and tools; the model reasons over the input, calls tools as needed, and returns plain text or structured JSON that later blocks read by reference. Most workflows are built around one or more Agent blocks. -
- Agent Block Configuration -
+An *agent* and an *Agent block* are related but distinct. An agent is a whole workflow that reasons and acts on its own; an Agent block is one reasoning step inside it. The simplest agent is a single Agent block with tools, and larger ones wire several together with other blocks. See [Building agents](/building-agents). -## Configuration Options + -### System Prompt +## Configuration -The system prompt establishes the agent's operational parameters and behavioral constraints. This configuration defines the agent's role, response methodology, and processing boundaries for all incoming requests. +### Messages + +The messages sent to the model. Each message has a role: **System** sets the agent's job and rules, **User** gives it the input to act on. Insert a [connection tag](/workflows/connections) to pass an earlier output, like ``. ```markdown -You are a helpful assistant that specializes in financial analysis. -Always provide clear explanations and cite sources when possible. -When responding to questions about investments, include risk disclaimers. +You are a support assistant for an analytics product. +Answer in two sentences, cite the doc you used, and never guess a price. ``` -### User Prompt - -The user prompt represents the primary input data for inference processing. This parameter accepts natural language text or structured data that the agent will analyze and respond to. Input sources include: - -- **Static Configuration**: Direct text input specified in the block configuration -- **Dynamic Input**: Data passed from upstream blocks through connection interfaces -- **Runtime Generation**: Programmatically generated content during workflow execution - -### Model Selection - -The Agent block supports multiple LLM providers through a unified inference interface. Available models include: +### Model -- **OpenAI**: GPT-5.1, GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1 -- **Anthropic**: Claude 4.5 Sonnet, Claude Opus 4.1 -- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash -- **Other Providers**: Groq, Cerebras, xAI, Azure OpenAI, OpenRouter -- **Local Models**: Ollama or VLLM compatible models +The model that runs the step. Defaults to `claude-sonnet-4-6`. Type or pick any model from OpenAI, Anthropic, Google, xAI, Groq, Cerebras, DeepSeek, Azure, AWS Bedrock, Google Vertex, or OpenRouter, or a local model through Ollama or VLLM. -### Temperature +### Files -Controls response randomness and creativity: +Files for the model to read: images for a vision-capable model, or documents for text. Upload them on the block, or pass a file from an earlier block, such as an upload trigger or an [API](/blocks/api) response, with a connection tag. -- **Low (0-0.3)**: Deterministic and focused. Best for factual tasks and accuracy. -- **Medium (0.3-0.7)**: Balanced creativity and focus. Good for general use. -- **High (0.7-2.0)**: Creative and varied. Ideal for brainstorming and content generation. +### Tools -### Max Output Tokens +Capabilities the agent can call while it runs: search a knowledge base, send a Slack message, run a [Function](/blocks/function), or call any of the [integrations](/integrations). The model decides which to call and when. Each tool has a usage control: -Controls the maximum length of the model's response. Each model defaults to its full max output token limit (e.g., 64,000 tokens for Claude Sonnet 4.5). You can override this with a custom value using the Max Tokens setting. For Anthropic models, when non-streaming requests exceed the SDK's internal threshold, the provider automatically uses internal streaming to avoid timeouts. +- **Auto.** The model calls it when the context warrants. +- **Force.** The model must call it on every run. +- **None.** The tool is hidden from the model, which disables it without removing it from the block. -### API Key +### Skills -Your API key for the selected LLM provider. This is securely stored and used for authentication. +[Agent skills](/skills) the agent can load on demand: reusable instruction packages like a coding standard or a support playbook. Only the skill names sit in context up front, and the agent loads the full instructions when it decides a skill is relevant. -### Tools +### Memory -Extend agent capabilities with external integrations. Select from 60+ pre-built tools or define custom functions. +Built-in conversation memory, kept across runs by a conversation ID: -**Available Categories:** -- **Communication**: Gmail, Slack, Telegram, WhatsApp, Microsoft Teams -- **Data Sources**: Notion, Google Sheets, Airtable, Supabase, Pinecone -- **Web Services**: Firecrawl, Google Search, Exa AI, browser automation -- **Development**: GitHub, Jira, Linear -- **AI Services**: OpenAI, Perplexity, Hugging Face, ElevenLabs +- **None.** Each run is independent. +- **Conversation.** The full history for that conversation ID. +- **Sliding window (messages).** The most recent N messages. +- **Sliding window (tokens).** Recent messages up to a token budget. -**Execution Modes:** -- **Auto**: Model decides when to use tools based on context -- **Required**: Tool must be called in every request -- **None**: Tool is completely filtered out and not sent to the model — effectively disables the tool +Memory needs a conversation ID to persist between runs. ### Response Format -The Response Format parameter enforces structured output generation through JSON Schema validation. This ensures consistent, machine-readable responses that conform to predefined data structures: +Give the agent a JSON Schema to force structured output. The response is constrained to match the schema, and each field becomes its own output you read by name, like ``. Without a response format, the agent returns plain text in `content`. ```json { @@ -91,81 +65,58 @@ The Response Format parameter enforces structured output generation through JSON "schema": { "type": "object", "properties": { - "sentiment": { - "type": "string", - "enum": ["positive", "negative", "neutral"] - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1 - } + "sentiment": { "type": "string", "enum": ["positive", "negative", "neutral"] }, + "confidence": { "type": "number", "minimum": 0, "maximum": 1 } }, "required": ["sentiment", "confidence"] } } ``` -This configuration constrains the model's output to comply with the specified schema, preventing free-form text responses and ensuring structured data generation. - -### Accessing Results - -After an agent completes, you can access its outputs: - -- **``**: The agent's response text or structured data -- **``**: Token usage statistics (prompt, completion, total) -- **``**: Details of any tools the agent used during execution -- **``**: Estimated cost of the API call (if available) +### Advanced -## Advanced Features +Some settings live under advanced, or appear only for models that support them: -### Memory + Agent: Conversation History +- **Temperature.** How varied the output is. Stay low (0–0.3) when you need accuracy and repeatability, middle (around 0.5) for everyday work, higher (0.7+) when you want creative variety. +- **Max output tokens.** Caps the response length. Defaults to the model's full limit. +- **Reasoning effort / Thinking level.** For models with extended reasoning, how much the model thinks before answering. Higher is more thorough but slower and costs more tokens. +- **API key.** Your key for the chosen provider. Hidden on hosted Sim, which supplies one. -Use a `Memory` block with a consistent `id` (for example, `chat`) to persist messages between runs, and include that history in the Agent's prompt. +## Outputs -- Add the user's message before the Agent -- Read the conversation history for context -- Append the Agent's reply after it runs +After the agent runs, later blocks read its result by name: -See the [`Memory`](/tools/memory) block reference for details. +| Output | What it is | +| --- | --- | +| `` | The response: text, or the structured object when a response format is set | +| `` | Token usage, an object `{ input, output, total }` | +| `` | The tools the agent called, with their inputs and results | +| `` | The model that ran the step | +| `` | Estimated cost of the call | -## Outputs +When a response format is set, its fields are readable directly, like ``. -- **``**: Agent's response text -- **``**: Model identifier used for the request -- **``**: Token usage statistics -- **``**: Tool execution details -- **``**: Estimated API call cost +## Example -## Example Use Cases +A workflow that reads an incoming customer message and classifies it: -**Customer Support Automation** - Handle inquiries with database and tool access -``` -API (Ticket) → Agent (Postgres, KB, Linear) → Gmail (Reply) → Memory (Save) -``` + -**Multi-Model Content Analysis** - Analyze content with different AI models -``` -Function (Process) → Agent (GPT-4o Technical) → Agent (Claude Sentiment) → Function (Report) -``` - -**Tool-Powered Research Assistant** - Research with web search and document access -``` -Input → Agent (Google Search, Notion) → Function (Compile Report) -``` +The Agent reads the message from Start with `` and returns a result that later blocks read as ``. ## Best Practices -- **Be specific in system prompts**: Clearly define the agent's role, tone, and limitations. The more specific your instructions are, the better the agent will be able to fulfill its intended purpose. -- **Choose the right temperature setting**: Use lower temperature settings (0-0.3) when accuracy is important, or increase temperature (0.7-2.0) for more creative or varied responses -- **Leverage tools effectively**: Integrate tools that complement the agent's purpose and enhance its capabilities. Be selective about which tools you provide to avoid overwhelming the agent. For tasks with little overlap, use another Agent block for the best results. +- **Write a clear system message.** Define the agent's role, tone, and limits. Specific instructions produce more reliable output than a vague prompt. +- **Match the model and temperature to the task.** Use a stronger model and lower temperature (0–0.3) for accuracy; raise temperature for creative or varied output. +- **Give the agent only the tools it needs.** Too many tools dilute its choices. For jobs that don't overlap, use a second Agent block instead of overloading one. +- **Use a response format when a downstream block needs specific fields.** It guarantees the shape, and you read each field as ``. syntax. If no response format is set, the agent returns its standard outputs: content, model, tokens, and toolCalls." }, - { question: "What does the Reasoning Effort / Thinking Level setting do?", answer: "These are advanced settings that appear only for models that support extended reasoning. Reasoning Effort (for OpenAI o-series and GPT-5 models) and Thinking Level (for Anthropic Claude and Gemini models with thinking) control how much compute the model spends reasoning before responding. Higher levels produce more thorough answers but cost more tokens and take longer." }, - { question: "How does max output tokens work with Anthropic models specifically?", answer: "The Agent block uses each Anthropic model's full max output token limit by default (e.g., 64,000 for Claude Sonnet 4.5). You can override this with the Max Tokens setting. For non-streaming requests that exceed the SDK's internal threshold, the provider automatically uses internal streaming to avoid timeouts." }, - { question: "Can I use the Agent block with a custom or self-hosted model?", answer: "Yes. You can use any Ollama or VLLM-compatible model by typing the model name directly into the model combobox. This lets you connect to locally hosted or custom-deployed models as long as they expose a compatible API endpoint." }, + { question: "What LLM providers does the Agent block support?", answer: "OpenAI, Anthropic, Google (Gemini), xAI (Grok), DeepSeek, Groq, Cerebras, Azure OpenAI, Azure Anthropic, Google Vertex AI, AWS Bedrock, OpenRouter, and local models via Ollama or VLLM. Type or select any supported model from the model combobox." }, + { question: "What are the memory options for the Agent block?", answer: "Four modes: None (no memory, each run is independent), Conversation (full history keyed by a conversation ID), Sliding window by messages (the N most recent messages), and Sliding window by tokens (messages up to a token budget). Memory needs a conversation ID to persist across runs." }, + { question: "What is the difference between the tool usage controls (Auto, Force, None)?", answer: "In Auto, the model decides when to call a tool based on context. In Force, the model must call the tool on every run. In None, the tool is hidden from the model and never sent, which disables it without removing it from the block." }, + { question: "How does the Response Format work?", answer: "It enforces structured output by providing a JSON Schema. When set, the model's response is constrained to match the schema exactly, and each field is read directly by downstream blocks using . Without a response format, the agent returns its standard outputs: content, model, tokens, and toolCalls." }, + { question: "What does the Reasoning Effort / Thinking Level setting do?", answer: "They appear only for models that support extended reasoning. Reasoning Effort (OpenAI o-series and GPT-5 models) and Thinking Level (Anthropic Claude and Gemini models with thinking) control how much compute the model spends reasoning before responding. Higher levels produce more thorough answers but cost more tokens and take longer." }, + { question: "How does max output tokens work with Anthropic models?", answer: "The Agent block uses each Anthropic model's full max output token limit by default (for example, 64,000 tokens). You can override this with the Max Output Tokens setting. For non-streaming requests that exceed the SDK's internal threshold, the provider automatically uses internal streaming to avoid timeouts." }, + { question: "Can I use the Agent block with a custom or self-hosted model?", answer: "Yes. Use any Ollama or VLLM-compatible model by typing the model name directly into the model combobox, as long as it exposes a compatible API endpoint." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/api.mdx b/apps/docs/content/docs/en/blocks/api.mdx index e768ff47934..7792de02050 100644 --- a/apps/docs/content/docs/en/blocks/api.mdx +++ b/apps/docs/content/docs/en/blocks/api.mdx @@ -1,157 +1,78 @@ --- title: API +description: The API block makes an HTTP request to an external service and returns the response. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, API_FETCH_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The API block connects your workflow to external services through HTTP requests. Supports GET, POST, PUT, DELETE, and PATCH methods for interacting with REST APIs. +The **API block** makes an HTTP request to a URL and returns the response. Use it to call any REST API: fetch data, create a record, or trigger an external endpoint. -
- API Block -
+ -## Configuration Options +## Configuration ### URL -The endpoint URL for the API request. This can be: - -- A static URL entered directly in the block -- A dynamic URL connected from another block's output -- A URL with path parameters +The endpoint to call. Type a static URL, or insert a [connection tag](/workflows/connections) to build it from an earlier output, like `https://api.example.com/users/`. ### Method -Select the HTTP method for your request: - -- **GET**: Retrieve data from the server -- **POST**: Send data to the server to create a resource -- **PUT**: Update an existing resource on the server -- **DELETE**: Remove a resource from the server -- **PATCH**: Partially update an existing resource - -### Query Parameters - -Define key-value pairs that will be appended to the URL as query parameters. For example: - -``` -Key: apiKey -Value: your_api_key_here +The HTTP method: **GET**, **POST**, **PUT**, **DELETE**, or **PATCH**. Defaults to GET. -Key: limit -Value: 10 -``` +### Query Params -These would be added to the URL as `?apiKey=your_api_key_here&limit=10`. +Key-value pairs appended to the URL as a query string. `apiKey` and `limit` become `?apiKey=…&limit=10`. ### Headers -Configure HTTP headers for your request. Common headers include: - -``` -Key: Content-Type -Value: application/json - -Key: Authorization -Value: Bearer your_token_here -``` - -### Request Body - -For methods that support a request body (POST, PUT, PATCH), you can define the data to send. The body can be: - -- JSON data entered directly in the block -- Data connected from another block's output -- Dynamically generated during workflow execution +Key-value request headers, such as `Content-Type: application/json` or `Authorization: Bearer `. Standard headers like `User-Agent` and `Accept` are added automatically, and your values override them. -### Accessing Results +### Body -After an API request completes, you can access its outputs: +The request payload for POST, PUT, and PATCH, sent as JSON. Type it directly, or pull it from an earlier output with a connection tag. -- **``**: The response body data from the API -- **``**: HTTP status code (200, 404, 500, etc.) -- **``**: Response headers from the server +### Advanced -## Advanced Features +- **Timeout (ms).** How long to wait before giving up. Defaults to 300000 (5 minutes), up to 600000 (10 minutes). +- **Retries.** Number of retry attempts on timeouts, `429` responses, and `5xx` errors. Defaults to 0. +- **Retry delay / Max retry delay (ms).** The exponential-backoff bounds used between retries. +- **Retry non-idempotent methods.** Off by default, so POST and PATCH are not retried, which avoids duplicate writes. Turn it on only when a repeated request is safe. -### Dynamic URL Construction - -Build URLs dynamically using variables from previous blocks: - -```javascript -// In a Function block before the API -const userId = ; -const apiUrl = `https://api.example.com/users/${userId}/profile`; -``` - -### Request Retries - -The API block supports **configurable retries** (see the block’s **Advanced** settings): - -- **Retries**: Number of retry attempts (additional tries after the first request) -- **Retry delay (ms)**: Initial delay before retrying (uses exponential backoff) -- **Max retry delay (ms)**: Maximum delay between retries -- **Retry non-idempotent methods**: Allow retries for **POST/PATCH** (may create duplicate requests) - -Retries are attempted for: - -- Network/connection failures and timeouts (with exponential backoff) -- Rate limits (**429**) and server errors (**5xx**) - -### Response Validation +## Outputs -Validate API responses before processing: +After the request completes, later blocks read its result by name: -```javascript -// In a Function block after the API -if ( === 200) { - const data = ; - // Process successful response -} else { - // Handle error response - console.error(`API Error: ${}`); -} -``` +| Output | What it is | +| --- | --- | +| `` | The response body, parsed as an object for JSON or returned as text otherwise | +| `` | The HTTP status code, like `200` or `404` | +| `` | The response headers, as an object | -## Outputs +Branch on the result by reading `` in a [Condition](/blocks/condition) block. -- **``**: Response body data from the API -- **``**: HTTP status code -- **``**: Response headers +## Example -## Example Use Cases +A workflow that calls an HTTP endpoint and summarizes the response: -**Fetch User Profile Data** - Retrieve user information from external service -``` -Function (Build ID) → API (GET /users/{id}) → Function (Format) → Response -``` + -**Payment Processing** - Process payment through Stripe API -``` -Function (Validate) → API (Stripe) → Condition (Success) → Supabase (Update) -``` +The API block builds its URL from the Start input, fetches the data, and the Agent reads the response as ``. ## Best Practices -- **Use environment variables for sensitive data**: Don't hardcode API keys or credentials -- **Handle errors gracefully**: Connect error handling logic for failed requests -- **Validate responses**: Check status codes and response formats before processing data -- **Respect rate limits**: Be mindful of API rate limits and implement appropriate throttling +- **Keep secrets in environment variables.** Reference them with `{{VAR}}` in the URL or headers; never hardcode keys. +- **Handle failures.** Read `` and branch on it with a [Condition](/blocks/condition), or connect the error path for network failures and timeouts. +- **Set retries for flaky endpoints.** Use the Advanced retry settings for idempotent calls. Leave POST and PATCH off unless a repeated request is safe. +- **Reference only the field you need.** Pull `` rather than the whole `` when the response is large. diff --git a/apps/docs/content/docs/en/blocks/condition.mdx b/apps/docs/content/docs/en/blocks/condition.mdx index 465b9f3fbec..3040b4cc924 100644 --- a/apps/docs/content/docs/en/blocks/condition.mdx +++ b/apps/docs/content/docs/en/blocks/condition.mdx @@ -1,144 +1,80 @@ --- title: Condition +description: The Condition block branches a workflow on boolean expressions, with no model call. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { + BlockPreview, + WorkflowPreview, + CONDITION_MODERATE_WORKFLOW, + CONDITION_ONBOARD_WORKFLOW, + CONDITION_ROUTE_WORKFLOW, +} from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Condition block branches workflow execution based on boolean expressions. Evaluate conditions using previous block outputs and route to different paths without requiring an LLM. +The **Condition block** branches a workflow on boolean expressions. It checks each branch in order and runs the path of the first one that is true, with no model call. When you want a model to decide the route, use a [Router](/blocks/router) instead. -
- Condition Block -
+ -## Configuration Options +## Configuration ### Conditions -Define one or more conditions that will be evaluated. Each condition includes: +A list of branches: an **if**, any number of **else if** rows, and a final **else**. Each branch holds a JavaScript expression that evaluates to true or false, and connects to its own path. Sim checks them top to bottom and takes the first branch that is true; the **else** branch runs when none match. -- **Expression**: A JavaScript/TypeScript expression that evaluates to true or false -- **Path**: The destination block to route to if the condition is true -- **Description**: Optional explanation of what the condition checks - -You can create multiple conditions that are evaluated in order, with the first matching condition determining the execution path. - -### Condition Expression Format - -Conditions use JavaScript syntax and can reference input values from previous blocks. - - - - ```javascript - // Check if a score is above a threshold - > 75 - ``` - - - ```javascript - // Check if a text contains specific keywords - .includes('urgent') || .includes('emergency') - ``` - - - ```javascript - // Check multiple conditions - >= 18 && === 'US' - ``` - - - - -### Accessing Results - -After a condition evaluates, you can access its outputs: - -- **``**: Boolean result of the condition evaluation -- **``**: ID of the condition that was matched -- **``**: Details of the chosen routing destination - -## Advanced Features - -### Complex Expressions - -Use JavaScript operators and functions in conditions: +Reference an earlier output inside an expression with a [connection tag](/workflows/connections): ```javascript -// String operations -.endsWith('@company.com') - -// Array operations -.includes('urgent') - -// Mathematical operations - * 100 > 85 - -// Date comparisons -new Date() > new Date('2024-01-01') + > 75 +.toLowerCase().includes('urgent') +.endsWith('@company.com') && === 'pro' ``` -### Multiple Condition Evaluation + +If an expression throws, for example because it reads a field that is not there, the block errors and the run follows the [error path](/workflows/connections) if one is connected. Guard missing values with optional chaining (`?.`) or a null check. + -Conditions are evaluated in order until one matches: +## Outputs -```javascript -// Condition 1: Check for high priority - === 'high' +| Output | What it is | +| --- | --- | +| `` | The boolean result of the branch that matched | +| `` | The id of the matched branch | +| `` | The destination block the workflow routed to | -// Condition 2: Check for urgent keywords -.toLowerCase().includes('urgent') +## Examples -// Condition 3: Default fallback -true -``` +### Route a support ticket by priority -### Error Handling + -If a condition expression references an undefined variable or throws a runtime error, the block will throw an error and the execution will fail (or follow the error path if one is connected). Use optional chaining (`?.`) or explicit null checks in your expressions to handle missing values safely. +The Condition checks `` and runs one downstream path. The other does not run, so a reference to a block on the path that did not run comes back empty. -## Outputs +### Moderate content by score -- **``**: Boolean result of the evaluation -- **``**: ID of the matched condition -- **``**: Details of the chosen routing destination + -## Example Use Cases +An Agent scores the content, and the Condition publishes it or blocks it on ``. -**Customer Support Routing** - Route tickets based on priority -``` -API (Ticket) → Condition (priority === 'high') → Agent (Escalation) or Agent (Standard) -``` +### Branch onboarding by account tier -**Content Moderation** - Filter content based on analysis -``` -Agent (Analyze) → Condition (toxicity > 0.7) → Moderation or Publish -``` + -**User Onboarding Flow** - Personalize onboarding based on user type -``` -Function (Process) → Condition (account_type === 'enterprise') → Advanced or Simple -``` +A Function reads the account, and the Condition sends enterprise accounts through guided setup and everyone else through the quick start. ## Best Practices -- **Order conditions correctly**: Place more specific conditions before general ones to ensure specific logic takes precedence over fallbacks -- **Use the else branch when needed**: If no conditions match and the else branch is not connected, the workflow branch will end gracefully. Connect the else branch if you need a fallback path for unmatched cases -- **Keep expressions simple**: Use clear, straightforward boolean expressions for better readability and easier debugging -- **Document your conditions**: Add descriptions to explain the purpose of each condition for better team collaboration and maintenance -- **Test edge cases**: Verify conditions handle boundary values correctly by testing with values at the edges of your condition ranges +- **Order branches from specific to general.** The first true branch wins, so put narrow checks before catch-alls. +- **Always give unmatched runs a path.** Connect the **else** branch, or make the last condition `true`, so nothing dead-ends silently. +- **Keep expressions simple.** Short boolean checks are easy to read and debug. Do heavy logic in a [Function](/blocks/function) block first and branch on its result. +- **Guard missing values.** Use optional chaining (`?.`) or a null check so an absent field does not throw. , <), logical operators (&&, ||, !), string methods (.includes(), .endsWith(), .toLowerCase()), array methods (.includes(), .length), mathematical operations, and Date comparisons. Reference block outputs using syntax." }, - { question: "How does the Condition block handle null or undefined values?", answer: "If a condition expression references an undefined variable or throws a runtime error, the Condition block will throw an error and the execution will fail (or follow the error path if one is connected). Use optional chaining (?.) or explicit null checks in your expressions to handle missing values safely." }, + { question: "Does the Condition block use an LLM?", answer: "No. It evaluates boolean expressions using JavaScript syntax directly, with no model call. That makes it fast, deterministic, and free of API cost. For AI-powered routing, use the Router block instead." }, + { question: "What happens if no condition matches?", answer: "The workflow follows the else branch. If the else branch is not connected to a downstream block, that path ends gracefully without an error. Add a final condition of simply true to guarantee a match." }, + { question: "In what order are conditions evaluated?", answer: "Top to bottom, in the order they are defined. The first branch that evaluates to true determines the path, and later branches are not checked after a match. Place more specific conditions before general ones." }, + { question: "What JavaScript features can I use in condition expressions?", answer: "Standard operators and methods: comparisons (===, !==, >, <), logical operators (&&, ||, !), string methods (.includes(), .endsWith(), .toLowerCase()), array methods (.includes(), .length), math, and Date comparisons. Reference block outputs with syntax." }, + { question: "How does the Condition block handle null or undefined values?", answer: "If an expression references an undefined variable or throws at runtime, the block errors and the run fails, or follows the error path if one is connected. Use optional chaining (?.) or explicit null checks to handle missing values safely." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/credential.mdx b/apps/docs/content/docs/en/blocks/credential.mdx index 06b8cb5bec1..0bbaca69dad 100644 --- a/apps/docs/content/docs/en/blocks/credential.mdx +++ b/apps/docs/content/docs/en/blocks/credential.mdx @@ -1,29 +1,29 @@ --- title: Credential +description: The Credential block outputs an OAuth credential's ID reference for downstream blocks to use. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' +import { + BlockPreview, + WorkflowPreview, + CREDENTIAL_ROUTE_WORKFLOW, + CREDENTIAL_SHARE_WORKFLOW, +} from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Credential block has two operations: **Select Credential** picks a single OAuth credential and outputs its ID reference for downstream blocks; **List Credentials** returns all OAuth credentials in the workspace (optionally filtered by provider) as an array for iteration. +The **Credential block** hands a downstream block an OAuth credential to use, without exposing the secret. It has two operations: **Select Credential** outputs one credential's ID reference for other blocks to use; **List Credentials** returns all the workspace's OAuth credentials (optionally filtered by provider) as an array to iterate over. -
- Credential Block -
+ The Credential block outputs credential **ID references**, not secrets. Downstream blocks receive the ID and resolve the actual OAuth token securely during their own execution. -## Configuration Options +## Configuration ### Operation @@ -74,19 +74,22 @@ Filter the returned OAuth credentials by provider. Select one or more providers -## Example Use Cases +## Examples -**Shared credential across multiple blocks** — Define once, use everywhere -``` -Credential (Select, Google) → Gmail (Send) & Google Drive (Upload) & Google Calendar (Create) -``` +### Share one credential across blocks -**Multi-account workflows** — Route to different credentials based on logic -``` -Agent (Determine account) → Condition → Credential A or Credential B → Slack (Post) -``` + + +Select a Google account once, then reference `` in the Gmail, Drive, and Calendar blocks. Change the account in one place and every block follows. + +### Route to a different account by logic + + + +A Condition picks the production or staging credential from a workflow variable, and the downstream Slack block posts with whichever one ran. + +### List all accounts and fan out -**Iterate over all Gmail accounts** ``` Credential (List, Provider: Gmail) → ForEach Loop → Gmail (Send) using ``` @@ -109,20 +112,7 @@ Credential (List, Provider: Gmail) → ForEach Loop → Gmail (Send) using ` as the value - - - In the Gmail block's credential field (advanced mode): - ``` - - ``` - - - In the Slack block's credential field (advanced mode): - ``` - - ``` - - +The same reference works for any OAuth block. In a Gmail or Slack block's credential field (advanced mode), enter ``. ### List Credentials diff --git a/apps/docs/content/docs/en/blocks/evaluator.mdx b/apps/docs/content/docs/en/blocks/evaluator.mdx index dd0d2f5da67..078045988c0 100644 --- a/apps/docs/content/docs/en/blocks/evaluator.mdx +++ b/apps/docs/content/docs/en/blocks/evaluator.mdx @@ -1,103 +1,75 @@ --- title: Evaluator +description: The Evaluator block uses a model to score content against metrics you define. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, EVALUATOR_GATE_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Evaluator block uses AI to score and assess content quality against custom metrics. Perfect for quality control, A/B testing, and ensuring AI outputs meet specific standards. +The **Evaluator block** uses a model to score content against metrics you define, returning a number per metric. Use it for quality gates, comparing variations, and quality control on AI output. -
- Evaluator Block Configuration -
+ -## Configuration Options +## Configuration ### Evaluation Metrics -Define custom metrics to evaluate content against. Each metric includes: - -- **Name**: A short identifier for the metric -- **Description**: A detailed explanation of what the metric measures -- **Range**: The numeric range for scoring (e.g., 1-5, 0-10) - -Example metrics: +The metrics to score against. Each metric has a **name**, a **description** of what it measures, and a numeric **range**: ``` Accuracy (1-5): How factually accurate is the content? -Clarity (1-5): How clear and understandable is the content? -Relevance (1-5): How relevant is the content to the original query? +Clarity (1-5): How clear and understandable is it? +Relevance(1-5): How relevant is it to the original query? ``` +The model scores the content on each metric and returns the numbers. Metrics missing a name or range are skipped. + ### Content -The content to be evaluated. This can be: +The content to score. Usually an earlier output like ``. Structured data is formatted to text before scoring; the evaluation is text-based, so it can't score images or audio directly. -- Directly provided in the block configuration -- Connected from another block's output (typically an Agent block) -- Dynamically generated during workflow execution +### Model -### Model Selection +The model that does the scoring, defaulting to `claude-sonnet-4-6`. Stronger reasoning models give more consistent scores. Type or pick any supported model. **Temperature** and a **System Prompt** are available under advanced, and on hosted Sim the API key is supplied for you. -Choose an AI model to perform the evaluation: +## Outputs -- **OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1 -- **Anthropic**: Claude Sonnet 4.5 -- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash -- **Other Providers**: Groq, Cerebras, xAI, DeepSeek -- **Local Models**: Ollama or VLLM compatible models +The Evaluator returns a number for each metric, read by the metric's lowercase name: -Use models with strong reasoning capabilities like GPT-4o or Claude Sonnet 4.5 for best results. +| Output | What it is | +| --- | --- | +| `` | The score for a metric (one output per metric you define) | +| `` | The evaluation summary | +| `` | The model that scored | +| `` | Token usage | +| `` | Estimated cost of the call | -### API Key +The block enforces a JSON Schema built from your metrics, so the model returns only the metric scores as numbers, no extra text. -Your API key for the selected LLM provider. This is securely stored and used for authentication. +## Examples -## Example Use Cases +### Gate on a quality score -**Content Quality Assessment** - Evaluate content before publication -``` -Agent (Generate) → Evaluator (Score) → Condition (Check threshold) → Publish or Revise -``` + -**A/B Testing Content** - Compare multiple AI-generated responses -``` -Parallel (Variations) → Evaluator (Score Each) → Function (Select Best) → Response -``` - -**Customer Support Quality Control** - Ensure responses meet quality standards -``` -Agent (Support Response) → Evaluator (Score) → Function (Log) → Condition (Review if Low) -``` - -## Outputs +The Evaluator scores the draft, and a [Condition](/blocks/condition) gates on `` — publishing a strong draft or sending a weak one back to revise. -- **``**: Summary of the evaluation with scores -- **``**: Model used for evaluation -- **``**: Token usage statistics -- **``**: Estimated evaluation cost +The same shape covers other quality work: score several [parallel](/blocks/parallel) variations and pick the best, or score every support reply and flag the low ones for review. ## Best Practices -- **Use specific metric descriptions**: Clearly define what each metric measures to get more accurate evaluations -- **Choose appropriate ranges**: Select scoring ranges that provide enough granularity without being overly complex -- **Connect with Agent blocks**: Use Evaluator blocks to assess Agent block outputs and create feedback loops -- **Use consistent metrics**: For comparative analysis, maintain consistent metrics across similar evaluations -- **Combine multiple metrics**: Use several metrics to get a comprehensive evaluation +- **Write specific metric descriptions.** A clear definition of what each metric measures produces more consistent scores. +- **Choose a sensible range.** Enough granularity to act on (1–5 or 0–10), without splitting hairs. +- **Score Agent output and loop back.** Pair an Evaluator with a Condition to gate on a threshold and route weak output back for another pass. +- **Keep metrics consistent.** For comparing variations, use the same metrics across each evaluation. ." }, + { question: "Which models work best for evaluation?", answer: "Models with strong reasoning give the most consistent scores. The default is claude-sonnet-4-6; for simple, clearly distinct metrics a faster model is fine." }, + { question: "Can I evaluate non-text content?", answer: "The content field takes any string. JSON or structured data is detected and formatted before scoring, but the evaluation is text-based, so it can't directly score images or audio." }, + { question: "What happens if a metric is incomplete?", answer: "Metrics missing a name or a range are skipped. The Evaluator only scores metrics that have both a name and a defined min/max range." }, + { question: "Does the Evaluator use structured output?", answer: "Yes. It builds a JSON Schema from your metrics and enforces strict mode, so the model returns only the expected metric scores as numbers, with no extra text." }, + { question: "How are evaluation costs calculated?", answer: "From the underlying model call's token usage. The outputs include token counts and a cost breakdown so you can track spend per evaluation." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/function.mdx b/apps/docs/content/docs/en/blocks/function.mdx index e8c0bc5b7bd..09aa2433d20 100644 --- a/apps/docs/content/docs/en/blocks/function.mdx +++ b/apps/docs/content/docs/en/blocks/function.mdx @@ -1,71 +1,98 @@ --- title: Function +description: The Function block runs your JavaScript or Python code as a step and returns what it produces. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, FUNCTION_RESHAPE_WORKFLOW, FUNCTION_VALIDATE_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Function block executes custom JavaScript, TypeScript, or Python code in your workflows. Transform data, perform calculations, or implement custom logic. +The **Function block** runs your own JavaScript or Python code as one step of a workflow. Use it to reshape a value, run a calculation, or add logic no other block covers. -
- Function Block with Code Editor -
+ + +## Configuration + +### Code + +Your code, in JavaScript (the default) or Python — pick the language on the block. Reference an earlier output directly, with no quotes around the tag, and read an environment variable with `{{VAR}}`: + + + + ```javascript + const data = ; + return data.items.filter((i) => i.active).map((i) => i.id); + ``` + + + ```python + import json + data = json.loads('') + print(json.dumps([i["id"] for i in data["items"] if i["active"]])) + ``` + + + +Return a value in JavaScript with `return`. In Python, print it as JSON to stdout with `print(json.dumps(...))`; the block captures stdout as the result. Your code runs in an async context, so you can `await` directly in JavaScript. ## Outputs -- **``**: The value returned from your function -- **``**: Console.log() output from your code +| Output | What it is | +| --- | --- | +| `` | The value your code returns (object, array, string, number, …) | +| `` | Anything printed with `console.log()` or `print()` | -## Example Use Cases +## Language -**Data Processing Pipeline** - Transform API response into structured data -``` -API (Fetch) → Function (Process & Validate) → Function (Calculate Metrics) → Response -``` +JavaScript runs in a fast local sandbox, or in an [E2B](https://e2b.dev) sandbox when your code uses `import` or `require`. Python always runs in the E2B sandbox. -**Business Logic Implementation** - Calculate loyalty scores and tiers -``` -Agent (Get History) → Function (Calculate Score) → Function (Determine Tier) → Condition (Route) -``` +| | JavaScript | Python | +| --- | --- | --- | +| **Execution** | Local sandbox (fast), or E2B with imports | Always E2B sandbox | +| **Return a value** | `return { … }` | `print(json.dumps({ … }))` | +| **HTTP requests** | `fetch()` built-in | `requests` or `httpx` | +| **Best for** | quick transforms, JSON | data science, charts, complex math | -**Data Validation and Sanitization** - Validate and clean user input -``` -Input → Function (Validate & Sanitize) → API (Save to Database) -``` + +Python requires E2B. It is enabled by default on sim.ai; on a self-hosted instance, enable E2B to see Python in the language dropdown. The sandbox includes the Python standard library and common packages like `matplotlib`, and any figures you generate are captured as images automatically. + -### Example: Loyalty Score Calculator +## Examples + +### Reshape an API response + + + +The Function reads ``, returns just the field the rest of the workflow needs, and exposes it as ``. + +### Validate input before writing + + + +The Function sanitizes the form input and returns the clean value, which the API block sends as its body. + +### A worked example: loyalty score ```javascript title="loyalty-calculator.js" -// Process customer data and calculate loyalty score const { purchaseHistory, accountAge, supportTickets } = ; -// Calculate metrics -const totalSpent = purchaseHistory.reduce((sum, purchase) => sum + purchase.amount, 0); +const totalSpent = purchaseHistory.reduce((sum, p) => sum + p.amount, 0); const purchaseFrequency = purchaseHistory.length / (accountAge / 365); const ticketRatio = supportTickets.resolved / supportTickets.total; -// Calculate loyalty score (0-100) -const spendScore = Math.min(totalSpent / 1000 * 30, 30); +const spendScore = Math.min((totalSpent / 1000) * 30, 30); const frequencyScore = Math.min(purchaseFrequency * 20, 40); const supportScore = ticketRatio * 30; - const loyaltyScore = Math.round(spendScore + frequencyScore + supportScore); return { customer: , loyaltyScore, - loyaltyTier: loyaltyScore >= 80 ? "Platinum" : loyaltyScore >= 60 ? "Gold" : "Silver", - metrics: { spendScore, frequencyScore, supportScore } + loyaltyTier: loyaltyScore >= 80 ? 'Platinum' : loyaltyScore >= 60 ? 'Gold' : 'Silver', }; ``` @@ -73,176 +100,59 @@ return { ```python title="loyalty-calculator.py" import json -# Reference outputs from other blocks using angle bracket syntax data = json.loads('') purchase_history = data["purchaseHistory"] account_age = data["accountAge"] support_tickets = data["supportTickets"] -# Calculate metrics total_spent = sum(p["amount"] for p in purchase_history) purchase_frequency = len(purchase_history) / (account_age / 365) ticket_ratio = support_tickets["resolved"] / support_tickets["total"] -# Calculate loyalty score (0-100) spend_score = min(total_spent / 1000 * 30, 30) frequency_score = min(purchase_frequency * 20, 40) support_score = ticket_ratio * 30 - loyalty_score = round(spend_score + frequency_score + support_score) tier = "Platinum" if loyalty_score >= 80 else "Gold" if loyalty_score >= 60 else "Silver" - -result = { - "customer": data["name"], - "loyaltyScore": loyalty_score, - "loyaltyTier": tier, - "metrics": { - "spendScore": spend_score, - "frequencyScore": frequency_score, - "supportScore": support_score - } -} -print(json.dumps(result)) +print(json.dumps({ "customer": data["name"], "loyaltyScore": loyalty_score, "loyaltyTier": tier })) ``` -## Python Support - -The Function block supports Python as an alternative to JavaScript. Python code runs in a secure [E2B](https://e2b.dev) cloud sandbox. - -
- Function block with Python selected -
- -### Enabling Python - -Select **Python** from the language dropdown in the Function block. Python execution requires E2B to be enabled on your Sim instance. - - -If you don't see Python as an option in the language dropdown, E2B is not enabled. This only applies to self-hosted instances — E2B is enabled by default on sim.ai. - - - -Python code always runs in the E2B sandbox, even for simple scripts without imports. This ensures a secure, isolated execution environment. - - -### Returning Results +## Large inputs -In Python, print your result as JSON to stdout. The Function block captures stdout and makes it available via ``: +Sim hands a Function block its code, parameters, and resolved references in one request, so very large values are kept by reference rather than inlined. -```python title="example.py" -import json - -data = {"status": "processed", "count": 42} -print(json.dumps(data)) -``` - -### Available Libraries - -The E2B sandbox includes the Python standard library (`json`, `re`, `datetime`, `math`, `os`, `collections`, etc.) and common packages like `matplotlib` for visualization. Charts generated with matplotlib are captured as images automatically. - - - The exact set of pre-installed packages depends on the E2B sandbox configuration. If a package you need isn't available, consider calling an external API from your code instead. - - -### Matplotlib Charts - -When your Python code generates matplotlib figures, they are automatically captured and returned as base64-encoded PNG images in the output: - -```python title="chart.py" -import matplotlib.pyplot as plt -import json - -data = json.loads('') - -plt.figure(figsize=(10, 6)) -plt.bar(data["labels"], data["values"]) -plt.title("Monthly Revenue") -plt.xlabel("Month") -plt.ylabel("Revenue ($)") -plt.savefig("chart.png") -plt.show() -``` - -{/* TODO: Screenshot of Python code execution output in the logs panel */} - -### JavaScript vs. Python - -| | JavaScript | Python | -|--|-----------|--------| -| **Execution** | Local VM (fast) or E2B sandbox (with imports) | Always E2B sandbox | -| **Returning results** | `return { ... }` | `print(json.dumps({ ... }))` | -| **HTTP requests** | `fetch()` built-in | `requests` or `httpx` | -| **Best for** | Quick transforms, JSON manipulation | Data science, charting, complex math | - -## Best Practices - -### Large Inputs and Payload Limits - -Function blocks receive their code, parameters, resolved references, and previous block context in an internal execution request. Sim can safely reference oversized workflow outputs, such as large `loop.results` or `parallel.results`, when you select a smaller nested field like ``. Larger values are stored in execution storage and passed around as small references until code explicitly reads them. +Prefer a narrow reference over a whole large value: use `` instead of ``. If a JavaScript function without imports does reference a whole large value, Sim rewrites it to a lazy server-side read automatically. -File outputs are metadata-first by default. Referencing ``, ``, or similar metadata does not hydrate file contents. In JavaScript functions without imports, a direct base64 reference like `` is automatically rewritten to a lazy server-side read so the base64 string does not cross the Function request body. - -You can also call the helper explicitly: +Files are metadata-first: reading `` or `` does not load the file's contents. Read content on demand with the `sim.files` helpers (JavaScript without imports only): ```javascript const file = ; -const base64 = await sim.files.readBase64(file); +const text = await sim.files.readText(file); +const chunk = await sim.files.readTextChunk(file, { offset: 0, length: 1024 * 1024 }); +const bytes = await sim.files.readBase64Chunk(file, { offset: 0, length: 1024 * 1024 }); ``` -`sim.files.readBase64(file)`, `sim.files.readText(file)`, `sim.files.readBase64Chunk(file, { offset, length })`, and `sim.files.readTextChunk(file, { offset, length })` read from server-side execution storage under memory caps. `sim.values.read(ref)` explicitly reads a large execution value reference, and `sim.values.readArray(ref)` reads a manifest-backed large array. These helpers are available only in JavaScript functions without imports. JavaScript with imports, Python, and shell do not support these lazy helpers yet. - -Very large full reads can still fail by design; use chunk helpers or return a file when you need to handle more data. - -Use text chunks for text-like files such as logs, CSV, JSONL, and markdown: - -```javascript -const file = ; -const firstMegabyte = await sim.files.readTextChunk(file, { - offset: 0, - length: 1024 * 1024, -}); - -return firstMegabyte.split('\n').slice(0, 10); -``` +`sim.files.readText`, `readBase64`, and the `…Chunk` variants stream from execution storage under memory caps. `sim.values.read(ref)` and `sim.values.readArray(ref)` read large value and array references. Chunk `offset` and `length` are byte-based, so for exact Unicode parsing prefer smaller structured references. For large generated data, write the result to a file or table with `outputPath`, `outputSandboxPath`, or `outputTable` instead of returning the whole payload inline. -Use base64 chunks for binary files such as images, PDFs, audio, archives, or APIs that expect base64 input: - -```javascript -const file = ; -const firstMegabyteBase64 = await sim.files.readBase64Chunk(file, { - offset: 0, - length: 1024 * 1024, -}); - -return { name: file.name, chunk: firstMegabyteBase64 }; -``` - -Chunk `offset` and `length` are byte-based. For Unicode text, a chunk can split a multi-byte character at the boundary; use text chunks for approximate text processing and prefer smaller structured references when exact parsing matters. - -Avoid passing a full large object into a Function block when you only need one field. For example, prefer `` over `` when the API response is large. If a JavaScript Function without imports references a whole large execution value, Sim automatically rewrites it to `sim.values.read(...)` at runtime under memory caps. If the value is a manifest-backed array, Sim rewrites it to `sim.values.readArray(...)` so array variables can stay compact between blocks. + +The lazy `sim.files` and `sim.values` helpers are available only in JavaScript functions without imports. JavaScript with imports, Python, and shell do not support them yet. + -For large generated data, write the result to a file or table with `outputPath`, `outputSandboxPath`, or `outputTable` instead of returning the entire payload inline. +## Best Practices -- **Keep functions focused**: Write functions that do one thing well to improve maintainability and debugging -- **Handle errors gracefully**: Use try/catch blocks to handle potential errors and provide meaningful error messages -- **Test edge cases**: Ensure your code handles unusual inputs, null values, and boundary conditions correctly -- **Optimize for performance**: Be mindful of computational complexity and memory usage for large datasets -- **Use console.log() for debugging**: Leverage stdout output to debug and monitor function execution +- **Keep each function focused.** One transform per block is easier to read, test, and debug. +- **Handle errors.** Wrap risky code in `try`/`catch` and return a clear message, or let it throw to the error path. +- **Reference only what you need.** Pull a narrow field rather than a whole large object to keep values out of the request body. +- **Use stdout to debug.** `console.log()` and `print()` land in `` and the run logs. or . Do not wrap these references in quotes — the system replaces them with actual values before execution. For environment variables, use double curly braces: {{API_KEY}}." }, - { question: "What does the Function block return?", answer: "The Function block has two outputs: result (the return value of your code, accessed via ) and stdout (anything logged with console.log(), accessed via ). Make sure your code includes a return statement if you need to pass data to downstream blocks." }, - { question: "Can I make HTTP requests from a Function block?", answer: "Yes. The fetch() API is available in the JavaScript execution environment. You can use async/await with fetch to call external APIs. However, you cannot use libraries like axios or request — only the built-in fetch is supported. Your code runs inside an async context automatically, so you can use await directly." }, - { question: "Is there a timeout for Function block execution?", answer: "Yes. Function blocks have a configurable execution timeout. If your code exceeds the timeout, the execution is terminated and the block reports an error. Keep this in mind when making external API calls or processing large datasets." }, + { question: "What languages does the Function block support?", answer: "JavaScript and Python. JavaScript is the default. Python requires the E2B feature, since Python always runs in a secure E2B sandbox." }, + { question: "When does code run locally vs. in a sandbox?", answer: "JavaScript without external imports runs in a local isolated sandbox for speed. JavaScript that uses import or require runs in E2B. Python always runs in the E2B sandbox, with or without imports." }, + { question: "How do I reference outputs from other blocks inside my code?", answer: "Use angle-bracket syntax directly, like or , with no quotes around the tag — Sim replaces it with the real value before execution. For environment variables, use double curly braces: {{API_KEY}}." }, + { question: "What does the Function block return?", answer: "Two outputs: result (the return value of your code, read as ) and stdout (anything logged with console.log or print, read as ). Include a return statement in JavaScript, or print JSON in Python, to pass data downstream." }, + { question: "Can I make HTTP requests from a Function block?", answer: "Yes. fetch() is available in JavaScript with async/await; libraries like axios are not, only the built-in fetch. In Python, use requests or httpx in the E2B sandbox." }, + { question: "Is there a timeout for Function block execution?", answer: "Yes, a configurable execution timeout. If your code exceeds it, the run is terminated and the block reports an error. Keep this in mind for external calls or heavy processing." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/guardrails.mdx b/apps/docs/content/docs/en/blocks/guardrails.mdx index f363a4c5f07..f9e60bf8c12 100644 --- a/apps/docs/content/docs/en/blocks/guardrails.mdx +++ b/apps/docs/content/docs/en/blocks/guardrails.mdx @@ -1,90 +1,55 @@ --- title: Guardrails +description: The Guardrails block checks content against a validation type before it moves through the workflow. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Image } from '@/components/ui/image' +import { + BlockPreview, + WorkflowPreview, + GUARDRAILS_JSON_WORKFLOW, + GUARDRAILS_HALLUCINATION_WORKFLOW, + GUARDRAILS_PII_WORKFLOW, +} from '@/components/workflow-preview' import { Video } from '@/components/ui/video' import { FAQ } from '@/components/ui/faq' -The Guardrails block validates and protects your AI workflows by checking content against multiple validation types. Ensure data quality, prevent hallucinations, detect PII, and enforce format requirements before content moves through your workflow. +The **Guardrails block** checks content against one validation type and reports whether it passed. Use it to catch malformed JSON, off-pattern text, ungrounded answers, or PII before the content moves on. Each block runs one check; chain several to apply more than one. -
- Guardrails Block -
+ ## Validation Types -### JSON Validation - -Validates that content is properly formatted JSON. Perfect for ensuring structured LLM outputs can be safely parsed. - -**Use Cases:** -- Validate JSON responses from Agent blocks before parsing -- Ensure API payloads are properly formatted -- Check structured data integrity - -**Output:** -- `passed`: `true` if valid JSON, `false` otherwise -- `error`: Error message if validation fails (e.g., "Invalid JSON: Unexpected token...") - -### Regex Validation +### Valid JSON -Checks if content matches a specified regular expression pattern. +Checks that the content parses as valid JSON. Use it before a [Function](/blocks/function) or downstream block reads a model's structured output. -**Use Cases:** -- Validate email addresses -- Check phone number formats -- Verify URLs or custom identifiers -- Enforce specific text patterns +- `` — `true` if the content is valid JSON +- `` — the parse error when it isn't, like `Invalid JSON: Unexpected token` -**Configuration:** -- **Regex Pattern**: The regular expression to match against (e.g., `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` for emails) +### Regex Match -**Output:** -- `passed`: `true` if content matches pattern, `false` otherwise -- `error`: Error message if validation fails +Checks the content against a regular expression — an email, a phone number, a URL, or any pattern you define. -### Hallucination Detection +- **Regex Pattern** — the expression to match, like `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` for an email +- `` — `true` if the content matches; `` otherwise -Uses Retrieval-Augmented Generation (RAG) with LLM scoring to detect when AI-generated content contradicts or isn't grounded in your knowledge base. +### Hallucination Check -**How It Works:** -1. Queries your knowledge base for relevant context -2. Sends both the AI output and retrieved context to an LLM -3. LLM assigns a confidence score (0-10 scale) - - **0** = Full hallucination (completely ungrounded) - - **10** = Fully grounded (completely supported by knowledge base) -4. Validation passes if score ≥ threshold (default: 3) +Scores how well AI output is grounded in a knowledge base. The block retrieves relevant context, sends it to a model with the output, and the model returns a confidence score from **0** (completely ungrounded) to **10** (fully supported). Validation passes when the score meets the threshold. -**Configuration:** -- **Knowledge Base**: Select from your existing knowledge bases -- **Model**: Choose LLM for scoring (requires strong reasoning - GPT-4o, Claude 3.7 Sonnet recommended) -- **API Key**: Authentication for selected LLM provider (auto-hidden for hosted/Ollama or VLLM compatible models) -- **Confidence**: Minimum score to pass (0-10, default: 3) -- **Top K** (Advanced): Number of knowledge base chunks to retrieve (default: 5) +- **Knowledge Base** — the knowledge base to check against +- **Model** — the model that scores grounding. Use a strong reasoning model; the default is `claude-sonnet-4-6`. The API key is supplied for you on hosted Sim +- **Confidence** — the minimum score to pass, from 0 to 10 (default 3) +- **Top K** (advanced) — how many knowledge base chunks to retrieve (default 5) -**Output:** -- `passed`: `true` if confidence score ≥ threshold -- `score`: Confidence score (0-10) -- `reasoning`: LLM's explanation for the score -- `error`: Error message if validation fails - -**Use Cases:** -- Validate Agent responses against documentation -- Ensure customer support answers are factually accurate -- Verify generated content matches source material -- Quality control for RAG applications +Outputs `` (0–10) and `` (why the model scored it that way) alongside `passed`. ### PII Detection -Detects personally identifiable information using Microsoft Presidio. Supports over 30 entity types across multiple countries and languages. +Detects personally identifiable information with [Microsoft Presidio](https://microsoft.github.io/presidio/) — over 30 entity types across several countries and languages.
-**How It Works:** -1. Pass content to validate (e.g., ``) -2. Select PII types to detect using the modal selector -3. Choose the action (Block Request or Mask PII) -4. Content is scanned for matching PII entities -5. Returns detection results and optionally masked text -
-**Configuration:** -- **PII Types to Detect**: Select from grouped categories via modal selector - - **Common**: Person name, Email, Phone, Credit card, IP address, etc. - - **USA**: SSN, Driver's license, Passport, Bank account number, ITIN - - **UK**: NHS number, National insurance number - - **Spain**: NIF, NIE - - **Italy**: Fiscal code, Driver's license, Identity card, Passport - - **Poland**: PESEL - - **Singapore**: NRIC/FIN - - **Australia**: ABN, ACN, TFN, Medicare - - **India**: Aadhaar, PAN, Vehicle registration, Voter number, Passport -- **Action**: - - **Block Request**: Only identify PII (default) - - **Mask PII**: Replace detected PII with masked values -- **Language**: Detection language (default: English) - -**Output:** -- `passed`: `false` if any selected PII types are detected -- `detectedEntities`: Array of detected PII with type, location, and confidence -- `maskedText`: Content with PII masked (only if mode = "Mask") -- `error`: Error message if validation fails - -**Use Cases:** -- Block content containing sensitive personal information -- Mask PII before logging or storing data -- Compliance with GDPR and other privacy regulations -- Sanitize user inputs before processing +- **PII Types to Detect** — pick the entity types from the modal, grouped by region: + - **Common** — person name, email, phone, credit card, IP address, and more + - **USA** — SSN, driver's license, passport, bank account, ITIN + - **UK** — NHS number, national insurance number + - **Spain** — NIF, NIE · **Italy** — fiscal code, driver's license, identity card, passport · **Poland** — PESEL · **Singapore** — NRIC/FIN + - **Australia** — ABN, ACN, TFN, Medicare · **India** — Aadhaar, PAN, vehicle registration, voter number, passport +- **Action** — **Block** fails validation when any selected type is found (default); **Mask** also replaces the PII with masked values +- **Language** — the detection language (default English) + +Outputs `` (each with type, location, and confidence) and, in Mask mode, ``. `passed` is `false` when any selected PII is found. ## Configuration ### Content to Validate -The input content to validate. This typically comes from: -- Agent block outputs: `` -- Function block results: `` -- API responses: `` -- Any other block output +The input to check. Usually an earlier output like ``, ``, or an [API](/blocks/api) response. ### Validation Type -Choose from four validation types: -- **Valid JSON**: Check if content is properly formatted JSON -- **Regex Match**: Verify content matches a regex pattern -- **Hallucination Check**: Validate against knowledge base with LLM scoring -- **PII Detection**: Detect and optionally mask personally identifiable information +Which of the four checks to run: Valid JSON, Regex Match, Hallucination Check, or PII Detection. ## Outputs -All validation types return: +Every validation type returns: + +| Output | What it is | +| --- | --- | +| `` | Whether the check passed | +| `` | The check that ran | +| `` | The content that was checked | +| `` | The failure message, when there is one | -- **``**: Boolean indicating if validation passed -- **``**: The type of validation performed -- **``**: The original input that was validated -- **``**: Error message if validation failed (optional) +Hallucination adds `` and ``; PII adds `` and ``. -Additional outputs by type: +## Examples -**Hallucination Check:** -- **``**: Confidence score (0-10) -- **``**: LLM's explanation +### Validate JSON before parsing -**PII Detection:** -- **``**: Array of detected PII entities -- **``**: Content with PII masked (if mode = "Mask") + -## Example Use Cases +Check the Agent's output is valid JSON, then branch on `` before a Function parses it. -**Validate JSON Before Parsing** - Ensure Agent output is valid JSON -``` -Agent (Generate) → Guardrails (Validate) → Condition (Check passed) → Function (Parse) -``` +### Prevent hallucinations -**Prevent Hallucinations** - Validate customer support responses against knowledge base -``` -Agent (Response) → Guardrails (Check KB) → Condition (Score ≥ 3) → Send or Flag -``` + -**Block PII in User Inputs** - Sanitize user-submitted content -``` -Input → Guardrails (Detect PII) → Condition (No PII) → Process or Reject -``` +Score the answer against a knowledge base, then gate on `` to send a grounded answer or flag a weak one. + +### Block PII in user input + + + +Detect PII in the input and branch on `` to process clean input or reject it. ## Best Practices -- **Chain with Condition blocks**: Use `` to branch workflow logic based on validation results -- **Use JSON validation before parsing**: Always validate JSON structure before attempting to parse LLM outputs -- **Choose appropriate PII types**: Only select the PII entity types relevant to your use case for better performance -- **Set reasonable confidence thresholds**: For hallucination detection, adjust threshold based on your accuracy requirements (higher = stricter) -- **Use strong models for hallucination detection**: GPT-4o or Claude 3.7 Sonnet provide more accurate confidence scoring -- **Mask PII for logging**: Use "Mask" mode when you need to log or store content that may contain PII -- **Test regex patterns**: Validate your regex patterns thoroughly before deploying to production -- **Monitor validation failures**: Track `` messages to identify common validation issues +- **Branch on the result.** Read `` in a [Condition](/blocks/condition) to route valid and invalid content down different paths. +- **Validate JSON before you parse it.** A check upstream is cheaper than a parse error in a Function block. +- **Pick only the PII types you need.** Selecting fewer entity types keeps detection fast and focused. +- **Tune the hallucination threshold.** Raise the confidence floor for stricter grounding, lower it to allow more latitude. +- **Mask when you log.** Use Mask mode for content you store or log, so PII never lands in plain text. +- **Chain checks.** One block runs one type, so place several in sequence to validate format and then scan for PII. - Guardrails validation happens synchronously in your workflow. For hallucination detection, choose faster models (like GPT-4o-mini) if latency is critical. +Guardrails runs synchronously in the workflow. For hallucination checks where latency matters, choose a faster model. - diff --git a/apps/docs/content/docs/en/blocks/human-in-the-loop.mdx b/apps/docs/content/docs/en/blocks/human-in-the-loop.mdx index 5e047457ae5..8e1657b3a15 100644 --- a/apps/docs/content/docs/en/blocks/human-in-the-loop.mdx +++ b/apps/docs/content/docs/en/blocks/human-in-the-loop.mdx @@ -1,26 +1,25 @@ --- title: Human in the Loop +description: The Human in the Loop block pauses a run for human approval, then resumes with their input. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' +import { + BlockPreview, + WorkflowPreview, + HITL_APPROVAL_WORKFLOW, + HITL_MULTISTAGE_WORKFLOW, + HITL_VALIDATE_WORKFLOW, +} from '@/components/workflow-preview' import { Video } from '@/components/ui/video' import { FAQ } from '@/components/ui/faq' -The Human in the Loop block pauses workflow execution and waits for human intervention before continuing. Use it to add approval gates, collect feedback, or gather additional input at critical decision points. +The **Human in the Loop block** pauses a run and waits for a person before it continues. Use it for approval gates, to collect feedback, or to gather input at a decision point. The run stays paused — with no timeout — until someone responds through the approval portal, the API, or a webhook. -
- Human in the Loop Block Configuration -
- -When execution reaches this block, the workflow pauses indefinitely until a human provides input through the approval portal, API, or webhook. +
-## Configuration Options +## Configuration ### Display Data -Defines what data is displayed to the approver. This is the context shown in the approval portal to help them make an informed decision. - -Use the visual builder or JSON editor to structure the data. Reference workflow variables using `` syntax. +What the approver sees — the context shown in the portal to help them decide. Build it field by field or as JSON, referencing earlier outputs with ``. ```json { @@ -51,19 +48,17 @@ Use the visual builder or JSON editor to structure the data. Reference workflow ### Notification -Configures how approvers are alerted when approval is needed. Supported channels include: - -- **Slack** - Messages to channels or DMs -- **Gmail** - Email with approval link -- **Microsoft Teams** - Team channel notifications -- **SMS** - Text alerts via Twilio -- **Webhooks** - Custom notification systems +How approvers are alerted that a decision is waiting. Include the approval URL (``) in the message so they can open the portal. Available channels: -Include the approval URL (``) in your notification messages so approvers can access the portal. +- **Slack** — a message to a channel or DM +- **Gmail** — an email with the approval link +- **Microsoft Teams** — a channel notification +- **SMS** — a text alert via Twilio +- **Webhook** — a request to your own notification system ### Resume Form -Defines the fields approvers fill in when responding. This data becomes available to downstream blocks after the workflow resumes. +The fields the approver fills in when responding. Each becomes available to downstream blocks once the run resumes. ```json { @@ -213,40 +208,40 @@ When triggering a workflow via the execute API (`POST /api/workflows/{id}/execut -## Common Use Cases +## Examples -**Content Approval** - Review AI-generated content before publishing -``` -Agent → Human in the Loop → API (Publish) -``` +### Approve content before it ships -**Multi-Stage Approvals** - Chain multiple approval steps for high-stakes decisions -``` -Agent → Human in the Loop (Manager) → Human in the Loop (Director) → Execute -``` + -**Data Validation** - Verify extracted data before processing -``` -Agent (Extract) → Human in the Loop (Validate) → Function (Process) -``` +The run pauses at the Human in the Loop block until someone approves; on resume, the API publishes. The same gate works before any action, like sending a customer email. -**Quality Control** - Review AI outputs before sending to customers -``` -Agent (Generate) → Human in the Loop (QA) → Gmail (Send) -``` +### Chain multiple approvals + + + +For a high-stakes change, chain two approval steps — a manager, then a director — before the workflow executes. + +### Verify extracted data + + + +A reviewer checks the data an Agent extracted before a Function processes it. -## Block Outputs +## Outputs -**`url`** - Unique URL for the approval portal -**`resumeEndpoint`** - Resume API endpoint URL -**`response`** - Display data shown to the approver (json) -**`submission`** - Form submission data from the approver (json) -**`submittedAt`** - ISO timestamp when the workflow was resumed -**``** - All fields defined in Resume Form become available at the top level after the workflow resumes +| Output | What it is | +| --- | --- | +| `url` | The approval portal URL | +| `resumeEndpoint` | The resume API endpoint | +| `response` | The display data shown to the approver | +| `submission` | The approver's form submission | +| `submittedAt` | ISO timestamp of when the run resumed | +| `` | Each Resume Form field, by name, after the run resumes | -Access using ``. +Read them downstream as `` — for a block named `approval`, that's ``. -## Example +## The approval portal **Paused Output:** ```json diff --git a/apps/docs/content/docs/en/blocks/index.mdx b/apps/docs/content/docs/en/blocks/index.mdx deleted file mode 100644 index 5e91e36e700..00000000000 --- a/apps/docs/content/docs/en/blocks/index.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Overview -description: The building components of your AI workflows ---- - -import { Card, Cards } from 'fumadocs-ui/components/card' -import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -Blocks are the building components you connect together to create AI workflows. Think of them as specialized modules that each handle a specific task—from chatting with AI models to making API calls or processing data. - -
-
- -## Core Block Types - -Sim provides essential block types that handle the core functions of AI workflows: - -### Processing Blocks -- **[Agent](/blocks/agent)** - Chat with AI models (OpenAI, Anthropic, Google, local models) -- **[Function](/blocks/function)** - Run custom JavaScript/TypeScript code -- **[API](/blocks/api)** - Connect to external services via HTTP requests - -### Logic Blocks -- **[Condition](/blocks/condition)** - Branch workflow paths based on boolean expressions -- **[Router](/blocks/router)** - Use AI to intelligently route requests to different paths -- **[Evaluator](/blocks/evaluator)** - Score and assess content quality using AI - -### Control Flow Blocks -- **[Variables](/blocks/variables)** - Set and manage workflow-scoped variables -- **[Wait](/blocks/wait)** - Pause workflow execution for a specified time delay -- **[Human in the Loop](/blocks/human-in-the-loop)** - Pause for human approval and feedback before continuing - -### Output Blocks -- **[Response](/blocks/response)** - Format and return final results from your workflow - -## How Blocks Work - -Each block has three main components: - -**Inputs**: Data coming into the block from other blocks or user input -**Configuration**: Settings that control how the block behaves -**Outputs**: Data the block produces for other blocks to use - - - - Receive Input: Block receives data from connected blocks or user input - - - Process: Block processes the input according to its configuration - - - Output Results: Block produces output data for the next blocks in the workflow - - - -## Connecting Blocks - -You create workflows by connecting blocks together. The output of one block becomes the input of another: - -- **Drag to connect**: Drag from an output port to an input port -- **Multiple connections**: One output can connect to multiple inputs -- **Branching paths**: Some blocks can route to different paths based on conditions - -
-
- -## Common Patterns - -### Sequential Processing -Connect blocks in a chain where each block processes the output of the previous one: -``` -User Input → Agent → Function → Response -``` - -### Conditional Branching -Use Condition or Router blocks to create different paths: -``` -User Input → Router → Agent A (for questions) - → Agent B (for commands) -``` - -### Quality Control -Use Evaluator blocks to assess and filter outputs: -``` -Agent → Evaluator → Condition → Response (if good) - → Agent (retry if bad) -``` - -## Block Configuration - -Each block type has specific configuration options: - -**All Blocks**: -- Input/output connections -- Error handling behavior -- Execution timeout settings - -**AI Blocks** (Agent, Router, Evaluator): -- Model selection (OpenAI, Anthropic, Google, local) -- API keys and authentication -- Temperature and other model parameters -- System prompts and instructions - -**Logic Blocks** (Condition, Function): -- Custom expressions or code -- Variable references -- Execution environment settings - -**Integration Blocks** (API, Response): -- Endpoint configuration -- Headers and authentication -- Request/response formatting - - - - Connect to AI models and create intelligent responses - - - Run custom code to process and transform data - - - Integrate with external services and APIs - - - Create branching logic based on data evaluation - - - Pause for human approval and feedback before continuing - - - Set and manage workflow-scoped variables - - - Pause workflow execution for specified time delays - - - - diff --git a/apps/docs/content/docs/en/blocks/loop.mdx b/apps/docs/content/docs/en/blocks/loop.mdx index e96d8d91148..432c3f36d1d 100644 --- a/apps/docs/content/docs/en/blocks/loop.mdx +++ b/apps/docs/content/docs/en/blocks/loop.mdx @@ -1,258 +1,124 @@ --- title: Loop +description: The Loop block is a container that runs the blocks inside it repeatedly — over a collection, a count, or while a condition holds. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' +import { WorkflowPreview, LOOP_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Loop block is a container that executes blocks repeatedly. Iterate over collections, repeat operations a fixed number of times, or continue while a condition is met. +The **Loop block** is a container that runs the blocks inside it repeatedly — over each item in a collection, a fixed number of times, or while a condition holds. Drop blocks inside it, and they run once per iteration. Iterations run **one after another**; for concurrent work, use a [Parallel](/blocks/parallel) block. - - Loop blocks are container nodes that hold other blocks inside them. The contained blocks execute multiple times based on your configuration. - - -## Configuration Options - -### Loop Type - -Choose between four types of loops: +## Loop Types - + - **For Loop (Iterations)** - A numeric loop that executes a fixed number of times: - + A **For** loop runs a fixed number of times. Set the iteration count. +
- For Loop with iterations + For loop with iterations
- - Use this when you need to repeat an operation a specific number of times. - - ``` - Example: Run 5 times - - Iteration 1 - - Iteration 2 - - Iteration 3 - - Iteration 4 - - Iteration 5 - ```
- **ForEach Loop (Collection)** - A collection-based loop that iterates over each item in an array or object: - + A **ForEach** loop runs once per item in an array or object, exposing the current item as ``. +
- ForEach Loop with collection + ForEach loop with a collection
- - Use this when you need to process a collection of items. - - ``` - Example: Process ["apple", "banana", "orange"] - - Iteration 1: Process "apple" - - Iteration 2: Process "banana" - - Iteration 3: Process "orange" - ```
- **While Loop (Condition-based)** - Continues executing while a condition evaluates to true: - + A **While** loop runs as long as a condition is true. The condition is checked **before** each iteration, so the body may run zero times. +
- While Loop with condition + While loop with a condition
- - Use this when you need to loop until a specific condition is met. The condition is checked **before** each iteration. - - ``` - Example: While {""} < 10 - - Check condition → Execute if true - - Inside loop: Increment {""} - - Inside loop: Variables assigns i = {""} + 1 - - Check condition → Execute if true - - Check condition → Exit if false - ```
- **Do-While Loop (Condition-based)** - Executes at least once, then continues while a condition is true: - + A **Do-While** loop runs the body once, then repeats while a condition is true. The condition is checked **after** each iteration, so the body always runs at least once. +
- Do-While Loop with condition + Do-While loop with a condition
- - Use this when you need to execute at least once, then loop until a condition is met. The condition is checked **after** each iteration. - - ``` - Example: Do-while {""} < 10 - - Execute blocks - - Inside loop: Increment {""} - - Inside loop: Variables assigns i = {""} + 1 - - Check condition → Continue if true - - Check condition → Exit if false - ```
-## How to Use Loops +## Configuration -### Creating a Loop +Set the loop type, then the value it needs: -1. Drag a Loop block from the toolbar onto your canvas -2. Configure the loop type and parameters -3. Drag other blocks inside the loop container -4. Connect the blocks as needed +- **Iterations** — how many times to run (For loops) +- **Collection** — the array or object to iterate (ForEach loops) +- **Condition** — the boolean expression to check (While and Do-While loops) -### Referencing Loop Data +## Referencing loop data -There's an important distinction between referencing loop data from **inside** vs **outside** the loop: +References differ inside the loop and after it. - + - **Inside the loop**, use `` references to access the current iteration context: - - - **``**: Current iteration number (0-based) - - **``**: Current item being processed (forEach only) - - **``**: Full collection being iterated (forEach only) - - ``` - // Inside a Function block within the loop - const idx = ; // 0, 1, 2, ... - const item = ; // Current item + Inside the loop, read the current iteration with ``: + + - `` — the iteration number, starting at 0 + - `` — the current item (ForEach only) + - `` — the full collection (ForEach only) + + ```javascript + const idx = ; // 0, 1, 2, ... + const item = ; // the current item ``` - + - These references are only available for blocks **inside** the loop container. They give you access to the current iteration's context. + These are only available to blocks inside the loop container. - **Outside the loop** (after it completes), reference the loop block by its name to access aggregated results: - - - **``**: Array of results from all iterations - - ``` - // If your loop block is named "Process Items" - const allResults = ; - // Returns: [result1, result2, result3, ...] + After the loop, read the collected results by the loop block's name — not ``: + + ```javascript + // a loop named "Process Items" + const all = ; // [result1, result2, ...] ``` - + - After the loop completes, use the loop's block name (not `loop.`) to access the collected results. The block name is normalized (lowercase, no spaces). + The name is normalized — lowercase, no spaces. `` only works inside. -## Example Use Cases - -**Processing API Results** - ForEach loop processes customer records from an API -``` -API (Fetch) → Loop (ForEach) → Agent (Analyze) → Function (Store) -``` +## Examples -**Iterative Content Generation** - For loop generates multiple content variations -``` -Loop (5x) → Agent (Generate) → Evaluator (Score) → Function (Select Best) -``` + -**Counter with While Loop** - While loop processes items with counter -``` -Variables (i=0) → Loop (While i<10) → Agent (Process) → Variables (i++) -``` +A ForEach loop scores each review and collects the results; after the loop finishes, an Agent summarizes ``. The same container holds the blocks for any loop type: -## Advanced Features +- **Process API results** — `API (Fetch) → Loop (ForEach) → Agent (Analyze) → Function (Store)` +- **Generate variations** — `Loop (5×) → Agent (Generate) → Evaluator (Score) → Function (Select best)` +- **Counter with While** — `Variables (i=0) → Loop (While i<10) → Agent (Process) → Variables (i++)` -### Limitations +## Nesting and limits - Container blocks (Loops and Parallels) support nesting. You can place loops inside loops, parallels inside loops, and any combination of container blocks to build complex multi-dimensional workflows. + Containers nest. You can place loops inside loops, parallels inside loops, and any combination, to build multi-dimensional workflows. - - Loops execute sequentially, not in parallel. If you need concurrent execution, use the Parallel block instead. - - -## Inputs and Outputs - - - -
    -
  • - Loop Type: Choose between 'for', 'forEach', 'while', or 'doWhile' -
  • -
  • - Iterations: Number of times to execute (for loops) -
  • -
  • - Collection: Array or object to iterate over (forEach loops) -
  • -
  • - Condition: Boolean expression to evaluate (while/do-while loops) -
  • -
-
- - Available **inside** the loop only: -
    -
  • - {""}: Current iteration number (0-based) -
  • -
  • - {""}: Current item being processed (forEach only) -
  • -
  • - {""}: Full collection (forEach only) -
  • -
-
- -
    -
  • - {""}: Array of all iteration results (accessed via block name) -
  • -
  • - Structure: Results maintain iteration order -
  • -
  • - Access: Available in blocks after the loop completes -
  • -
-
-
+For and ForEach loops are capped at **1,000 iterations**. While and Do-While loops run until their condition is false, with no hard cap — make sure the condition eventually becomes false so the loop ends. ## Best Practices -- **Set reasonable limits**: Keep iteration counts reasonable to avoid long execution times -- **Use ForEach for collections**: When processing arrays or objects, use ForEach instead of For loops -- **Handle errors gracefully**: Consider adding error handling inside loops for robust workflows +- **Use ForEach for collections.** When you have an array or object, ForEach is clearer than a For loop with manual indexing. +- **Keep iteration counts reasonable.** Each iteration adds to total run time, since the loop runs sequentially. +- **Reach for Parallel when order doesn't matter.** Independent work over a collection runs faster in a [Parallel](/blocks/parallel) block. +- **Guarantee an exit.** For While and Do-While loops, make sure the condition will become false. to get the current item being processed and for the zero-based iteration number. These references are only available to blocks placed inside the loop container — blocks outside the loop cannot access them." }, - { question: "How do I access loop results after it finishes?", answer: "After the loop completes, reference the loop block by its normalized name (lowercase, no spaces) using . This returns an array of all iteration results in order. For example, if your loop block is named 'Process Items', use . Do not use syntax outside the loop — that only works inside." }, - { question: "Can I nest loops inside each other?", answer: "Yes. Container blocks (Loops and Parallels) fully support nesting. You can place loops inside loops, parallels inside loops, loops inside parallels, and any combination. Each nested container maintains its own scope and iteration context independently." }, - { question: "What is the difference between a While loop and a Do-While loop?", answer: "A While loop checks its condition before each iteration, so it may execute zero times if the condition is false initially. A Do-While loop executes its body at least once, then checks the condition after each iteration to decide whether to continue. Use Do-While when you need guaranteed first execution." }, - { question: "What happens if a ForEach loop receives an empty collection?", answer: "If the ForEach loop's collection is empty, the loop body is skipped entirely and the loop outputs an empty results array. The workflow continues normally to any blocks connected after the loop." }, + { question: "What is the maximum number of iterations a loop can run?", answer: "For and ForEach loops are capped at 1,000 iterations. While and Do-While loops with a condition have no hard cap — they run until the condition is false. A Do-While without a condition falls back to a fixed count, also capped at 1,000. Always ensure While/Do-While conditions eventually become false to avoid infinite loops." }, + { question: "Do loops execute iterations in parallel or sequentially?", answer: "Sequentially, one after another. For concurrency across items, use the Parallel block, or nest a Parallel inside a Loop if you need both patterns." }, + { question: "How do I access the current item inside a ForEach loop?", answer: "Use for the current item and for the zero-based iteration number. These are only available to blocks inside the loop container." }, + { question: "How do I access loop results after it finishes?", answer: "Reference the loop block by its normalized name (lowercase, no spaces) with , which returns an array of all iteration results in order. Do not use outside the loop — that only works inside." }, + { question: "Can I nest loops inside each other?", answer: "Yes. Loops and Parallels fully support nesting in any combination, and each nested container keeps its own scope and iteration context." }, + { question: "What is the difference between a While loop and a Do-While loop?", answer: "A While loop checks its condition before each iteration, so it can run zero times. A Do-While loop runs the body once, then checks the condition, so it always runs at least once." }, + { question: "What happens if a ForEach loop receives an empty collection?", answer: "The body is skipped and the loop outputs an empty results array. The workflow continues to whatever is connected after the loop." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/meta.json b/apps/docs/content/docs/en/blocks/meta.json index 2e1ad2ccad4..c00d0ce0973 100644 --- a/apps/docs/content/docs/en/blocks/meta.json +++ b/apps/docs/content/docs/en/blocks/meta.json @@ -1,23 +1,21 @@ { + "title": "Core Blocks", "pages": [ - "index", "agent", "api", - "condition", - "credential", - "evaluator", "function", - "guardrails", - "human-in-the-loop", - "knowledge", + "condition", + "router", "loop", "parallel", "response", - "router", - "table", + "webhook", + "workflow", + "evaluator", + "guardrails", + "human-in-the-loop", "variables", "wait", - "webhook", - "workflow" + "credential" ] } diff --git a/apps/docs/content/docs/en/blocks/parallel.mdx b/apps/docs/content/docs/en/blocks/parallel.mdx index 24fccc7ebf3..f90d26ba0c0 100644 --- a/apps/docs/content/docs/en/blocks/parallel.mdx +++ b/apps/docs/content/docs/en/blocks/parallel.mdx @@ -1,241 +1,113 @@ --- title: Parallel +description: The Parallel block is a container that runs the block inside it concurrently — once per item or a fixed number of times. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' +import { WorkflowPreview, PARALLEL_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Parallel block is a container that executes multiple instances concurrently for faster workflow processing. Process items simultaneously instead of sequentially. +The **Parallel block** is a container that runs the block inside it concurrently — once per item in a collection, or a fixed number of times. It is the concurrent counterpart to a [Loop](/blocks/loop): reach for it when the work is independent and order doesn't matter. - - Parallel blocks are container nodes that execute their contents multiple times simultaneously, unlike loops which execute sequentially. - - -## Configuration Options - -### Parallel Type - -Choose between two types of parallel execution: +## Parallel Types - **Count-based Parallel** - Execute a fixed number of parallel instances: - + Runs a fixed number of identical instances at once. If the count is larger than the batch size, Sim runs serial batches and preserves the original result order. +
- Count-based parallel execution + Count-based parallel execution
- - Use this when you need to run the same operation multiple times concurrently. - If the total count is larger than the batch size, Sim runs the work in serial batches while preserving the original result order. - - ``` - Example: Run 5 parallel instances - - Instance 1 ┐ - - Instance 2 ├─ All execute simultaneously - - Instance 3 │ - - Instance 4 │ - - Instance 5 ┘ - ```
- **Collection-based Parallel** - Distribute a collection across parallel instances: - + Distributes a collection across instances — each one processes a single item as ``. Large collections run in serial batches, preserving each item's index. +
- Collection-based parallel execution + Collection-based parallel execution
- - Each instance processes one item from the collection. Large collections run in serial batches while preserving each item's original index. - - ``` - Example: Process ["task1", "task2", "task3"] in parallel - - Instance 1: Process "task1" ┐ - - Instance 2: Process "task2" ├─ All execute simultaneously - - Instance 3: Process "task3" ┘ - ```
-## How to Use Parallel Blocks +## Configuration -### Creating a Parallel Block +Set the parallel type, then the value it needs: -1. Drag a Parallel block from the toolbar onto your canvas -2. Configure the parallel type and parameters -3. Drag a single block inside the parallel container -4. Connect the block as needed +- **Count** — how many instances to run (count-based) +- **Collection** — the array or object to distribute (collection-based) +- **Batch size** — how many branches run at once, from 1 to 20 (default 20). Lower it to ease off rate-limited APIs -### Referencing Parallel Data +## Referencing parallel data -There's an important distinction between referencing parallel data from **inside** vs **outside** the parallel block: +References differ inside the parallel and after it. - + - **Inside the parallel**, use `` references to access the current instance context: - - - **``**: Current instance number (0-based) - - **``**: Item for this instance (collection-based only) - - **``**: Full collection being distributed (collection-based only) - - ``` - // Inside a Function block within the parallel - const idx = ; // 0, 1, 2, ... - const item = ; // This instance's item - ``` - + Inside, read this instance's context with ``: + + - `` — the instance number, starting at 0 + - `` — this instance's item (collection-based only) + - `` — the full collection (collection-based only) + - These references are only available for blocks **inside** the parallel container. They give you access to the current instance's context. + These are only available to blocks inside the parallel container. - **Outside the parallel** (after it completes), reference the parallel block by its name to access aggregated results: - - - **``**: Array of results from all instances - - ``` - // If your parallel block is named "Process Tasks" - const allResults = ; - // Returns: [result1, result2, result3, ...] + After it finishes, read the collected results by the block's name — not ``: + + ```javascript + // a parallel named "Process Tasks" + const all = ; // [result1, result2, ...] ``` - - - After the parallel completes, use the parallel's block name (not `parallel.`) to access the collected results. The block name is normalized (lowercase, no spaces). - + + For large result sets, reference just the entry or field you need, like `` — Sim keeps results indexable and hydrates oversized entries only when an indexed path is referenced. -## Example Use Cases - -**Batch API Processing** - Process multiple API calls simultaneously -``` -Parallel (Collection) → API (Call Endpoint) → Function (Aggregate) -``` +Each instance runs in isolation: a separate variable scope, no shared state, and a failure in one instance doesn't stop the others. -**Multi-Model AI Processing** - Get responses from multiple AI models concurrently -``` -Parallel (["gpt-4o", "claude-3.7-sonnet", "gemini-2.5-pro"]) → Agent → Evaluator (Select Best) -``` +## Examples -## Advanced Features + -### Result Aggregation +A collection-based Parallel calls an endpoint for each task at the same time, and a Function aggregates `` after they finish. The same container holds the block for either type: -Results from all parallel instances are automatically collected and accessible via the block name: +- **Batch API processing** — `Parallel (Collection) → API (Call Endpoint) → Function (Aggregate)` +- **Multi-model processing** — `Parallel (["model-a", "model-b", "model-c"]) → Agent → Evaluator (Select best)` -```javascript -// In a Function block after a parallel named "Process Tasks" -const allResults = ; -// Returns: [result1, result2, result3, ...] -``` - -For large result sets, reference only the entry or field you need, such as ``. Sim keeps aggregate results indexable by storing oversized entries in execution storage and hydrating them only when an indexed server-side path is explicitly referenced. - -### Batch Size - -Parallel blocks run up to 20 branches at a time by default. Increase the total count or collection size to process more work; Sim will execute the next batch after the current batch finishes. You can lower the batch size to reduce concurrency for rate-limited APIs. - -### Instance Isolation - -Each parallel instance runs independently: -- Separate variable scopes -- No shared state between instances -- Failures in one instance don't affect others +## Parallel vs Loop -### Limitations +| | Parallel | Loop | +| --- | --- | --- | +| **Execution** | Concurrent | Sequential | +| **Order** | Not guaranteed | Preserved | +| **Best for** | Independent work | Dependent steps | +| **Resource use** | Higher | Lower | - - Container blocks (Loops and Parallels) support nesting. You can place parallels inside parallels, loops inside parallels, and any combination of container blocks to build complex multi-dimensional workflows. - +## Nesting and limits - While parallel execution is faster, be mindful of: - - API rate limits when making concurrent requests - - Memory usage with large datasets - - Maximum of 20 concurrent instances per batch to prevent resource exhaustion + Containers nest. You can place parallels inside parallels, loops inside parallels, and any combination, to build multi-dimensional workflows. -## Parallel vs Loop - -Understanding when to use each: - -| Feature | Parallel | Loop | -|---------|----------|------| -| Execution | Concurrent | Sequential | -| Speed | Faster for independent operations | Slower but ordered | -| Order | No guaranteed order | Maintains order | -| Use case | Independent operations | Dependent operations | -| Resource usage | Higher | Lower | - -## Inputs and Outputs - - - -
    -
  • - Parallel Type: Choose between 'count' or 'collection' -
  • -
  • - Count: Number of instances to run (count-based) -
  • -
  • - Collection: Array or object to distribute (collection-based) -
  • -
  • - Batch size: Number of branches to run concurrently, from 1 to 20 -
  • -
-
- - Available **inside** the parallel only: -
    -
  • - {""}: Instance number (0-based) -
  • -
  • - {""}: Item for this instance (collection-based only) -
  • -
  • - {""}: Full collection (collection-based only) -
  • -
-
- -
    -
  • - {""}: Array of all instance results (accessed via block name) -
  • -
  • - Access: Available in blocks after the parallel completes -
  • -
-
-
+A Parallel runs up to **20 branches at a time**. Larger counts or collections run in serial batches once the current batch finishes. Because instances run concurrently, watch for API rate limits and memory use on large datasets. ## Best Practices -- **Independent operations only**: Ensure operations don't depend on each other -- **Handle rate limits**: Add delays or throttling for API-heavy workflows -- **Error handling**: Each instance should handle its own errors gracefully +- **Use it for independent work only.** Instances can't share state, so each one must stand alone. +- **Mind rate limits.** Lower the batch size, or add a [Wait](/blocks/wait), for API-heavy work. +- **Handle errors per instance.** One failure won't stop the others, so each instance should handle its own. +- **Add an identifier if order matters.** Results aren't guaranteed to match input order — include an index or id in each instance's output. where blockname is the normalized name of your Parallel block (lowercase, no spaces). This returns an array containing the results from all instances." }, - { question: "Is the order of results guaranteed?", answer: "No. Because instances execute concurrently, the order of results in the output array is not guaranteed to match the input order. If ordering matters, include an index or identifier in each instance's output." }, - { question: "What is the difference between count-based and collection-based parallel?", answer: "Count-based runs a fixed number of identical instances (e.g., run 5 times). Collection-based distributes items from an array or object across instances, with each instance processing one item. Use count-based for repeated operations and collection-based for batch processing." }, + { question: "What is the maximum number of concurrent instances?", answer: "Twenty at a time. The limit prevents resource exhaustion and keeps execution stable; larger counts run in serial batches." }, + { question: "Can parallel instances share state with each other?", answer: "No. Each instance runs in isolation with its own variable scope, and one instance cannot read or write another's data during execution." }, + { question: "What happens if one parallel instance fails?", answer: "Only that instance fails. The others run independently and continue normally." }, + { question: "Can I nest Parallel blocks inside other Parallel or Loop blocks?", answer: "Yes. Parallels and Loops support nesting in any combination, so you can build multi-dimensional workflows." }, + { question: "How do I access results after the Parallel block completes?", answer: "Use , where blockname is the normalized name of the Parallel block (lowercase, no spaces). It returns an array of results from all instances." }, + { question: "Is the order of results guaranteed?", answer: "No. Because instances run concurrently, result order isn't guaranteed to match input order. If order matters, include an index or identifier in each instance's output." }, + { question: "What is the difference between count-based and collection-based parallel?", answer: "Count-based runs a fixed number of identical instances. Collection-based distributes items from an array or object, one per instance. Use count-based for repeated work and collection-based for batch processing." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/response.mdx b/apps/docs/content/docs/en/blocks/response.mdx index 6ec1872fe14..2a27631d3f1 100644 --- a/apps/docs/content/docs/en/blocks/response.mdx +++ b/apps/docs/content/docs/en/blocks/response.mdx @@ -1,123 +1,98 @@ --- title: Response +description: The Response block ends an API-triggered workflow and returns a structured HTTP response. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { + BlockPreview, + WorkflowPreview, + RESPONSE_API_WORKFLOW, + RESPONSE_ERROR_WORKFLOW, + RESPONSE_WEBHOOK_WORKFLOW, +} from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Response block formats and sends structured HTTP responses back to API callers. Use it to return workflow results with proper status codes and headers. +The **Response block** ends a workflow and returns a structured HTTP response to the caller. Use it with an [API deployment](/deployment/api) to control the exact body, status code, and headers that come back. -
- Response Block Configuration -
+ - Response blocks are exit points — when a Response block executes, it ends the workflow and sends the HTTP response immediately. Multiple Response blocks can be placed on different branches (e.g. after a Router or Condition), but only the first one to execute determines the API response. +A Response block is an **exit point**. When one runs, the workflow ends and the HTTP response is sent immediately. You can place several on different branches (after a [Router](/blocks/router) or [Condition](/blocks/condition)); the first to run determines the response. -## Configuration Options +## Configuration -### Response Data +### Response Data Mode -The response data is the main content that will be sent back to the API caller. This should be formatted as JSON and can include: +**Builder** lays out the response body field by field with types; **Editor** is a raw JSON code editor. Builder fits most cases. -- Static values -- Dynamic references to workflow variables using the `` syntax -- Nested objects and arrays -- Any valid JSON structure +### Response Data -### Status Code +The body sent back, as JSON. Reference any earlier output with a [connection tag](/workflows/connections) — a block output like ``, or a workflow variable like `` — and nest objects and arrays freely. -A free-text input field where you can enter any valid HTTP status code (the default placeholder is 200). Common examples include: +```json +{ + "query": "", + "answer": "", + "model": "" +} +``` -- **200**: OK - Standard success response -- **201**: Created - Resource successfully created -- **400**: Bad Request - Invalid request parameters -- **404**: Not Found - Resource doesn't exist -- **500**: Internal Server Error - Server-side error +### Status Code -Any valid HTTP status code can be entered directly into the field. +Any valid HTTP status code; defaults to `200`. Set `4xx` or `5xx` on error branches (`201` created, `400` bad request, `404` not found, `500` server error). ### Response Headers -Configure additional HTTP headers to include in the response. - -Headers are configured as key-value pairs: +Extra response headers, as key-value pairs: | Key | Value | -|-----|-------| +| --- | --- | | Content-Type | application/json | | Cache-Control | no-cache | | X-API-Version | 1.0 | -## Example Use Cases +## Outputs -**API Endpoint Response** - Return structured data from a search API -``` -Agent (Search) → Function (Format & Paginate) → Response (200, JSON) -``` +A Response block is a terminal block, so nothing reads from it. Its `data`, `status`, and `headers` become the HTTP response itself. A workflow with no Response block returns its last block's output by default; add a Response block when you need exact HTTP control. -**Webhook Confirmation** - Acknowledge webhook receipt and processing -``` -Webhook Trigger → Function (Process) → Response (200, Confirmation) -``` + +Don't place a Response block in [parallel](/blocks/parallel) with blocks that have important side effects. Order across parallel branches is non-deterministic, so the Response may fire before or after them on any given run. + -**Error Response Handling** - Return appropriate error responses -``` -Condition (Error Detected) → Router → Response (400/500, Error Details) -``` +## Examples -## Outputs +### Return data from an API endpoint -Response blocks are exit points — when one executes, no further blocks run. The block defines outputs (`data`, `status`, `headers`) which are used to construct the HTTP response sent back to the API caller. + - - If a Response block is placed on a parallel branch, there are no guarantees about whether other parallel blocks will run or not. Execution order across parallel branches is non-deterministic, so a parallel block may execute before or after the Response block on any given run. Avoid placing Response blocks in parallel with blocks that have important side effects. - +The Response block reads `` into its body and returns `200` to the API caller. -## Variable References +### Acknowledge a webhook -Use the `` syntax to dynamically insert workflow variables into your response: + -```json -{ - "user": { - "id": "", - "name": "", - "email": "" - }, - "query": "", - "results": "", - "totalFound": "", - "processingTime": "ms" -} -``` +After processing the payload, the Response block returns a small confirmation so the sender knows the event was received. - - Variable names are case-sensitive and must match exactly with the variables available in your workflow. - +### Return a different status per branch + + + +A Condition routes valid requests to a `200` Response and invalid ones to a `400`. The first Response to run determines what the caller gets. ## Best Practices -- **Use meaningful status codes**: Choose appropriate HTTP status codes that accurately reflect the outcome of the workflow -- **Structure your responses consistently**: Maintain a consistent JSON structure across all your API endpoints for better developer experience -- **Include relevant metadata**: Add timestamps and version information to help with debugging and monitoring -- **Handle errors gracefully**: Use conditional logic in your workflow to set appropriate error responses with descriptive messages -- **Validate variable references**: Ensure all referenced variables exist and contain the expected data types before the Response block executes +- **Use accurate status codes.** `2xx` for success, `4xx`/`5xx` for errors, set per branch. +- **Keep a consistent response shape** across your endpoints so callers can rely on it. +- **Return a different response per outcome.** Put a Response on each branch after a Condition or Router. +- **Check your references resolve.** A connection tag pointing at a block that did not run comes back empty, so set fields on the branch that produces them. - diff --git a/apps/docs/content/docs/en/blocks/router.mdx b/apps/docs/content/docs/en/blocks/router.mdx index 2aeafa226d6..26eed75326b 100644 --- a/apps/docs/content/docs/en/blocks/router.mdx +++ b/apps/docs/content/docs/en/blocks/router.mdx @@ -1,130 +1,88 @@ --- title: Router +description: The Router block uses a model to pick one of several paths based on the content it reads. +pageType: reference --- -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { Callout } from 'fumadocs-ui/components/callout' +import { + BlockPreview, + WorkflowPreview, + ROUTER_CLASSIFY_WORKFLOW, + ROUTER_LEAD_WORKFLOW, + ROUTER_TRIAGE_WORKFLOW, +} from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Router block uses AI to intelligently route workflows based on content analysis. Unlike Condition blocks that use simple rules, Routers understand context and intent. Each route you define creates a separate output port, allowing you to connect different paths to different downstream blocks. +The **Router block** uses a model to choose one of several paths based on the content it reads. Each route you define adds its own output port, and the model picks the route whose description best fits. Use it when the decision needs to understand intent or unstructured text. When the decision is a plain rule, use a [Condition](/blocks/condition) instead. -
- Router Block with Multiple Route Ports -
+ -## Router vs Condition + +**Router vs Condition.** A Router reads context with a model and picks a route by meaning, so it suits intent-based routing ("send this ticket to the right team") and varying text. A Condition evaluates boolean expressions with no model, so it suits structured data and exact rules. The Router costs tokens per run; the Condition is free and faster. + -**Use Router when:** -- AI-powered content analysis is needed -- Working with unstructured or varying content -- Intent-based routing is required (e.g., "route support tickets to departments") - -**Use Condition when:** -- Simple rule-based decisions are sufficient -- Working with structured data or numeric comparisons -- Fast, deterministic routing is needed - -## Configuration Options +## Configuration ### Context -The context that the Router will analyze to make routing decisions. This is the input data that gets evaluated against your route descriptions. It can be: - -- A direct user query or input -- Output from a previous block -- A system-generated message -- Any text content that needs intelligent routing +The text the Router analyzes to decide. Usually an earlier output, like `` or ``. ### Routes -Define the possible paths that the Router can take. Each route consists of: - -- **Route Title**: A name for the route (e.g., "Sales", "Support", "Technical") -- **Route Description**: A clear description of when this route should be selected (e.g., "Route here when the query is about pricing, purchasing, or sales inquiries") - -Each route you add creates a **separate output port** on the Router block. Connect each port to the appropriate downstream block for that route. +Each route is a **title** and a **description** of when to choose it ("Route here for pricing and purchasing questions"). Every route adds a separate output port on the block; connect each to the path for that route. The model reads the context and selects the route whose description fits best. -### Model Selection +### Model -Choose an AI model to power the routing decision: - -- **OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1 -- **Anthropic**: Claude Sonnet 4.5 -- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash -- **Other Providers**: Groq, Cerebras, xAI, DeepSeek -- **Local Models**: Ollama or VLLM compatible models - -Use models with strong reasoning capabilities like GPT-4o or Claude Sonnet 4.5 for best results. - -### API Key - -Your API key for the selected LLM provider. This is securely stored and used for authentication. +The model that makes the decision, defaulting to `claude-sonnet-4-6`. Stronger reasoning models route more accurately; a faster, cheaper model is fine when the routes are clearly distinct. Type or pick any supported model, or a local one through Ollama or VLLM. On hosted Sim the API key is supplied for you. ## Outputs -- **``**: The context that was analyzed -- **``**: Model used for decision-making -- **``**: Token usage statistics -- **``**: Estimated routing cost -- **``**: The ID of the selected route -- **``**: Explanation of why this route was chosen -- **``**: Details of the chosen destination block +| Output | What it is | +| --- | --- | +| `` | The id of the route the model chose | +| `` | A short explanation of why it chose that route | +| `` | The context that was analyzed | +| `` | The model that decided | +| `` | Token usage | +| `` | Estimated cost of the call | +| `` | The destination block the workflow routed to | + + +When no route fits the context, the Router returns `NO_MATCH` and takes the [error path](/workflows/connections) rather than guessing. Connect the error path for a fallback. + -## Example Use Cases +## Examples -**Customer Support Triage** - Route tickets to specialized departments +### Triage a support ticket -``` -Input (Ticket) → Router - ├── [Sales Route] → Agent (Sales Team) - ├── [Technical Route] → Agent (Engineering) - └── [Billing Route] → Agent (Finance) -``` + -**Content Classification** - Classify and route user-generated content +The Router reads ``, picks the route whose description matches, and runs only that path. -``` -Input (Feedback) → Router - ├── [Product Feedback] → Workflow (Product Team) - └── [Bug Report] → Workflow (Technical Team) -``` +### Classify feedback -**Lead Qualification** - Route leads based on qualification criteria + -``` -Input (Lead) → Router - ├── [Enterprise] → Agent (Enterprise Sales) - └── [Self-serve] → Workflow (Automated Onboarding) -``` +The Router sorts incoming feedback into product feedback or a bug report, each handled by its own child [Workflow](/blocks/workflow) block. -## Error Handling +### Qualify a lead -When the Router cannot determine an appropriate route for the given context, it will route to the **error path** instead of arbitrarily selecting a route. This happens when: + -- The context doesn't clearly match any of the defined route descriptions -- The AI determines that none of the available routes are appropriate +The Router sends enterprise leads to a sales agent and everyone else into a self-serve onboarding workflow. ## Best Practices -- **Write clear route descriptions**: Each route description should clearly explain when that route should be selected. Be specific about the criteria. -- **Make routes mutually exclusive**: When possible, ensure route descriptions don't overlap to prevent ambiguous routing decisions. -- **Connect an error path**: Handle cases where no route matches by connecting an error handler for graceful fallback behavior. -- **Use descriptive route titles**: Route titles appear in the workflow canvas, so make them meaningful for readability. -- **Test with diverse inputs**: Ensure the Router handles various input types, edge cases, and unexpected content. -- **Monitor routing performance**: Review routing decisions regularly and refine route descriptions based on actual usage patterns. -- **Choose appropriate models**: Use models with strong reasoning capabilities for complex routing decisions. +- **Write clear, specific route descriptions.** The description is what the model matches on, so make the criteria explicit. +- **Keep routes mutually exclusive.** Overlapping descriptions make the choice ambiguous and the routing less reliable. +- **Connect the error path.** Handle `NO_MATCH` instead of letting the run fail silently. +- **Reach for Condition when you can.** If the decision is a boolean check on structured data, the [Condition](/blocks/condition) block is free, faster, and deterministic. and outputs. If your routing logic can be expressed as simple boolean conditions, use the Condition block instead — it is free and faster." }, - { question: "Can I see why the Router chose a particular route?", answer: "Yes. The Router V2 block outputs a reasoning field () that contains a brief 1-2 sentence explanation of why the selected route was chosen. This is useful for debugging and understanding routing decisions." }, - { question: "What models work best for routing?", answer: "Models with strong reasoning capabilities like GPT-4o or Claude Sonnet 4.5 tend to produce the most accurate routing decisions. For simpler routing scenarios with clearly distinct routes, a faster and cheaper model like GPT-4o-mini or Gemini Flash may be sufficient." }, - { question: "How many routes can I define?", answer: "There is no hard limit on the number of routes. Each route you define creates a separate output port on the block. However, keep in mind that more routes with overlapping descriptions make it harder for the LLM to distinguish between them, so aim for clear, mutually exclusive route descriptions." }, + { question: "How does the Router decide which route to take?", answer: "It sends your context and every route description to a model, which selects the route whose description best matches. The model is prompted to prefer choosing a route over returning nothing, and only returns NO_MATCH when the context is unrelated to every route." }, + { question: "What happens when the Router cannot match any route?", answer: "The model returns NO_MATCH and the Router directs execution to the error path. Connect an error handler there for graceful fallback rather than letting the workflow fail silently." }, + { question: "Does the Router cost money to run?", answer: "Yes. It makes a model call for every routing decision, which consumes tokens. Monitor it with and . If your routing can be expressed as boolean conditions, use the Condition block instead — it is free and faster." }, + { question: "Can I see why the Router chose a particular route?", answer: "Yes. The reasoning output () contains a brief explanation of why the selected route was chosen, which is useful for debugging routing decisions." }, + { question: "How many routes can I define?", answer: "There is no hard limit, and each route adds its own output port. Keep in mind that more routes with overlapping descriptions are harder for the model to distinguish, so aim for clear, mutually exclusive routes." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/variables.mdx b/apps/docs/content/docs/en/blocks/variables.mdx index dffaff3d20c..30248b0a35c 100644 --- a/apps/docs/content/docs/en/blocks/variables.mdx +++ b/apps/docs/content/docs/en/blocks/variables.mdx @@ -1,93 +1,61 @@ --- title: Variables +description: The Variables block updates workflow variables during a run, read from any block by name. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, VARIABLES_RETRY_WORKFLOW, VARIABLES_CONFIG_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Variables block updates workflow variables during execution. Variables must first be initialized in your workflow's Variables section, then you can use this block to update their values as your workflow runs. +The **Variables block** updates workflow variables while a run is in progress. Variables are workflow-scoped state you create once in the workflow's Variables panel; this block changes their values as the run proceeds. Read a variable from any block with ``. -
- Variables Block -
+ - - Access variables anywhere in your workflow using `` syntax. - +## Configuration -## How to Use Variables +### Variable Assignments -### 1. Initialize in Workflow Variables - -First, create your variables in the workflow's Variables section (accessible from the workflow settings): - -``` -customerEmail = "" -retryCount = 0 -currentStatus = "pending" -``` - -### 2. Update with Variables Block - -Use the Variables block to update these values during execution: +A list of assignments, run in order. The right side is an expression that can reference earlier outputs and the variable's own current value: ``` customerEmail = -retryCount = + 1 -currentStatus = "processing" +retryCount = + 1 +currentStatus = "processing" ``` -### 3. Access Anywhere +The variables must already exist in the workflow's **Variables** panel, where you set their initial values. -Reference variables in any block: +## Outputs -``` -Agent prompt: "Send email to " -Condition: < 5 -API body: {"status": ""} -``` +Variables are global rather than block outputs: read them anywhere with ``, like ``. Each variable you assign is also exposed on this block as `` if you want to reference it from the block directly. -## Example Use Cases +## Examples -**Loop Counter and State** - Track progress through iterations -``` -Loop → Agent (Process) → Variables (itemsProcessed + 1) → Variables (Store lastResult) -``` +### Count retries -**Retry Logic** - Track API retry attempts -``` -API (Try) → Variables (retryCount + 1) → Condition (retryCount < 3) -``` + -**Dynamic Configuration** - Store user context for workflow -``` -API (Fetch Profile) → Variables (userId, userTier) → Agent (Personalize) -``` +Each attempt bumps `retryCount`, and a Condition stops the loop after a few tries. -## Outputs +### Hold config for the run + + -The Variables block does not produce traditional block outputs. Variables are accessed globally via `` syntax from any block in the workflow, not through block output connections. +Profile fields are stored once, then read by later blocks with `` without fetching again. ## Best Practices -- **Initialize in workflow settings**: Always create variables in the workflow Variables section before using them -- **Update dynamically**: Use Variables blocks to update values based on block outputs or calculations -- **Use in loops**: Perfect for tracking state across iterations -- **Name descriptively**: Use clear names like `currentIndex`, `totalProcessed`, or `lastError` +- **Initialize variables first.** Create them in the workflow's Variables panel before a Variables block sets them. +- **Track state across steps.** Variables suit counters and status that several blocks read and update, including inside a [Loop](/blocks/loop). +- **Name them clearly.** Names are case-sensitive, so `retryCount` and `RetryCount` are different variables. +- **Assign from earlier outputs.** Set a variable from any block output, like `customerEmail = `. syntax in any block's input field. For example, or ." }, - { question: "Do Variables blocks produce outputs I can wire to other blocks?", answer: "Variables do not appear as traditional block outputs in the connection UI. Instead, they are accessed globally via the prefix from any block in the workflow." }, - { question: "What naming convention should I use for variables?", answer: "Use descriptive names in camelCase or snake_case. Variable names are case-sensitive, so 'retryCount' and 'RetryCount' are treated as different variables." }, - { question: "Can I use block outputs to set variable values?", answer: "Yes. You can reference any block output when setting a variable value, such as setting customerEmail to or incrementing a counter based on previous values." }, + { question: "Do variables persist between workflow executions?", answer: "No. Variables are workflow-scoped and persist only for a single run. Each new run starts from the initial values defined in the workflow's Variables panel." }, + { question: "Can multiple Variables blocks update the same variable?", answer: "Yes. All Variables blocks share one namespace, so a later block can overwrite a value set by an earlier one by using the same name." }, + { question: "How do I reference a variable in other blocks?", answer: "Use in any input field, like or ." }, + { question: "Are assigned variables available as block outputs?", answer: "Variables are primarily read globally with . Each assignment is also exposed on the Variables block itself as , so you can reference it from the block directly if you prefer." }, + { question: "What naming convention should I use?", answer: "Descriptive names in camelCase or snake_case. Names are case-sensitive, so be consistent." }, + { question: "Can I use block outputs to set a variable?", answer: "Yes. Reference any earlier output in an assignment, such as customerEmail = , or increment a counter from its current value." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/wait.mdx b/apps/docs/content/docs/en/blocks/wait.mdx index 00b4079a5f2..86a77c5abce 100644 --- a/apps/docs/content/docs/en/blocks/wait.mdx +++ b/apps/docs/content/docs/en/blocks/wait.mdx @@ -1,73 +1,63 @@ --- title: Wait +description: The Wait block pauses a workflow for a set time before continuing. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, WAIT_RATELIMIT_WORKFLOW, WAIT_FOLLOWUP_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Wait block pauses your workflow for a specified amount of time before continuing to the next block. Use it to add delays between actions, respect API rate limits, or space out operations. +The **Wait block** pauses a workflow for a set time, then continues. Use it to space out actions, respect API rate limits, or give an external system time to finish. A short wait runs in line; a long one suspends the run and resumes later. -
- Wait Block -
+ ## Configuration ### Wait Amount -Enter the duration to pause execution: -- **Input**: Positive number -- **Maximum**: 600 seconds (10 minutes) or 10 minutes +The duration to pause, as a positive number. ### Unit -Choose the time unit: -- **Seconds**: For short, precise delays -- **Minutes**: For longer pauses +The time unit. For a short, in-line wait, choose **Seconds** or **Minutes**. With **Async** on, choose **Minutes**, **Hours**, or **Days**. - - Wait blocks can be cancelled by stopping the workflow. The maximum wait time is 10 minutes. - +### Async + +Off, the run sleeps in line for the duration (up to 10 minutes). On, the run **suspends** and resumes after the delay, which is what lets a wait run for hours or days without holding the execution open. A suspended wait records when it will resume in ``. ## Outputs -- **``**: The wait duration in milliseconds -- **``**: Status of the wait ('waiting', 'completed', or 'cancelled') +| Output | What it is | +| --- | --- | +| `` | `waiting`, `completed`, or `cancelled` | +| `` | The wait duration, in milliseconds | +| `` | ISO timestamp a suspended (async) wait resumes at | + +## Examples + +### Space out API calls + + -## Example Use Cases +A short wait between two calls keeps the workflow under an API's rate limit. The same shape works for polling: wait, then re-check an external job. -**API Rate Limiting** - Stay within API rate limits between requests -``` -API (Request 1) → Wait (2s) → API (Request 2) -``` +### Send a delayed follow-up -**Timed Notifications** - Send follow-up messages after a delay -``` -Function (Send Email) → Wait (5min) → Function (Follow-up) -``` + -**Processing Delays** - Wait for external system to complete processing -``` -API (Trigger Job) → Wait (30s) → API (Check Status) -``` +With Async on, the run suspends for two days and resumes to send the follow-up, without holding the execution open in between. ## Best Practices -- **Keep waits reasonable**: Use Wait for delays up to 10 minutes. For longer delays, consider scheduled workflows -- **Monitor execution time**: Remember that waits extend total workflow duration +- **Use a short in-line wait for seconds to a few minutes.** Turn on Async for hours or days so the run doesn't stay open the whole time. +- **Remember waits extend the run.** The wait counts toward total duration, which shows in the logs. +- **A wait is cancellable.** Stopping the run cancels an active wait, and `status` reports `cancelled`. ." }, + { question: "Does the Wait block consume resources while paused?", answer: "An in-line wait performs a simple sleep and does not actively use compute, though the execution stays open. An async wait suspends the run entirely, so nothing is held open until it resumes." }, + { question: "What outputs does the Wait block provide?", answer: "waitDuration (the wait in milliseconds), status ('waiting', 'completed', or 'cancelled'), and resumeAt (the ISO timestamp an async wait resumes at)." }, ]} /> diff --git a/apps/docs/content/docs/en/blocks/webhook.mdx b/apps/docs/content/docs/en/blocks/webhook.mdx index 1a385bbe566..89710413a6c 100644 --- a/apps/docs/content/docs/en/blocks/webhook.mdx +++ b/apps/docs/content/docs/en/blocks/webhook.mdx @@ -1,22 +1,16 @@ --- title: Webhook +description: The Webhook block sends an HTTP POST to an external endpoint, with automatic headers and optional signing. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, WEBHOOK_NOTIFY_WORKFLOW, WEBHOOK_TRIGGER_WORKFLOW } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' The Webhook block sends HTTP POST requests to external webhook endpoints with automatic webhook headers and optional HMAC signing. -
- Webhook Block -
+ ## Configuration @@ -71,17 +65,19 @@ Every request includes these headers automatically: | `status` | number | HTTP status code | | `headers` | object | Response headers | -## Example Use Cases +## Examples -**Notify external services** - Send workflow results to Slack, Discord, or custom endpoints -``` -Agent → Function (format) → Webhook (notify) -``` +### Notify an external service -**Trigger external workflows** - Start processes in other systems when conditions are met -``` -Condition (check) → Webhook (trigger) → Response -``` + + +Format the result, then POST it to a Slack, Discord, or custom endpoint. + +### Fire an external process on a check + + + +When the Condition passes, the Webhook starts a process in another system. The Webhook block always uses POST. For other HTTP methods or more control, use the [API block](/blocks/api). diff --git a/apps/docs/content/docs/en/blocks/workflow.mdx b/apps/docs/content/docs/en/blocks/workflow.mdx index d8884aeec0a..c24968e4320 100644 --- a/apps/docs/content/docs/en/blocks/workflow.mdx +++ b/apps/docs/content/docs/en/blocks/workflow.mdx @@ -1,22 +1,16 @@ --- title: Workflow Block description: Run another workflow inside the current flow +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Image } from '@/components/ui/image' +import { BlockPreview, WorkflowPreview, WORKFLOW_CALL_WORKFLOW } from '@/components/workflow-preview' ## What It Does -
- Workflow block configuration -
+ Drop a Workflow block when you want to call a child workflow as part of a larger flow. The block runs the latest deployed version of that workflow, waits for it to finish, and then continues with the parent. @@ -42,6 +36,12 @@ Drop a Workflow block when you want to call a child workflow as part of a larger - `childWorkflowName` – the name of the child workflow (string) - `childWorkflowId` – the ID of the child workflow (string) +## Example + + + +The parent passes its input to the child workflow `enrich-lead`, waits for it to finish, and reads the result downstream as ``. + ## Deployment Status Badge The Workflow block displays a deployment status badge to help you track whether the child workflow is ready to execute: diff --git a/apps/docs/content/docs/en/building-agents/choosing.mdx b/apps/docs/content/docs/en/building-agents/choosing.mdx new file mode 100644 index 00000000000..753ae104ac9 --- /dev/null +++ b/apps/docs/content/docs/en/building-agents/choosing.mdx @@ -0,0 +1,89 @@ +--- +title: Choosing what to use +description: Pick between a deterministic block, an agent tool, a custom tool, an MCP server, a workflow-as-tool, and a skill. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, LEAD_SCORER_WORKFLOW } from '@/components/workflow-preview' + +When you build an agent, several features overlap: a deterministic block and an agent tool can run the same integration, and a custom tool, an MCP tool, and a workflow-as-tool can all give an agent the same action. This page lays out the differences so you pick the right one. They vary along three lines: whether the action is **deterministic** (always runs) or **model-decided** (an agent chooses), whether it lives in one workflow or is **reusable** across your workspace, and whether it comes from Sim or an **external** provider. + +The running example is a workflow that scores inbound sales leads. It reads a new lead, enriches it, decides on a score, logs the result, and notifies the team. Each option below builds part of it: + + + +{/* VISUAL: decision tree. Always happens? → deterministic block. Else agent chooses? → agent tool. Reuse across workspace? → custom tool. External toolset? → MCP. Whole workflow? → workflow-as-tool. Reusable instructions? → skill. */} + +## Deterministic block + +A **block** is a single step that runs at a fixed point on the path, with no model deciding whether to. It always runs when the workflow reaches it. Use one when the action must happen every time: an API call, a data transform, a branch. + +In the lead scorer, a [Google Sheets](/integrations) block always appends the scored lead to a tracking sheet, and a [Function](/blocks/function) block always reshapes the enrichment response into the fields the next step expects. There is no judgment call. The work is guaranteed. + + + +Most steps in a workflow are blocks. Reach for the kinds below only when you want a model to decide, or you want to reuse something. + +## Agent tool + +An **agent tool** is an action you hand to an [Agent](/blocks/agent) block. The agent reads the task and decides whether and when to call it. The same catalog of [integrations](/integrations) that exist as standalone blocks can also be attached to an agent as tools. + +In the lead scorer, the Agent has a Search tool and a Send Email tool. For a lead with a thin profile it runs Search to gather context; for a strong lead it calls Send Email. A thin, obvious lead might trigger neither. The agent chooses per run. + + + +Each tool carries a `usageControl` setting. **Auto** lets the model decide (the default). **Force** makes the agent call the tool every run, for actions that should never be skipped, like always logging the decision. **None** removes the tool from that agent. + + +A block and an agent tool can be the same underlying integration. The difference is who decides. A block runs because the path reached it. An agent tool runs because the agent chose it. + + +## Custom tool + +A **custom tool** is a tool you define once with an object schema and a snippet of JavaScript or Python, then reuse across your workspace. It needs no external account. Use one when you have logic that several agents or workflows would otherwise duplicate. + +In the lead scorer, a `normalizeCompanyDomain` custom tool cleans a raw website into a canonical domain. The same tool serves the lead scorer, a deduplication workflow, and a reporting agent. Define it in the workspace, then pick it from any Agent block's tool list. + +## MCP server + +**MCP** (Model Context Protocol) is a standard for connecting an external tool provider. Connect an [MCP server](/mcp) and its tools appear in the agent's tool list as a set. Use it to bring in a complete toolset that Sim does not provide natively, rather than wiring each action by hand. + +In the lead scorer, your CRM vendor ships an MCP server. After you connect it once, the agent can read accounts and update records through the vendor's own tools. The difference from a custom tool is who maintains it: a custom tool is code you wrote, while an MCP server is a toolbox someone else maintains. + +## Workflow-as-tool + +A **workflow-as-tool** runs a whole workflow as one step. The [Workflow](/blocks/workflow) block selects a child workflow and maps values to its [Start](/triggers/start) trigger, then returns `success`, `result`, and `error`. Use it to keep a large system modular: build a procedure once, call it from many parents. + +In the lead scorer, enrichment is its own workflow with five steps. The parent uses a Workflow block to call it and reads the enriched lead from `result`, instead of inlining those five steps. So one workflow can call another, much the way a function calls another function. + + + +## Skill + +A **skill** is reusable instructions, a written playbook an agent can follow. Each skill has a short name and description that are always visible to the agent, plus a longer body the agent loads only when it decides the skill applies. Use one to capture how something should be done, separate from the tools that do it. + +In the lead scorer, a `lead-scoring-rubric` skill spells out the bands and disqualifiers. The agent sees the skill's name and description on every run, and when a lead is ambiguous it loads the full rubric and applies it. The distinction is simple: a tool is an action the agent takes, and a skill is guidance the agent reads. Manage skills in your [workspace](/skills). + +| | Who decides it runs | Where it lives | How you author it | +| --- | --- | --- | --- | +| **Block** | The path | The workflow | Drag in and configure | +| **Agent tool** | The agent | On the Agent block | Pick from the integrations | +| **Custom tool** | The agent | The workspace | Write the code once | +| **MCP server** | The agent | An external server | Connect it | +| **Workflow-as-tool** | The path | Its own workflow | Build it like any workflow | +| **Skill** | The agent | The workspace | Write the instructions | + +## Putting it together + +The lead scorer uses six kinds at once: blocks for the steps that must always run, agent tools for the calls the model should weigh, a custom tool for shared logic, an MCP server for the CRM, a workflow-as-tool for enrichment, and a skill for the scoring rules. In general, start with a block, then move to an agent tool when a model should decide. Reach for the rest only when you need reuse, an external toolset, a sub-workflow, or written guidance. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/building-agents/custom-tools.mdx b/apps/docs/content/docs/en/building-agents/custom-tools.mdx new file mode 100644 index 00000000000..c551d942652 --- /dev/null +++ b/apps/docs/content/docs/en/building-agents/custom-tools.mdx @@ -0,0 +1,163 @@ +--- +title: Custom Tools +description: Create your own tools with JavaScript code and use them in Agent blocks +pageType: guide +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Step, Steps } from 'fumadocs-ui/components/steps' +import { FAQ } from '@/components/ui/faq' + +Custom tools let you write your own JavaScript functions and make them available as callable tools in Agent blocks. This is useful when you need functionality that isn't covered by Sim's built-in integrations — for example, calling an internal API, performing a custom calculation, or transforming data in a specific way. + +## How Custom Tools Work + +A custom tool has two parts: + +1. **Schema** — A JSON definition describing the tool's name, description, and parameters (using the OpenAI function-calling format). This tells the AI agent what the tool does and what inputs it expects. +2. **Code** — A JavaScript function body that runs when the agent calls the tool. Parameters defined in the schema are available as variables in your code. + +When an Agent block has access to a custom tool, the AI model decides when to call it based on the schema description and the conversation context — just like built-in tools. + +## Creating a Custom Tool + + + + +### Open Custom Tools settings + +Navigate to **Settings → Custom Tools** in your workspace and click **Add**. + + + + +### Define the schema + +In the **Schema** tab, define your tool using JSON in the OpenAI function-calling format: + +```json +{ + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the current weather for a city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city name" + }, + "units": { + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "Temperature units" + } + }, + "required": ["city"] + } + } +} +``` + + + You can use the AI wand button to generate a schema from a natural language description of what the tool should do. + + + + + +### Write the code + +Switch to the **Code** tab and write the JavaScript function body. Parameters from your schema are available directly as variables: + +```javascript +const response = await fetch( + `https://api.openweathermap.org/data/2.5/weather?q=${city}&units=${units === 'celsius' ? 'metric' : 'imperial'}&appid={{OPENWEATHER_API_KEY}}` +); + +const data = await response.json(); + +return { + temperature: data.main.temp, + description: data.weather[0].description, + humidity: data.main.humidity +}; +``` + + + You can also use the AI wand to generate code from a description. Environment variables are referenced with `{{KEY}}` syntax. + + + + + +### Save + +Click **Save** to create the tool. It's now available to use in any Agent block across your workspace. + + + + +## Using Custom Tools in Workflows + +Once created, custom tools appear alongside built-in tools when configuring an Agent block: + +1. Open an Agent block +2. Click **Add Tools** +3. Find your custom tool in the tool list +4. The agent will call the tool when it determines it's relevant to the task + +## Code Environment + +### Available Features + +- **Async/await** — Your code runs in an async context, so you can use `await` directly +- **fetch()** — Make HTTP requests to external APIs +- **Node.js built-ins** — Access to `crypto`, `Buffer`, and other standard modules +- **Environment variables** — Use `{{KEY}}` syntax to inject secrets + +### Limitations + +- **No npm packages** — External libraries like `axios` or `lodash` are not available. Use built-in APIs instead +- **Parameters by name** — Schema parameters are available directly as variables (e.g., `city`), not via a `params` object + +### Returning Results + +Return a value from your code to send it back to the agent: + +```javascript +const result = await fetch(`https://api.example.com/data?q=${query}`); +const data = await result.json(); +return data; +``` + +The returned value becomes the tool output that the agent sees and can use in its response. + +## Managing Custom Tools + +From **Settings → Custom Tools** you can: + +- **Search** tools by name, function name, or description +- **Edit** any tool's schema or code +- **Delete** tools that are no longer needed + + + Deleting a custom tool removes it from all Agent blocks that reference it. Make sure no active workflows depend on the tool before deleting. + + +## Permissions + +| Action | Required Permission | +|--------|-------------------| +| View custom tools | **Read**, **Write**, or **Admin** | +| Create or edit tools | **Write** or **Admin** | +| Delete tools | **Admin** | + + diff --git a/apps/docs/content/docs/en/building-agents/index.mdx b/apps/docs/content/docs/en/building-agents/index.mdx new file mode 100644 index 00000000000..b257ad4cbf7 --- /dev/null +++ b/apps/docs/content/docs/en/building-agents/index.mdx @@ -0,0 +1,73 @@ +--- +title: Overview +description: An agent is a workflow that reasons and acts, built around Agent blocks and the features you give them. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, BUILD_AGENT_WORKFLOW } from '@/components/workflow-preview' + +An **agent** is a [workflow](/workflows) that reasons and acts on its own. It reads an input, decides what to do, and carries it out, calling tools and using your data along the way. You build a custom agent in Sim by composing a workflow whose thinking runs through one or more [Agent blocks](/blocks/agent). + +An **Agent block** is the reasoning step inside that workflow: a model reads the values available to it, decides, and returns a result that later blocks read by reference. A simple agent is a single Agent block; a larger one wires several together with other blocks. The Agent block is where the model thinks; the rest of the workflow is what it acts on and through. + + + +The example throughout is an agent that scores inbound sales leads. + +## The Agent block + +You set up the reasoning step by giving the Agent block a **model** and a **prompt**. The model is the LLM that powers it; you pick one from the available providers, and the default is `claude-sonnet-4-6`. The prompt is a system message that defines who the agent is and how it should behave, plus a user message that carries the input, usually a reference like ``. + +When it runs, the Agent block reasons, calls any tools it needs, and stores its result under its own name. By default that result is free text in `content`, read by a later block as ``, alongside run details like the model used, token counts, tool calls, and cost. Every setting and output field is in the [Agent block reference](/blocks/agent). + +## What you give an agent + +On its own, an Agent block can only reason and write text. You extend it so it can act, follow your rules, use your data, remember, and return results other blocks can rely on. Each feature maps to something you'd want an agent to do. + +### Take an action: tools + +To let an agent do something in the world, give it **tools**. A tool is an action the agent can call, like sending an email, searching the web, updating a CRM record, or running another workflow. You attach tools to the Agent block, and the agent decides which to call for the task in front of it. In the lead scorer, the agent has a search tool to gather context on a thin profile and an email tool to reach out to a strong lead. + +Tools come from a few places: + +- **[Integrations](/integrations)** are the catalog of external services: Gmail, Slack, Airtable, Linear, and hundreds more. +- **[Custom tools](/building-agents/custom-tools)** are tools you define once with a schema and a snippet of code, then reuse. +- **[MCP tools](/mcp)** come from an external provider you connect through the Model Context Protocol. +- **[Workflow-as-tool](/workflows)** makes another workflow callable, so the agent runs a whole procedure as one step. + + +The same integration can run two ways. As a [block](/workflows#blocks) it runs because the path reached it. As an agent tool it runs because the agent chose it. Each agent tool has a usage control: **Auto** lets the model decide (the default), **Force** calls it on every run, and **None** removes it. + + +### Follow a procedure: skills + +To give an agent instructions it can follow, write a [skill](/skills). A skill is a reusable playbook with a short name and description the agent always sees, plus a longer body it loads only when the skill applies. In the lead scorer, a `lead-scoring-rubric` skill spells out the bands and disqualifiers, and the agent reads the full rubric only when a lead is ambiguous. A tool is an action the agent takes; a skill is guidance it reads. + +### Use your documents: knowledge + +To let an agent answer from your own content, connect a [knowledge base](/knowledgebase). The agent searches it and grounds its answers in what it finds, instead of relying only on the model's general training. Give the lead scorer a knowledge base of past deals and it can compare a new lead against ones you've closed before. + +### Remember across runs: memory + +To let an agent reuse information from one run to the next, give it [memory](/integrations/memory), which stores and recalls values keyed to a conversation. Without it, each run starts fresh; with it, an agent in a chat carries what was said earlier into later messages. + +### Return a usable result: structured output + +To make an agent's result something later blocks can act on, give it a **structured output**: a typed object you define instead of free text. In the lead scorer, the agent returns `{ score, tier, reason }`, and a later [Condition](/blocks/condition) block reads `` to branch. See [how blocks pass data](/workflows/data-flow) for reading fields. + +## Choosing what to use + +Start with one Agent block and a prompt, then add only what the task needs: a tool when the agent should act, a skill when it needs written guidance, a knowledge base when it should answer from your documents, memory when it should remember, and a structured output when a later block has to read its result. + + + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/connections/basics.mdx b/apps/docs/content/docs/en/connections/basics.mdx deleted file mode 100644 index 839b4058faa..00000000000 --- a/apps/docs/content/docs/en/connections/basics.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Basics ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -## How Connections Work - -Connections are the pathways that allow data to flow between blocks in your workflow. In Sim, connections define how information passes from one block to another, enabling data flow throughout your workflow. - - - Each connection represents a directed relationship where data flows from a source block's output - to a destination block's input. - - -### Creating Connections - - - - Select Source Block: Click on the output port of the block you want to connect - from - - - Draw Connection: Drag to the input port of the destination block - - - Confirm Connection: Release to create the connection - - - -
-
- -### Connection Flow - -The flow of data through connections follows these principles: - -1. **Directional Flow**: Data always flows from outputs to inputs -2. **Execution Order**: Blocks execute in order based on their connections -3. **Data Transformation**: Data may be transformed as it passes between blocks -4. **Conditional Paths**: Some blocks (like Router and Condition) can direct flow to different paths - - - Deleting a connection will immediately stop data flow between the blocks. Make sure this is - intended before removing connections. - - - - diff --git a/apps/docs/content/docs/en/connections/data-structure.mdx b/apps/docs/content/docs/en/connections/data-structure.mdx deleted file mode 100644 index 2c112b781df..00000000000 --- a/apps/docs/content/docs/en/connections/data-structure.mdx +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Data Structure ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { FAQ } from '@/components/ui/faq' - -When you connect blocks, understanding the data structure of different block outputs is important because the output data structure from the source block determines what values are available in the destination block. Each block type produces a specific output structure that you can reference in downstream blocks. - - - Understanding these data structures is essential for effectively using connection tags and - accessing the right data in your workflows. - - -## Block Output Structures - -Different block types produce different output structures. Here's what you can expect from each block type: - - - - ```json - { - "content": "The generated text response", - "model": "gpt-4o", - "tokens": { - "prompt": 120, - "completion": 85, - "total": 205 - }, - "toolCalls": [...], - "cost": [...], - "usage": [...] - } - ``` - - ### Agent Block Output Fields - - - **content**: The main text response generated by the agent - - **model**: The AI model used (e.g., "gpt-4o", "claude-3-opus") - - **tokens**: Token usage statistics - - **prompt**: Number of tokens in the prompt - - **completion**: Number of tokens in the completion - - **total**: Total tokens used - - **toolCalls**: Array of tool calls made by the agent (if any) - - **cost**: Array of cost objects for each tool call (if any) - - **usage**: Token usage statistics for the entire response - - - - ```json - { - "data": "Response data", - "status": 200, - "headers": { - "content-type": "application/json", - "cache-control": "no-cache" - } - } - ``` - - ### API Block Output Fields - - - **data**: The response data from the API (can be any type) - - **status**: HTTP status code of the response - - **headers**: HTTP headers returned by the API - - - - ```json - { - "result": "Function return value", - "stdout": "Console output", - } - ``` - - ### Function Block Output Fields - - - **result**: The return value of the function (can be any type) - - **stdout**: Console output captured during function execution - - - - ```json - { - "content": "Evaluation summary", - "model": "gpt-5", - "tokens": { - "prompt": 120, - "completion": 85, - "total": 205 - }, - "metric1": 8.5, - "metric2": 7.2, - "metric3": 9.0 - } - ``` - - ### Evaluator Block Output Fields - - - **content**: Summary of the evaluation - - **model**: The AI model used for evaluation - - **tokens**: Token usage statistics - - **[metricName]**: Score for each metric defined in the evaluator (dynamic fields) - - - - ```json - { - "conditionResult": true, - "selectedPath": { - "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1", - "blockType": "agent", - "blockTitle": "Follow-up Agent" - }, - "selectedOption": "condition-1" - } - ``` - - ### Condition Block Output Fields - - - **conditionResult**: Boolean result of the condition evaluation - - **selectedPath**: Information about the selected path - - **blockId**: ID of the next block in the selected path - - **blockType**: Type of the next block - - **blockTitle**: Title of the next block - - **selectedOption**: ID of the selected condition - - - - ```json - { - "content": "Routing decision", - "model": "gpt-4o", - "tokens": { - "prompt": 120, - "completion": 85, - "total": 205 - }, - "selectedPath": { - "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1", - "blockType": "agent", - "blockTitle": "Customer Service Agent" - } - } - ``` - - ### Router Block Output Fields - - - **content**: The routing decision text - - **model**: The AI model used for routing - - **tokens**: Token usage statistics - - **selectedPath**: Information about the selected path - - **blockId**: ID of the selected destination block - - **blockType**: Type of the selected block - - **blockTitle**: Title of the selected block - - - - -## Custom Output Structures - -Some blocks may produce custom output structures based on their configuration: - -1. **Agent Blocks with Response Format**: When using a response format in an Agent block, the output structure will match the defined schema instead of the standard structure. - -2. **Function Blocks**: The `result` field can contain any data structure returned by your function code. - -3. **API Blocks**: The `data` field will contain whatever the API returns, which could be any valid JSON structure. - - - Always check the actual output structure of your blocks during development to ensure you're - referencing the correct fields in your connections. - - -## Nested Data Structures - -Many block outputs contain nested data structures. You can access these using dot notation in connection tags: - -``` - -``` - -For example: - -- `` - Access the total tokens from an Agent block -- `` - Access the ID of the first result from an API response -- `` - Access a nested field in a Function block's result - - navigates into the data field, then into the results array at index 0, and retrieves the id property." }, -]} /> - diff --git a/apps/docs/content/docs/en/connections/index.mdx b/apps/docs/content/docs/en/connections/index.mdx deleted file mode 100644 index db12a79780c..00000000000 --- a/apps/docs/content/docs/en/connections/index.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Overview -description: Connect your blocks to one another. ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Card, Cards } from 'fumadocs-ui/components/card' -import { ConnectIcon } from '@/components/icons' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -Connections are the pathways that allow data to flow between blocks in your workflow. They define how information is passed from one block to another, enabling you to create sophisticated, multi-step processes. - - - Properly configured connections are essential for creating effective workflows. They determine how - data moves through your system and how blocks interact with each other. - - -
-
- -## Connection Types - -Sim supports different types of connections that enable various workflow patterns: - - - - Learn how connections work and how to create them in your workflows - - - Understand how to use connection tags to reference data between blocks - - - Explore the output data structures of different block types - - - Learn techniques for accessing and manipulating connected data - - - Follow recommended patterns for effective connection management - - - -, which the variable resolver replaces with the actual data at execution time." }, - { question: "Can a block receive input from multiple upstream blocks?", answer: "Yes. A block waits until all of its incoming connections have been fulfilled before it executes. The engine tracks incoming edges for each node and only marks a block as ready when every upstream dependency has completed. You can reference outputs from any connected block using their respective connection tags." }, - { question: "What happens if an upstream block fails?", answer: "If a block errors, the engine activates the error edge (if one exists) and deactivates the normal output edge. Downstream blocks on the success path will not execute. You can connect an error handle to a separate block to build fallback or recovery logic." }, - { question: "Do connections support conditional branching?", answer: "Yes. Router and Condition blocks produce a selected route or option that determines which outgoing edge is activated. Only the blocks on the chosen path will execute. Edges on unselected paths are deactivated and their entire downstream subgraph is skipped." }, - { question: "Can blocks in parallel branches share data with each other?", answer: "Blocks within the same parallel branch cannot directly reference blocks in a sibling branch because branches execute independently. However, once all branches complete and the parallel block exits, downstream blocks can access the aggregated results from all branches." }, - { question: "How are connection tags formatted?", answer: "Connection tags use angle-bracket syntax: . For nested data you can chain dot notation, such as . The resolver walks the object path at execution time and substitutes the resolved value into your input field." }, -]} /> diff --git a/apps/docs/content/docs/en/connections/meta.json b/apps/docs/content/docs/en/connections/meta.json deleted file mode 100644 index a120e6e0300..00000000000 --- a/apps/docs/content/docs/en/connections/meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "pages": ["index", "basics", "data-structure", "tags"] -} diff --git a/apps/docs/content/docs/en/connections/tags.mdx b/apps/docs/content/docs/en/connections/tags.mdx deleted file mode 100644 index 6daf9384dde..00000000000 --- a/apps/docs/content/docs/en/connections/tags.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Tags ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -Connection tags are visual representations of the data available from connected blocks, providing an easy way to reference data between blocks and outputs from previous blocks in your workflow. - -
-
- -### What Are Connection Tags? - -Connection tags are interactive elements that appear when blocks are connected. They represent the data that can flow from one block to another and allow you to: - -- Visualize available data from source blocks -- Reference specific data fields in destination blocks -- Create dynamic data flows between blocks - - - Connection tags make it easy to see what data is available from previous blocks and use it in your - current block without having to remember complex data structures. - - -## Using Connection Tags - -There are two primary ways to use connection tags in your workflows: - -
-
-

Drag and Drop

-
- Click on a connection tag and drag it into input fields of destination blocks. A dropdown will - appear showing available values. -
-
    -
  1. Hover over a connection tag to see available data
  2. -
  3. Click and drag the tag to an input field
  4. -
  5. Select the specific data field from the dropdown
  6. -
  7. The reference is inserted automatically
  8. -
-
- -
-

Angle Bracket Syntax

-
- Type <> in input fields to see a dropdown of available connection values - from previous blocks. -
-
    -
  1. Click in any input field where you want to use connected data
  2. -
  3. - Type <> to trigger the connection dropdown -
  4. -
  5. Browse and select the data you want to reference
  6. -
  7. Continue typing or select from the dropdown to complete the reference
  8. -
-
-
- -## Tag Syntax - -Connection tags use a simple syntax to reference data: - -``` - -``` - -Where: - -- `blockName` is the name of the source block -- `path.to.data` is the path to the specific data field - -For example: - -- `` - References the content field from a block with ID "agent1" -- `` - References the name of the first user in the users array from the data field of a block with ID "api2" - -## Dynamic Tag References - -Connection tags are evaluated at runtime, which means: - -1. They always reference the most current data -2. They can be used in expressions and combined with static text -3. They can be nested within other data structures - -### Examples - -```javascript -// Reference in text -"The user's name is " - -// Reference in JSON -{ - "userName": "", - "orderTotal": -} - -// Reference in code -const greeting = "Hello, !"; -const total = * 1.1; // Add 10% tax -``` - - - When using connection tags in numeric contexts, make sure the referenced data is actually a number - to avoid type conversion issues. - - - is matched against resolvers in order: loop references, parallel references, workflow variables, environment variables, and finally block output references. The first resolver that recognizes the reference handles it." }, - { question: "Does the block name in a tag reference need to match exactly?", answer: "Block names are normalized by converting to lowercase and removing spaces before matching. So and resolve to the same block. However, the field path after the block name (e.g., content, data.users) is case-sensitive." }, - { question: "Can I reference environment variables in tag syntax?", answer: "Yes, but environment variables use double-brace syntax instead of angle brackets: {{MY_VAR}}. These are resolved by a dedicated environment variable resolver during execution." }, - { question: "What happens if I reference a block that did not execute on the current path?", answer: "If the referenced block exists in the workflow but did not produce output (for example, it was on an unselected condition branch), the reference resolves to an empty value. In most blocks this becomes an empty string; in Function blocks it becomes null." }, - { question: "Can I access array elements inside a tag reference?", answer: "Yes. Use bracket notation for array indices within the dot path, for example . The resolver supports multiple levels of array indexing like items[0][1] as well." }, - { question: "How are tag values formatted inside Function blocks versus other blocks?", answer: "In Function blocks, resolved values are formatted as code literals (strings are quoted, objects are JSON, null stays as null) so they can be used directly in JavaScript or Python code. In other block types, objects are JSON-stringified and primitives are converted to plain strings." }, - { question: "Can I mix static text with tag references?", answer: "Yes. You can embed tag references anywhere in a text string, such as \"Hello, ! Your order total is .\" The resolver replaces each tag in place while leaving the surrounding text intact." }, -]} /> - diff --git a/apps/docs/content/docs/en/copilot/index.mdx b/apps/docs/content/docs/en/copilot/index.mdx deleted file mode 100644 index f30f3da691f..00000000000 --- a/apps/docs/content/docs/en/copilot/index.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Copilot -description: Your per-workflow AI assistant for building and editing workflows. ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Image } from '@/components/ui/image' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -Copilot is the AI assistant built into every workflow editor. It is scoped to the workflow you have open — it reads the current structure, makes changes directly, and saves checkpoints so you can revert if needed. - -For workspace-wide tasks (managing multiple workflows, running research, working with tables, scheduling jobs), use [Mothership](/mothership). - - - Copilot is a Sim-managed service. For self-hosted deployments, go to [sim.ai](https://sim.ai) → Settings → Copilot, generate a Copilot API key, then set `COPILOT_API_KEY` in your self-hosted environment. - - -
+ +## The surfaces + +Every surface runs the same live snapshot. You manage them from the tabs of the deploy modal. + +The most common surface is the **API**. Once deployed, your workflow answers at: + +``` +POST https://sim.ai/api/workflows/{workflow-id}/execute +``` + +Send an object in the request body matching the workflow's [Input Format](/triggers/start). The response is an object holding the [block outputs](/workflows#blocks) and execution metadata. + +```bash +curl -X POST https://sim.ai/api/workflows/{workflow-id}/execute \ + -H "X-API-Key: $SIM_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ "input": "Refund request from customer #4821" }' +``` + +{/* VISUAL: deploy modal tab bar. General · API · MCP · A2A · Chat. */} + + + + + + + + +## Versioning in practice + +Treat the live version as production and the canvas as staging. Run the workflow on the canvas until it behaves, then **Deploy** or **Update** to publish. Callers keep hitting the previous snapshot until the new version goes live, so there is no half-deployed state. If a new version causes trouble, **Promote to live** the previous one to roll back at once, then fix the draft and update again when it is ready. The [logs](/logs-debugging) record every run against every version, so you can confirm which snapshot a given execution used. + +## Next + + + + + + + + diff --git a/apps/docs/content/docs/en/mcp/deploy-workflows.mdx b/apps/docs/content/docs/en/deployment/mcp.mdx similarity index 99% rename from apps/docs/content/docs/en/mcp/deploy-workflows.mdx rename to apps/docs/content/docs/en/deployment/mcp.mdx index 25c78609a80..5b11853ea2d 100644 --- a/apps/docs/content/docs/en/mcp/deploy-workflows.mdx +++ b/apps/docs/content/docs/en/deployment/mcp.mdx @@ -1,5 +1,5 @@ --- -title: Deploy Workflows as MCP +title: MCP deployment description: Expose your workflows as MCP tools for external AI assistants and applications --- diff --git a/apps/docs/content/docs/en/deployment/meta.json b/apps/docs/content/docs/en/deployment/meta.json new file mode 100644 index 00000000000..9d84bce6cff --- /dev/null +++ b/apps/docs/content/docs/en/deployment/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Deployment", + "pages": ["index", "api", "chat", "mcp"] +} diff --git a/apps/docs/content/docs/en/enterprise/index.mdx b/apps/docs/content/docs/en/enterprise/index.mdx index 570c8e633f9..6642ea41004 100644 --- a/apps/docs/content/docs/en/enterprise/index.mdx +++ b/apps/docs/content/docs/en/enterprise/index.mdx @@ -5,7 +5,7 @@ description: Enterprise features for business organizations import { FAQ } from '@/components/ui/faq' -Sim Enterprise provides advanced features for organizations with enhanced security, compliance, and management requirements. +Sim Enterprise adds fine-grained access control, SSO, audit logging, and compliance features on top of Team plans. --- @@ -29,7 +29,7 @@ External workspace members can be assigned to permission groups just like intern Any workspace admin on an Enterprise-entitled workspace can manage permission groups. Users not assigned to any group have full access. Restrictions are enforced at both UI and execution time, based on the workflow's workspace. -See the [Access Control guide](/docs/enterprise/access-control) for full details. +See the [Access Control guide](/enterprise/access-control) for full details. --- @@ -37,31 +37,31 @@ See the [Access Control guide](/docs/enterprise/access-control) for full details Enterprise authentication with SAML 2.0 and OIDC support. Works with Okta, Azure AD (Entra ID), Google Workspace, ADFS, and any standard OIDC or SAML 2.0 provider. -See the [SSO setup guide](/docs/enterprise/sso) for step-by-step instructions and provider-specific configuration. +See the [SSO setup guide](/enterprise/sso) for step-by-step instructions and provider-specific configuration. --- ## Whitelabeling -Replace Sim's default branding — logos, product name, and favicons — with your own. See the [whitelabeling guide](/docs/enterprise/whitelabeling). +Replace Sim's default branding — logos, product name, and favicons — with your own. See the [whitelabeling guide](/enterprise/whitelabeling). --- ## Audit Logs -Track configuration and security-relevant actions across your organization for compliance and monitoring. See the [audit logs guide](/docs/enterprise/audit-logs). +Track configuration and security-relevant actions across your organization for compliance and monitoring. See the [audit logs guide](/enterprise/audit-logs). --- ## Data Retention -Configure how long execution logs, soft-deleted resources, and Mothership data are kept before permanent deletion. See the [data retention guide](/docs/enterprise/data-retention). +Configure how long execution logs, soft-deleted resources, and Mothership data are kept before permanent deletion. See the [data retention guide](/enterprise/data-retention). --- ## Data Drains -Continuously export workflow logs, audit logs, and Mothership data to a customer-owned S3 bucket or HTTPS webhook on a schedule. See the [data drains guide](/docs/enterprise/data-drains). +Continuously export workflow logs, audit logs, and Mothership data to a customer-owned S3 bucket or HTTPS webhook on a schedule. See the [data drains guide](/enterprise/data-drains). --- diff --git a/apps/docs/content/docs/en/execution/api.mdx b/apps/docs/content/docs/en/execution/api.mdx deleted file mode 100644 index 5e8e2ea07ca..00000000000 --- a/apps/docs/content/docs/en/execution/api.mdx +++ /dev/null @@ -1,606 +0,0 @@ ---- -title: External API ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Video } from '@/components/ui/video' - -Sim provides a comprehensive external API for querying workflow run logs and setting up webhooks for real-time notifications when workflows complete. - -## Authentication - -All API requests require an API key passed in the `x-api-key` header: - -```bash -curl -H "x-api-key: YOUR_API_KEY" \ - https://sim.ai/api/v1/logs?workspaceId=YOUR_WORKSPACE_ID -``` - -You can generate API keys from the Sim platform and navigate to **Settings**, then go to **Sim Keys** and click **Create**. - -## Logs API - -All API responses include information about your workflow run limits and usage: - -```json -"limits": { - "workflowExecutionRateLimit": { - "sync": { - "requestsPerMinute": 150, // Sustained rate limit per minute - "maxBurst": 300, // Maximum burst capacity - "remaining": 298, // Current tokens available (up to maxBurst) - "resetAt": "..." // When tokens next refill - }, - "async": { - "requestsPerMinute": 1000, // Sustained rate limit per minute - "maxBurst": 2000, // Maximum burst capacity - "remaining": 1998, // Current tokens available - "resetAt": "..." // When tokens next refill - } - }, - "usage": { - "currentPeriodCost": 1.234, // Current billing period usage in USD - "limit": 10, // Usage limit in USD - "plan": "pro", // Current subscription plan - "isExceeded": false // Whether limit is exceeded - } -} -``` - -**Note:** Rate limits use a token bucket algorithm. `remaining` can exceed `requestsPerMinute` up to `maxBurst` when you haven't used your full allowance recently, allowing for burst traffic. The rate limits in the response body are for workflow runs. The rate limits for calling this API endpoint are in the response headers (`X-RateLimit-*`). - -### Query Logs - -Query workflow run logs with extensive filtering options. - - - - ```http - GET /api/v1/logs - ``` - - **Required Parameters:** - - `workspaceId` - Your workspace ID - - **Optional Filters:** - - `workflowIds` - Comma-separated workflow IDs - - `folderIds` - Comma-separated folder IDs - - `triggers` - Comma-separated trigger types: `api`, `webhook`, `schedule`, `manual`, `chat` - - `level` - Filter by level: `info`, `error` - - `startDate` - ISO timestamp for date range start - - `endDate` - ISO timestamp for date range end - - `executionId` - Exact run ID match - - `minDurationMs` - Minimum run duration in milliseconds - - `maxDurationMs` - Maximum run duration in milliseconds - - `minCost` - Minimum run cost - - `maxCost` - Maximum run cost - - `model` - Filter by AI model used - - **Pagination:** - - `limit` - Results per page (default: 100) - - `cursor` - Cursor for next page - - `order` - Sort order: `desc`, `asc` (default: desc) - - **Detail Level:** - - `details` - Response detail level: `basic`, `full` (default: basic) - - `includeTraceSpans` - Include trace spans (default: false) - - `includeFinalOutput` - Include final output (default: false) - - - ```json - { - "data": [ - { - "id": "log_abc123", - "workflowId": "wf_xyz789", - "executionId": "exec_def456", - "level": "info", - "trigger": "api", - "startedAt": "2025-01-01T12:34:56.789Z", - "endedAt": "2025-01-01T12:34:57.123Z", - "totalDurationMs": 334, - "cost": { - "total": 0.00234 - }, - "files": null - } - ], - "nextCursor": "eyJzIjoiMjAyNS0wMS0wMVQxMjozNDo1Ni43ODlaIiwiaWQiOiJsb2dfYWJjMTIzIn0", -"limits": { - "workflowExecutionRateLimit": { - "sync": { - "requestsPerMinute": 150, - "maxBurst": 300, - "remaining": 298, - "resetAt": "2025-01-01T12:35:56.789Z" - }, - "async": { - "requestsPerMinute": 1000, - "maxBurst": 2000, - "remaining": 1998, - "resetAt": "2025-01-01T12:35:56.789Z" - } - }, - "usage": { - "currentPeriodCost": 1.234, - "limit": 10, - "plan": "pro", - "isExceeded": false - } - } - } - ``` - - - -### Get Log Details - -Retrieve detailed information about a specific log entry. - - - - ```http - GET /api/v1/logs/{id} - ``` - - - ```json - { - "data": { - "id": "log_abc123", - "workflowId": "wf_xyz789", - "executionId": "exec_def456", - "level": "info", - "trigger": "api", - "startedAt": "2025-01-01T12:34:56.789Z", - "endedAt": "2025-01-01T12:34:57.123Z", - "totalDurationMs": 334, - "workflow": { - "id": "wf_xyz789", - "name": "My Workflow", - "description": "Process customer data" - }, - "executionData": { - "traceSpans": [...], - "finalOutput": {...} - }, - "cost": { - "total": 0.00234, - "tokens": { - "prompt": 123, - "completion": 456, - "total": 579 - }, - "models": { - "gpt-4o": { - "input": 0.001, - "output": 0.00134, - "total": 0.00234, - "tokens": { - "prompt": 123, - "completion": 456, - "total": 579 - } - } - } - }, - "limits": { - "workflowExecutionRateLimit": { - "sync": { - "requestsPerMinute": 150, - "maxBurst": 300, - "remaining": 298, - "resetAt": "2025-01-01T12:35:56.789Z" - }, - "async": { - "requestsPerMinute": 1000, - "maxBurst": 2000, - "remaining": 1998, - "resetAt": "2025-01-01T12:35:56.789Z" - } - }, - "usage": { - "currentPeriodCost": 1.234, - "limit": 10, - "plan": "pro", - "isExceeded": false - } - } - } - } - ``` - - - -### Get Run Details - -Retrieve run details including the workflow state snapshot. - - - - ```http - GET /api/v1/logs/executions/{executionId} - ``` - - - ```json - { - "executionId": "exec_def456", - "workflowId": "wf_xyz789", - "workflowState": { - "blocks": {...}, - "edges": [...], - "loops": {...}, - "parallels": {...} - }, - "executionMetadata": { - "trigger": "api", - "startedAt": "2025-01-01T12:34:56.789Z", - "endedAt": "2025-01-01T12:34:57.123Z", - "totalDurationMs": 334, - "cost": {...} - } - } - ``` - - - -## Notifications - -Get real-time notifications when workflow runs complete via webhook, email, or Slack. Notifications are configured at the workspace level from the Logs page. - -### Configuration - -Configure notifications from the Logs page by clicking the menu button and selecting "Configure Notifications". - -**Notification Channels:** -- **Webhook**: Send HTTP POST requests to your endpoint -- **Email**: Receive email notifications with run details -- **Slack**: Post messages to a Slack channel - -**Workflow Selection:** -- Select specific workflows to monitor -- Or choose "All Workflows" to include current and future workflows - -**Filtering Options:** -- `levelFilter`: Log levels to receive (`info`, `error`) -- `triggerFilter`: Trigger types to receive (`api`, `webhook`, `schedule`, `manual`, `chat`) - -**Optional Data:** -- `includeFinalOutput`: Include the workflow's final output -- `includeTraceSpans`: Include detailed trace spans -- `includeRateLimits`: Include rate limit information (sync/async limits and remaining) -- `includeUsageData`: Include billing period usage and limits - -### Alert Rules - -Instead of receiving notifications for every run, configure alert rules to be notified only when issues are detected: - -**Consecutive Failures** -- Alert after X consecutive failed runs (e.g., 3 failures in a row) -- Resets when a run succeeds - -**Failure Rate** -- Alert when failure rate exceeds X% over the last Y hours -- Requires minimum 5 runs in the window -- Only triggers after the full time window has elapsed - -**Latency Threshold** -- Alert when any run takes longer than X seconds -- Useful for catching slow or hanging workflows - -**Latency Spike** -- Alert when a run is X% slower than the average -- Compares against the average duration over the configured time window -- Requires minimum 5 runs to establish baseline - -**Cost Threshold** -- Alert when a single run costs more than $X -- Useful for catching expensive LLM calls - -**No Activity** -- Alert when no runs occur within X hours -- Useful for monitoring scheduled workflows that should run regularly - -**Error Count** -- Alert when error count exceeds X within a time window -- Tracks total errors, not consecutive - -All alert types include a 1-hour cooldown to prevent notification spam. - -### Webhook Configuration - -For webhooks, additional options are available: -- `url`: Your webhook endpoint URL -- `secret`: Optional secret for HMAC signature verification - -### Payload Structure - -When a workflow run completes, Sim sends the following payload (via webhook POST, email, or Slack): - -```json -{ - "id": "evt_123", - "type": "workflow.execution.completed", - "timestamp": 1735925767890, - "data": { - "workflowId": "wf_xyz789", - "executionId": "exec_def456", - "status": "success", - "level": "info", - "trigger": "api", - "startedAt": "2025-01-01T12:34:56.789Z", - "endedAt": "2025-01-01T12:34:57.123Z", - "totalDurationMs": 334, - "cost": { - "total": 0.00234, - "tokens": { - "prompt": 123, - "completion": 456, - "total": 579 - }, - "models": { - "gpt-4o": { - "input": 0.001, - "output": 0.00134, - "total": 0.00234, - "tokens": { - "prompt": 123, - "completion": 456, - "total": 579 - } - } - } - }, - "files": null, - "finalOutput": {...}, // Only if includeFinalOutput=true - "traceSpans": [...], // Only if includeTraceSpans=true - "rateLimits": {...}, // Only if includeRateLimits=true - "usage": {...} // Only if includeUsageData=true - }, - "links": { - "log": "/v1/logs/log_abc123", - "execution": "/v1/logs/executions/exec_def456" - } -} -``` - -### Webhook Headers - -Each webhook request includes these headers (webhook channel only): - -- `sim-event`: Event type (always `workflow.execution.completed`) -- `sim-timestamp`: Unix timestamp in milliseconds -- `sim-delivery-id`: Unique delivery ID for idempotency -- `sim-signature`: HMAC-SHA256 signature for verification (if secret configured) -- `Idempotency-Key`: Same as delivery ID for duplicate detection - -### Signature Verification - -If you configure a webhook secret, verify the signature to ensure the webhook is from Sim: - - - - ```javascript - import crypto from 'crypto'; - - function verifyWebhookSignature(body, signature, secret) { - const [timestampPart, signaturePart] = signature.split(','); - const timestamp = timestampPart.replace('t=', ''); - const expectedSignature = signaturePart.replace('v1=', ''); - - const signatureBase = `${timestamp}.${body}`; - const hmac = crypto.createHmac('sha256', secret); - hmac.update(signatureBase); - const computedSignature = hmac.digest('hex'); - - return computedSignature === expectedSignature; - } - - // In your webhook handler - app.post('/webhook', (req, res) => { - const signature = req.headers['sim-signature']; - const body = JSON.stringify(req.body); - - if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) { - return res.status(401).send('Invalid signature'); - } - - // Process the webhook... - }); - ``` - - - ```python - import hmac - import hashlib - import json - - def verify_webhook_signature(body: str, signature: str, secret: str) -> bool: - timestamp_part, signature_part = signature.split(',') - timestamp = timestamp_part.replace('t=', '') - expected_signature = signature_part.replace('v1=', '') - - signature_base = f"{timestamp}.{body}" - computed_signature = hmac.new( - secret.encode(), - signature_base.encode(), - hashlib.sha256 - ).hexdigest() - - return hmac.compare_digest(computed_signature, expected_signature) - - # In your webhook handler - @app.route('/webhook', methods=['POST']) - def webhook(): - signature = request.headers.get('sim-signature') - body = json.dumps(request.json) - - if not verify_webhook_signature(body, signature, os.environ['WEBHOOK_SECRET']): - return 'Invalid signature', 401 - - # Process the webhook... - ``` - - - -### Retry Policy - -Failed webhook deliveries are retried with exponential backoff and jitter: - -- Maximum attempts: 5 -- Retry delays: 5 seconds, 15 seconds, 1 minute, 3 minutes, 10 minutes -- Jitter: Up to 10% additional delay to prevent thundering herd -- Only HTTP 5xx and 429 responses trigger retries -- Deliveries timeout after 30 seconds - - - Webhook deliveries are processed asynchronously and don't affect workflow run performance. - - -## Best Practices - -1. **Polling Strategy**: When polling for logs, use cursor-based pagination with `order=asc` and `startDate` to fetch new logs efficiently. - -2. **Webhook Security**: Always configure a webhook secret and verify signatures to ensure requests are from Sim. - -3. **Idempotency**: Use the `Idempotency-Key` header to detect and handle duplicate webhook deliveries. - -4. **Privacy**: By default, `finalOutput` and `traceSpans` are excluded from responses. Only enable these if you need the data and understand the privacy implications. - -5. **Rate Limiting**: Implement exponential backoff when you receive 429 responses. Check the `Retry-After` header for the recommended wait time. - -## Rate Limiting - -The API uses a **token bucket algorithm** for rate limiting, providing fair usage while allowing burst traffic: - -| Plan | Requests/Minute | Burst Capacity | -|------|-----------------|----------------| -| Free | 30 | 60 | -| Pro | 100 | 200 | -| Team | 200 | 400 | -| Enterprise | 500 | 1000 | - -**How it works:** -- Tokens refill at `requestsPerMinute` rate -- You can accumulate up to `maxBurst` tokens when idle -- Each request consumes 1 token -- Burst capacity allows handling traffic spikes - -Rate limit information is included in response headers: -- `X-RateLimit-Limit`: Requests per minute (refill rate) -- `X-RateLimit-Remaining`: Current tokens available -- `X-RateLimit-Reset`: ISO timestamp when tokens next refill - -## Example: Polling for New Logs - -```javascript -let cursor = null; -const workspaceId = 'YOUR_WORKSPACE_ID'; -const startDate = new Date().toISOString(); - -async function pollLogs() { - const params = new URLSearchParams({ - workspaceId, - startDate, - order: 'asc', - limit: '100' - }); - - if (cursor) { - params.append('cursor', cursor); - } - - const response = await fetch( - `https://sim.ai/api/v1/logs?${params}`, - { - headers: { - 'x-api-key': 'YOUR_API_KEY' - } - } - ); - - if (response.ok) { - const data = await response.json(); - - // Process new logs - for (const log of data.data) { - console.log(`New execution: ${log.executionId}`); - } - - // Update cursor for next poll - if (data.nextCursor) { - cursor = data.nextCursor; - } - } -} - -// Poll every 30 seconds -setInterval(pollLogs, 30000); -``` - -## Example: Processing Webhooks - -```javascript -import express from 'express'; -import crypto from 'crypto'; - -const app = express(); -app.use(express.json()); - -app.post('/sim-webhook', (req, res) => { - // Verify signature - const signature = req.headers['sim-signature']; - const body = JSON.stringify(req.body); - - if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) { - return res.status(401).send('Invalid signature'); - } - - // Check timestamp to prevent replay attacks - const timestamp = parseInt(req.headers['sim-timestamp']); - const fiveMinutesAgo = Date.now() - (5 * 60 * 1000); - - if (timestamp < fiveMinutesAgo) { - return res.status(401).send('Timestamp too old'); - } - - // Process the webhook - const event = req.body; - - switch (event.type) { - case 'workflow.execution.completed': - const { workflowId, executionId, status, cost } = event.data; - - if (status === 'error') { - console.error(`Workflow ${workflowId} failed: ${executionId}`); - // Handle error... - } else { - console.log(`Workflow ${workflowId} completed: ${executionId}`); - console.log(`Cost: $${cost.total}`); - // Process successful execution... - } - break; - } - - // Return 200 to acknowledge receipt - res.status(200).send('OK'); -}); - -app.listen(3000, () => { - console.log('Webhook server listening on port 3000'); -}); -``` - -import { FAQ } from '@/components/ui/faq' - - Sim Keys in the platform. Workflows with public API access enabled can also be called without authentication." }, - { question: "How does the webhook retry policy work?", answer: "Failed webhook deliveries are retried up to 5 times with exponential backoff: 5 seconds, 15 seconds, 1 minute, 3 minutes, and 10 minutes, plus up to 10% jitter. Only HTTP 5xx and 429 responses trigger retries. Each delivery times out after 30 seconds." }, - { question: "What rate limits apply to the Logs API?", answer: "Rate limits use a token bucket algorithm. Free plans get 30 requests/minute with 60 burst capacity, Pro gets 100/200, Team gets 200/400, and Enterprise gets 500/1000. These are separate from workflow run rate limits, which are shown in the response body." }, - { question: "How do I verify that a webhook is from Sim?", answer: "Configure a webhook secret when setting up notifications. Sim signs each delivery with HMAC-SHA256 using the format 't={timestamp},v1={signature}' in the sim-signature header. Compute the HMAC of '{timestamp}.{body}' with your secret and compare it to the signature value." }, - { question: "What alert rules are available for notifications?", answer: "You can configure alerts for consecutive failures, failure rate thresholds, latency thresholds, latency spikes (percentage above average), cost thresholds, no-activity periods, and error counts within a time window. All alert types include a 1-hour cooldown to prevent notification spam." }, - { question: "Can I filter which runs trigger notifications?", answer: "Yes. You can filter notifications by specific workflows (or select all), log level (info or error), and trigger type (api, webhook, schedule, manual, chat). You can also choose whether to include final output, trace spans, rate limits, and usage data in the notification payload." }, -]} /> diff --git a/apps/docs/content/docs/en/execution/basics.mdx b/apps/docs/content/docs/en/execution/basics.mdx deleted file mode 100644 index 60dc79cbd33..00000000000 --- a/apps/docs/content/docs/en/execution/basics.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Basics ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Card, Cards } from 'fumadocs-ui/components/card' -import { Image } from '@/components/ui/image' - -Understanding how workflows run in Sim is key to building efficient and reliable automations. The execution engine automatically handles dependencies, concurrency, and data flow to ensure your workflows run smoothly and predictably. - -## How Workflows Execute - -Sim's execution engine processes workflows intelligently by analyzing dependencies and running blocks in the most efficient order possible. - -### Concurrent Execution by Default - -Multiple blocks run concurrently when they don't depend on each other. This dramatically improves performance without requiring manual configuration. - -Multiple blocks running concurrently after the Start block - -In this example, both the Customer Support and Deep Researcher agent blocks execute simultaneously after the Start block, maximizing efficiency. - -### Automatic Output Combination - -When blocks have multiple dependencies, the execution engine automatically waits for all dependencies to complete, then provides their combined outputs to the next block. No manual combining required. - -Function block automatically receiving outputs from multiple previous blocks - -The Function block receives outputs from both agent blocks as soon as they complete, allowing you to process the combined results. - -### Smart Routing - -Workflows can branch in multiple directions using routing blocks. The execution engine supports both deterministic routing (with Condition blocks) and AI-powered routing (with Router blocks). - -Workflow showing both conditional and router-based branching - -This workflow demonstrates how a run can follow different paths based on conditions or AI decisions, with each path running independently. - -## Block Types - -Sim provides different types of blocks that serve specific purposes in your workflows: - - - - **Starter blocks** initiate workflows and **Webhook blocks** respond to external events. Every workflow needs a trigger to begin a run. - - - - **Agent blocks** interact with AI models, **Function blocks** run custom code, and **API blocks** connect to external services. These blocks transform and process your data. - - - - **Router blocks** use AI to choose paths, **Condition blocks** branch based on logic, and **Loop/Parallel blocks** handle iterations and concurrency. - - - - **Response blocks** format final outputs for APIs and chat interfaces, returning structured results from your workflows. - - - -All blocks run automatically based on their dependencies - you don't need to manually manage run order or timing. - -## Run Monitoring - -When workflows run, Sim provides real-time visibility into the process: - -- **Live Block States**: See which blocks are currently running, completed, or failed -- **Run Logs**: Detailed logs appear in real-time showing inputs, outputs, and any errors -- **Performance Metrics**: Track run time and costs for each block -- **Path Visualization**: Understand which paths were taken through your workflow - - - All run details are captured and available for review even after workflows complete, helping with debugging and optimization. - - -## Key Principles - -Understanding these core principles will help you build better workflows: - -1. **Dependency-Based Execution**: Blocks only run when all their dependencies have completed -2. **Automatic Parallelization**: Independent blocks run concurrently without configuration -3. **Smart Data Flow**: Outputs flow automatically to connected blocks -4. **Error Handling**: Failed blocks stop their run path but don't affect independent paths -5. **Response Blocks as Exit Points**: When a Response block runs, the entire workflow stops and the API response is sent immediately. Multiple Response blocks can exist on different branches — the first one to run wins -6. **State Persistence**: All block outputs and run details are preserved for debugging -7. **Cycle Protection**: Workflows that call other workflows (via Workflow blocks, MCP tools, or API blocks) are tracked with a call chain. If the chain exceeds 25 hops, the run is stopped to prevent infinite loops - -## Next Steps - -Now that you understand execution basics, explore: -- **[Block Types](/blocks)** - Learn about specific block capabilities -- **[Logging](/execution/logging)** - Monitor workflow runs and debug issues -- **[Cost Calculation](/execution/costs)** - Understand and optimize workflow costs -- **[Triggers](/triggers)** - Set up different ways to run your workflows diff --git a/apps/docs/content/docs/en/execution/index.mdx b/apps/docs/content/docs/en/execution/index.mdx deleted file mode 100644 index 348793f4671..00000000000 --- a/apps/docs/content/docs/en/execution/index.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Overview ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Card, Cards } from 'fumadocs-ui/components/card' -import { Image } from '@/components/ui/image' -import { FAQ } from '@/components/ui/faq' - -Sim's execution engine brings your workflows to life by processing blocks in the correct order, managing data flow, and handling errors gracefully, so you can understand exactly how workflows run in Sim. - - - Every workflow run follows a deterministic path based on your block connections and logic, ensuring predictable and reliable results. - - -## Documentation Overview - - - - Learn about the fundamental execution flow, block types, and how data flows through your - workflow - - - - Monitor workflow runs with comprehensive logging and real-time visibility - - - - Understand how workflow run costs are calculated and optimized - - - - Access run logs and set up webhooks programmatically via REST API - - - - Deploy your workflow as a REST API endpoint with sync, streaming, and async modes - - - - Deploy your workflow as a conversational chat interface with streaming, file uploads, and voice - - - - -## Key Concepts - -### Topological Execution -Blocks run in dependency order, similar to how a spreadsheet recalculates cells. The execution engine automatically determines which blocks can run based on completed dependencies. - -### Path Tracking -The engine actively tracks run paths through your workflow. Router and Condition blocks dynamically update these paths, ensuring only relevant blocks run. - -### Layer-Based Processing -Instead of executing blocks one-by-one, the engine identifies layers of blocks that can run in parallel, optimizing performance for complex workflows. - -### Run Context -Each workflow maintains a rich context during a run containing: -- Block outputs and states -- Active run paths -- Loop and parallel iteration tracking -- Environment variables -- Routing decisions - - -## Deployment Snapshots - -API, Chat, Schedule, and Webhook runs use the workflow’s active deployment snapshot. Manual runs from the editor use the current draft canvas state, letting you test changes before deploying. Publish a new deployment whenever you change the canvas so every trigger uses the updated version. - -
- Deployment versions table -
- -### Version History - -The **General** tab in the Deploy modal shows a version history table for every deployment. Each row shows the version name, who deployed it, and when. - -
- Version history table with multiple deployment versions -
- -From the version table you can: - -- **Rename** a version to give it a meaningful label (e.g., "v2 — added error handling") -- **Add a description** with notes about what changed in that deployment -- **Promote to live** to roll back to an older version — this makes the selected version the active deployment without changing your draft canvas -- **Load into editor** to restore a previous version's workflow into the canvas for editing and redeploying -- **Preview a version** by selecting a row to view that version's workflow in the canvas preview, then toggle between **Live** and the selected version - -
- Previewing a selected deployment version -
- - - Promoting an old version takes effect immediately — all API, Chat, Schedule, and Webhook executions will use the promoted version. Your draft canvas is not affected. - - -## Programmatic Access - -Run workflows from your applications using our official SDKs: - -```bash -# TypeScript/JavaScript -npm install simstudio-ts-sdk - -# Python -pip install simstudio-sdk -``` - -```typescript -// TypeScript Example -import { SimStudioClient } from 'simstudio-ts-sdk'; - -const client = new SimStudioClient({ - apiKey: 'your-api-key' -}); - -const result = await client.executeWorkflow('workflow-id', { - input: { message: 'Hello' } -}); -``` - -## Best Practices - -### Design for Reliability -- Handle errors gracefully with appropriate fallback paths -- Use environment variables for sensitive data -- Add logging to Function blocks for debugging - -### Optimize Performance -- Minimize external API calls where possible -- Use parallel execution for independent operations -- Cache results with Memory blocks when appropriate - -### Monitor Runs -- Review logs regularly to understand performance patterns -- Track costs for AI model usage -- Use workflow snapshots to debug issues - -## What's Next? - -Start with [Execution Basics](/execution/basics) to understand how workflows run, then explore [Logging](/execution/logging) to monitor your runs and [Cost Calculation](/execution/costs) to optimize your spending. - - diff --git a/apps/docs/content/docs/en/execution/logging.mdx b/apps/docs/content/docs/en/execution/logging.mdx deleted file mode 100644 index dbbf50a3835..00000000000 --- a/apps/docs/content/docs/en/execution/logging.mdx +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Logging ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' - -Sim provides comprehensive logging for all workflow runs, giving you complete visibility into how your workflows run, what data flows through them, and where issues might occur. - -## Logging System - -Sim offers two complementary logging interfaces to match different workflows and use cases: - -### Real-Time Console - -During manual or chat workflow runs, logs appear in real-time in the Console panel on the right side of the workflow editor: - -
- Real-time Console Panel -
- -The console shows: -- Block progress with active block highlighting -- Real-time outputs as blocks complete -- Timing for each block -- Success/error status indicators - -### Logs Page - -All workflow runs—whether triggered manually, via API, Chat, Schedule, or Webhook—are logged to the dedicated Logs page: - -
- Logs Page -
- -The Logs page provides: -- Comprehensive filtering by time range, status, trigger type, folder, and workflow -- Search functionality across all logs -- Live mode for real-time updates -- 7-day log retention (upgradeable for longer retention) - -## Log Details Sidebar - -Clicking on any log entry opens a detailed sidebar view: - -
- Logs Sidebar Details -
- -### Block Input/Output - -View the complete data flow for each block with tabs to switch between: - - - - **Output Tab** shows the block's result: - - Structured data with JSON formatting - - Markdown rendering for AI-generated content - - Copy button for easy data extraction - - - - **Input Tab** displays what was passed to the block: - - Resolved variable values - - Referenced outputs from other blocks - - Environment variables used - - API keys are automatically redacted for security - - - -### Run Timeline - -For workflow-level logs, view detailed run metrics: -- Start and end timestamps -- Total workflow duration -- Individual block run times -- Performance bottleneck identification - -## Workflow Snapshots - -For any logged run, click "View Snapshot" to see the exact workflow state at the time of the run: - -
- Workflow Snapshot -
- -The snapshot provides: -- Frozen canvas showing the workflow structure -- Block states and connections as they were during the run -- Click any block to see its inputs and outputs -- Useful for debugging workflows that have since been modified - - - Workflow snapshots are only available for runs after the enhanced logging system was introduced. Older migrated logs show a "Logged State Not Found" message. - - -## Log Retention - -- **Free Plan**: 7 days of log retention (logs are archived to cloud storage and then deleted) -- **Pro / Team / Enterprise Plans**: Logs are retained indefinitely (no automatic cleanup) - -## Best Practices - -### For Development -- Use the real-time console for immediate feedback during testing -- Check block inputs and outputs to verify data flow -- Use workflow snapshots to compare working vs. broken versions - -### For Production -- Monitor the Logs page regularly for errors or performance issues -- Set up filters to focus on specific workflows or time periods -- Use live mode during critical deployments to watch runs in real-time - -### For Debugging -- Always check the run timeline to identify slow blocks -- Compare inputs between working and failing runs -- Use workflow snapshots to see the exact state when issues occurred - -## Next Steps - -- Learn about [Cost Calculation](/execution/costs) to understand workflow pricing -- Explore the [External API](/execution/api) for programmatic log access -- Set up [Notifications](/execution/api#notifications) for real-time alerts via webhook, email, or Slack - -import { FAQ } from '@/components/ui/faq' - - \ No newline at end of file diff --git a/apps/docs/content/docs/en/execution/meta.json b/apps/docs/content/docs/en/execution/meta.json deleted file mode 100644 index 9092f40f161..00000000000 --- a/apps/docs/content/docs/en/execution/meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "pages": ["index", "basics", "files", "api", "api-deployment", "chat", "logging", "costs"] -} diff --git a/apps/docs/content/docs/en/files/generating.mdx b/apps/docs/content/docs/en/files/generating.mdx new file mode 100644 index 00000000000..3e0db9b60d4 --- /dev/null +++ b/apps/docs/content/docs/en/files/generating.mdx @@ -0,0 +1,68 @@ +--- +title: Generating files +description: How a workflow produces a document, report, or media file and saves it to the workspace Files store. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' + +A generated file is an artifact a workflow run creates: a report, a CSV, a rendered audio clip. It starts as a value a block produces and becomes a workspace file when a [File](/integrations/file) block writes it to the [Files](/files) store. Once saved, it has a name, a size, and a URL, and any later run can read it back. + +Like a build pipeline that produces artifacts and stores them in an artifact repository, a workflow produces file artifacts that land in your workspace Files store, indexed by ID and shared across every workflow. + +{/* VISUAL: flow diagram: [Agent/Function block produces content] → [File block, Write] → [Files panel, file visible] */} + +## What produces file content + +Most generated files start as the output of an earlier block. Two patterns are common. + +A block returns **text content** you want to keep. An [Agent](/blocks/agent) writes an analysis or summary; a [Function](/blocks/function) builds a CSV or formats a report. That text is part of the block's output, read by reference as `` or ``. To make it a file, you pass that value into a File block set to Write. + +A block returns a **file object** directly. ElevenLabs text-to-speech returns an `audioFile`; an image generator returns a generated image; the File block's own Read operation returns parsed files. These are already [UserFile](/files/passing-files) objects (an object with `id`, `name`, `url`, `size`, and `type`), so they appear in the output panel as files with no Write step. You can hand one to a downstream block, or write its content to the Files store to persist it. + + +A block's output is remembered under the block's name for the rest of the run, and a later block reads it by key, like `` or ``. Producing content and saving it are two separate steps: the producing block holds the value, the File block persists it. + + +## Saving content with the File block + +The [File](/integrations/file) block's **Write** operation creates a new workspace file. It takes two required fields: a `fileName` (like `report.md`) and the `content` string to store. It returns the saved file's details. + +{/* VISUAL: File Write anatomy: inputs (fileName, content, contentType?) → outputs (id, name, size, url) */} + +To save an Agent's analysis, connect Agent into a File block, set the operation to Write, and reference the Agent's output: `fileName` = `research_summary.md`, `content` = ``. When the workflow runs, the File block writes the file and produces: + +- `id`: the canonical file ID, used to fetch the file later. +- `name`: the final file name after any deduplication (see below). +- `size`: the byte count. +- `url`: an absolute URL to download or preview the file. + +The content type is detected from the file extension: `.csv` becomes `text/csv`, `.pdf` becomes `application/pdf`, `.md` becomes `text/markdown`. To set it yourself, fill in `contentType` in advanced mode. + +If a file with the same name already exists in the workspace, Write does not overwrite it. It appends a numeric suffix instead: a second `data.csv` is saved as `data (1).csv`, a third as `data (2).csv`. To add to an existing file rather than create a new one, use the **Append** operation, which writes content to the end of a named file. + +## Where the file goes + +A saved file lands in the workspace [Files](/files) store, the same place uploads live. It shows up in the Files panel in the sidebar with its name, size, type icon, and modified date, grouped by category: document, image, audio, video, or code. From there you can preview it, rename it, move it into a folder, or download it by URL. + +{/* VISUAL: Files panel UI: generated files listed with name, size, type icon, owner, modified date, folder */} + +Files are scoped to the workspace, not to one workflow. A file written by one workflow is visible to every other workflow in the same workspace. Any later run can read it back with the File block's Read or Get operation, or by selecting it in a file picker. + +During a run, the file also appears in the output panel as the File block's output, shown as a structured object with its `id`, `name`, `url`, and `size`. The output panel shows you one run as it happens, while the Files store is where the file stays afterward. + +{/* VISUAL: output panel tree: file object (id, name, url, size, type) during a run, beside the same file in the Files store */} + +## Returning a generated file from a deployment + +When a workflow is deployed as an [API](/deployment/api), a generated file can be part of the response. Reference the file in a [Response](/blocks/response) block, or include its ID in the object you return. The caller uses the `url` or `id` to fetch the file from the workspace store. The file itself stays in the Files store, and the response carries a pointer to it, not the bytes. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/files/index.mdx b/apps/docs/content/docs/en/files/index.mdx new file mode 100644 index 00000000000..6d34d50a5e2 --- /dev/null +++ b/apps/docs/content/docs/en/files/index.mdx @@ -0,0 +1,25 @@ +--- +title: Overview +description: Files are the documents, images, spreadsheets, and PDFs your workflows read and produce. +pageType: concept +--- + +import { Card, Cards } from 'fumadocs-ui/components/card' + +A **file** is a document, image, spreadsheet, or PDF in your workspace. Files are how documents and media move into and out of your agents. Your team uploads them, you create them in the editor, or a workflow produces them, and they all live in one store shared across the workspace. + +Any [workflow](/workflows) can read a file or produce one. You might upload a contract for an agent to review, generate a report from a table, or hand a workflow the document it needs to answer a question. + +## How files fit the workspace + +- **[Workflows](/workflows)** read files, like a PDF to summarize, and produce them, like a rendered report. See [using files in workflows](/files/using-in-workflows). +- **[Knowledge bases](/knowledgebase)** are built from files you upload, turning their contents into searchable memory. +- **[Deployments](/deployment)** can take a file as input and return one as output. + +Use a file when the document or media itself is what matters. Use a [table](/tables) when you need structured rows and fields, and a [knowledge base](/knowledgebase) when an agent needs to search across many documents. + + + + + + diff --git a/apps/docs/content/docs/en/execution/files.mdx b/apps/docs/content/docs/en/files/passing-files.mdx similarity index 86% rename from apps/docs/content/docs/en/execution/files.mdx rename to apps/docs/content/docs/en/files/passing-files.mdx index 41c04692c4f..ba4fba6ddb6 100644 --- a/apps/docs/content/docs/en/execution/files.mdx +++ b/apps/docs/content/docs/en/files/passing-files.mdx @@ -1,11 +1,13 @@ --- -title: Passing Files +title: Passing files +description: How file objects move between blocks, into workflows via the API, and back out in responses. +pageType: guide --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -Sim makes it easy to work with files throughout your workflows. Blocks can receive files, process them, and pass them to other blocks seamlessly. +A file moves through a workflow as a standardized **file object**. Blocks receive it, act on it, and pass it on — this page covers the object's shape, how to reference it between blocks, and how files enter and leave through the API. ## File Objects @@ -13,11 +15,12 @@ When blocks output files (like Gmail attachments, generated images, or parsed do ```json { + "id": "f_8c2...", "name": "report.pdf", "url": "https://...", - "base64": "JVBERi0xLjQK...", + "size": 245678, "type": "application/pdf", - "size": 245678 + "base64": "JVBERi0xLjQK..." } ``` @@ -25,7 +28,7 @@ You can access any of these properties when referencing files from previous bloc ## The File Block -The **File block** is the universal entry point for files in your workflows. It accepts files from any source and outputs standardized file objects that work with all integrations. +The **File block** brings a file into a workflow. It accepts files from any source and outputs standardized file objects every block understands. **Inputs:** - **Uploaded files** - Drag and drop or select files directly @@ -33,7 +36,7 @@ The **File block** is the universal entry point for files in your workflows. It - **Files from other blocks** - Pass files from Gmail attachments, Slack downloads, etc. **Outputs:** -- A list of `UserFile` objects with consistent structure (`name`, `url`, `base64`, `type`, `size`) +- A list of `UserFile` objects with consistent structure (`id`, `name`, `url`, `size`, `type`, `base64`) - `combinedContent` - Extracted text content from all files (for documents) **Example usage:** @@ -139,7 +142,7 @@ Use `url` for direct downloads or `base64` for inline processing. **File inputs:** - **File** - Parse documents, images, and text files -- **Vision** - Analyze images with AI models +- **Agent** - Read images with a vision-capable model, or documents as text - **Mistral Parser** - Extract text from PDFs **File outputs:** @@ -163,7 +166,7 @@ Use `url` for direct downloads or `base64` for inline processing. 1. **Use file objects directly** - Pass the full file object rather than extracting individual properties. Blocks handle the conversion automatically. -2. **Check file types** - Ensure the file type matches what the receiving block expects. The Vision block needs images, the File block handles documents. +2. **Check file types** - Ensure the file type matches what the receiving block expects. An Agent using a vision-capable model can read images, while the File block handles documents. 3. **Consider file size** - Large files increase run time. For very large files, consider using storage blocks (S3, Supabase) for intermediate storage. @@ -173,7 +176,6 @@ import { FAQ } from '@/components/ui/faq' { question: "What is the maximum file size for uploads?", answer: "The maximum file size for files processed during a workflow run is 20 MB. Files exceeding this limit will be rejected with an error indicating the actual file size. For larger files, use storage blocks like S3 or Supabase for intermediate storage." }, { question: "What file input formats are supported via the API?", answer: "When triggering a workflow via API, you can send files as base64-encoded data (using a data URI with the format 'data:{mime};base64,{data}') or as a URL pointing to a publicly accessible file. In both cases, include the file name and MIME type in the request." }, { question: "How are files passed between blocks internally?", answer: "Files are represented as standardized UserFile objects with name, url, base64, type, and size properties. Most blocks accept the full file object and extract what they need automatically, so you typically pass the entire object rather than individual properties." }, - { question: "Which blocks can output files?", answer: "Gmail outputs email attachments, Slack outputs downloaded files, TTS generates audio files, Video Generator and Image Generator produce media files. Storage blocks like S3, Supabase, Google Drive, and Dropbox can also retrieve files for use in downstream blocks." }, { question: "Do I need to extract base64 or URL from file objects manually?", answer: "No. Most blocks accept the full file object and handle the format conversion automatically. Simply pass the entire file reference (e.g., ) and the receiving block will extract the data it needs." }, { question: "How do file fields work in the Start block's input format?", answer: "When you define a field with type 'file[]' in the Start block's input format, the engine automatically processes incoming file data (base64 or URL) and uploads it to storage, converting it into UserFile objects before the workflow runs." }, ]} /> diff --git a/apps/docs/content/docs/en/files/using-in-workflows.mdx b/apps/docs/content/docs/en/files/using-in-workflows.mdx new file mode 100644 index 00000000000..2978e1bb85f --- /dev/null +++ b/apps/docs/content/docs/en/files/using-in-workflows.mdx @@ -0,0 +1,110 @@ +--- +title: Using files in workflows +description: Read a file's contents in a workflow, pass a file to a block that needs one, or save a new file from a run. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, FILE_SUMMARY_WORKFLOW } from '@/components/workflow-preview' + +A file is a document, image, spreadsheet, or PDF in your workspace. A workflow can read a file to act on its contents, pass a file to a block or tool that needs one (attach a PDF to an email, send an image to a vision model), or produce a new file and save it. The [File](/integrations/file) block is how a file enters or leaves a workflow; the work in between is done by whatever block the task calls for. + +What you do with a file depends on the task, so this page covers the File block's operations and how a file moves between blocks rather than one fixed recipe. The example we'll use throughout reads `report.pdf`, asks an agent to summarize it, and saves the summary as `summary.md`, which exercises reading, processing, and writing in one workflow. + + + +## The File block + +The **File** block is one block with four operations, chosen from a dropdown. Each operation is a different way a file enters or leaves the workflow. + +| Operation | What it does | Outputs | +| --- | --- | --- | +| **Read** | Take an existing workspace file, by file picker or by file ID. | `files`, `combinedContent` | +| **Fetch** | Download and parse a file from an external URL. | `files`, `combinedContent` | +| **Write** | Create a new workspace file from a name and text content. | `id`, `name`, `size`, `url` | +| **Append** | Add text to the end of an existing workspace file. | `id`, `name`, `size`, `url` | + +Read and Fetch bring a file in. Write and Append send one out. A workflow uses only the operations its task needs, often just Read. The two sections below cover Read and Write; Fetch and Append are one-line variants noted alongside. + +{/* VISUAL: File block config UI. Operation dropdown open showing Read / Fetch / Write / Append */} + +## Reading a file in + +In our example, the first File block is set to **Read**, with `report.pdf` chosen from the file picker. When it runs, it produces two values you can reference: + +- `files`: a list of **file objects**, one per file read. The first is ``. +- `combinedContent`: the extracted text of those files merged into one string, ``. + +A **file object** is the standard shape Sim uses for every file. It carries the file's details: + +```jsonc +{ + "id": "f_8c2…", // workspace file ID + "name": "report.pdf", + "url": "https://…", // where to access it + "size": 248120, // bytes + "type": "application/pdf" +} +``` + +You rarely type a reference by hand. Wherever a block parameter accepts a file or a value, the builder lists the available outputs and you pick the one you want. Read mode also takes a file ID directly in advanced mode, which is how you read a file produced earlier in the same run. + + +**Fetch** is Read for files that live outside the workspace. Point it at a URL instead of picking a workspace file, and add request headers (such as `Authorization: Bearer …`) when the download needs authentication. It outputs the same `files` and `combinedContent`. + + +{/* VISUAL: File block in Read mode, file picker open with report.pdf selected; callout on the files[] and combinedContent outputs */} + +## Processing the file + +Once a file is read, a processing block reads that output by name. Two blocks do this, and they consume the file differently. + +### Agent block + +An [Agent](/blocks/agent) block has a **Files** input. Reference the read file there, ``, and write the instruction in the prompt: "Summarize this document." The agent receives the file object, not just its text, so a **vision-capable model** (such as Claude or GPT-4o) can analyze images and scanned pages directly. Other models work from the file's text content. + +In our example the Agent reads ``, summarizes it, and keeps the summary under its own name as ``. + +{/* VISUAL: Agent block config. Files input bound to , prompt "Summarize this document" */} + +### Function block + +A [Function](/blocks/function) block runs code, and it works with file **text**, not the file object. It doesn't reach into workspace storage on its own. Pass it the extracted text, ``, and it can parse, filter, or reshape that text and return the result as its own output. Use a Function when the file is structured text (a CSV or JSON dump) and you want exact, deterministic processing instead of a model's interpretation. + + +The two blocks differ in what they take. An **Agent** takes the file object on its Files input, while a **Function** takes the file's text from `combinedContent`. Both store their result under their own name for the next block to read. + + +## Writing a file out + +Writing a file is optional, and many workflows skip it. The agent's summary could be returned in the response, posted to Slack, or emailed as-is without ever becoming a workspace file. Write a file when you specifically need a new one to keep, download, or hand to a later run. + +The last block in our example is a File block set to **Write**. Give it a file name and the content to save: + +- `fileName`: `summary.md` +- `content`: `` + +Write creates a new workspace file and returns its `id`, `name`, `size`, and `url`. If a file with that name already exists, Write keeps both by adding a numeric suffix to the new one. The saved file lands in your workspace [files](/files), ready for the next run, a download, or another workflow. + +{/* VISUAL: run log showing the File Write step with the returned file id, name, and url */} + + +**Append** adds to a file instead of replacing it. Target an existing workspace file by name and give it the content to add to the end. Use it to accumulate across runs, such as appending each run's observation to one `notes.md`. + + +## Composing the steps + +Each block references the previous one by name, so you compose only the steps a task needs. A contract read by an Agent that returns a verdict stops at processing, and an uploaded image described by a vision model never touches Write, while a fetched CSV cleaned by a Function and saved as a new file uses all three. Reading a file in is common, and writing one out is only for when the result is itself a file. + +For the file-object schema in full, base64 access, and how files move across API and chat triggers, see [Passing files](/files/passing-files). + +## Next + + + + + + + + diff --git a/apps/docs/content/docs/en/getting-started/index.mdx b/apps/docs/content/docs/en/getting-started/index.mdx index f63be54314d..076deb3d3ad 100644 --- a/apps/docs/content/docs/en/getting-started/index.mdx +++ b/apps/docs/content/docs/en/getting-started/index.mdx @@ -1,203 +1,100 @@ --- title: Getting Started +description: Build your first agent in 10 minutes — a people researcher with web search tools and structured output. +pageType: guide --- -import { Callout } from 'fumadocs-ui/components/callout' import { Card, Cards } from 'fumadocs-ui/components/card' -import { File, Files, Folder } from 'fumadocs-ui/components/files' import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { - AgentIcon, - ApiIcon, - ChartBarIcon, - CodeIcon, - ConditionalIcon, - ConnectIcon, - ExaAIIcon, - FirecrawlIcon, - GmailIcon, - NotionIcon, - PerplexityIcon, - SlackIcon, -} from '@/components/icons' import { Video } from '@/components/ui/video' import { Image } from '@/components/ui/image' import { FAQ } from '@/components/ui/faq' -Build your first AI workflow in 10 minutes. In this tutorial, you'll create a people research agent that uses advanced LLM-powered search tools to extract and structure information about individuals. - -## What You'll Build - -A people research agent that: -1. Accepts user input through a chat interface -2. Searches the web using AI-powered tools (Exa and Linkup) -3. Extracts and structures information about individuals -4. Returns formatted JSON data with location, profession, and education +Build a people research agent in 10 minutes. It takes a name through a chat interface, searches the web with AI search tools, and returns structured JSON with the person's location, profession, and education. Getting Started Example -## Step-by-Step Tutorial +## Tutorial - - Click **New Workflow** in the dashboard and name it "Getting Started". - - Every new workflow includes a **Start block** by default—this is the entry point that receives user input. Since we'll trigger this workflow via chat, no configuration is needed for the Start block. - - Drag an **Agent Block** onto the canvas from the left panel and configure it: - - **Model**: Select "OpenAI GPT-4o" - - **System Prompt**: "You are a people research agent. When given a person's name, use your available search tools to find comprehensive information about them including their location, profession, educational background, and other relevant details." - - **User Prompt**: Drag the connection from the Start block's output into this field to connect `` to the user prompt - + + Click **New Workflow** and name it "Getting Started". The **Start block** is already on the canvas — it's the entry point that receives your chat input. + + Drag an **Agent block** onto the canvas and configure its **Messages**: + - **System**: "You are a people research agent. When given a person's name, use your search tools to find their location, profession, educational background, and other relevant details." + - **User**: insert `` so the agent reads whatever the chat receives. + + Leave the **Model** on the default (`claude-sonnet-4-6`), or pick any other. +
- - - Enhance your agent with web search capabilities. Click on the Agent block to select it. - - In the **Tools** section: - - Click **Add Tool** - - Select **Exa** and **Linkup** from the available tools - - Provide your API keys for both tools to enable web search and data access - + + + In the Agent block's **Tools** section, add **Exa** and **Linkup**, and provide an API key for each. The agent decides when to call them. +
- - - Test your workflow using the **Chat panel** on the right side of the screen. - - In the chat panel: - - Click the dropdown and select `agent1.content` to view the agent's output - - Enter a test message: "John is a software engineer from San Francisco who studied Computer Science at Stanford University." - - Click **Send** to execute the workflow - - The agent will analyze the person and return structured information. - + + + Open the **Chat panel**, select `agent1.content` as the output to display, and send: *"John is a software engineer from San Francisco who studied Computer Science at Stanford University."* + + The agent searches, then returns what it found. +
- - - Configure your agent to return structured JSON data. Click on the Agent block to select it. - - In the **Response Format** section: - - Click the **magic wand icon** (✨) next to the schema field - - Enter the prompt: "create a schema named person, that contains location, profession, and education" - - The AI will automatically generate the JSON schema - + + + In the Agent block's **Response Format**, click the magic wand (✨) and prompt: *"create a schema named person, that contains location, profession, and education"*. The schema is generated for you. +
- - - Return to the **Chat panel** to test the structured response format. - - With the response format configured, new output options are now available: - - Click the dropdown and select the structured output option (the schema you just created) - - Enter a test message: "Sarah is a marketing manager from New York who has an MBA from Harvard Business School." - - Click **Send** to execute the workflow - - The agent will now return structured JSON output with the person's information organized into location, profession, and education fields. - + + + Back in the **Chat panel**, select the new structured output option and send: *"Sarah is a marketing manager from New York who has an MBA from Harvard Business School."* + + The agent now returns JSON with `location`, `profession`, and `education` fields — ready for any downstream block to read by name. +
-## What You've Built - -You've successfully created an AI workflow that: -- ✅ Accepts user input through a chat interface -- ✅ Processes unstructured text using AI -- ✅ Integrates external search tools (Exa and Linkup) -- ✅ Returns structured JSON data with AI-generated schemas -- ✅ Demonstrates real-time testing and iteration -- ✅ Showcases the power of visual, no-code development - -## Key Concepts You Learned - -### Block Types Used - - - } - annotation="Entry point for user input (auto-included)" - /> - } - annotation="AI model for text processing and analysis" - /> - - -### Core Workflow Concepts - -**Data Flow** -Connect blocks by dragging connections to pass data between workflow steps - -**Chat Interface** -Test workflows in real-time with the chat panel and select different output options - -**Tool Integration** -Extend agent capabilities by integrating external services like Exa and Linkup - -**Variable References** -Access block outputs using the `` syntax - -**Structured Output** -Define JSON schemas to ensure consistent, formatted responses from AI - -**AI-Generated Schemas** -Use the magic wand (✨) to generate schemas from natural language prompts - -**Iterative Development** -Build, test, and refine workflows quickly with immediate feedback - -## Next Steps +## Next - - Discover API, Function, Condition, and other blocks + + The full model: blocks, connections, triggers, and how runs execute. - - Connect 1,000+ services including Gmail, Slack, Notion, and more + + Everything the block you just used can do — tools, memory, skills, structured output. - - Write custom functions for advanced data processing + + 1,000+ services your agents can act on, from Gmail to HubSpot. - - Make your agent accessible via REST API or webhooks + + Ship the workflow as an API, a chat, or an MCP server. -## Resources - -**Need detailed explanations?** Visit the [Blocks documentation](/blocks) for comprehensive guides on each component. - -**Looking for integrations?** Explore the [Tools documentation](/tools) to see all 1,000+ available integrations. - -**Ready to go live?** Learn about [Execution and Deployment](/execution) to make your workflows production-ready. - diff --git a/apps/docs/content/docs/en/index.mdx b/apps/docs/content/docs/en/index.mdx index ee56612ae3a..3823a469c39 100644 --- a/apps/docs/content/docs/en/index.mdx +++ b/apps/docs/content/docs/en/index.mdx @@ -17,10 +17,10 @@ Welcome to Sim, the open-source AI workspace where teams build, deploy, and mana Build your first agent in 10 minutes - + Learn about the building blocks - + Explore 1,000+ integrations @@ -28,16 +28,16 @@ Welcome to Sim, the open-source AI workspace where teams build, deploy, and mana ## Core Concepts - + Understand how data flows between blocks - + Work with workflow and environment variables - + Monitor agent runs and manage costs - + Start agents via API, webhooks, or schedules diff --git a/apps/docs/content/docs/en/tools/agentmail.mdx b/apps/docs/content/docs/en/integrations/agentmail.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/agentmail.mdx rename to apps/docs/content/docs/en/integrations/agentmail.mdx index 9432049e745..a76a15fab03 100644 --- a/apps/docs/content/docs/en/tools/agentmail.mdx +++ b/apps/docs/content/docs/en/integrations/agentmail.mdx @@ -41,7 +41,7 @@ Integrate AgentMail into your workflow. Create and manage email inboxes, send an -## Tools +## Actions ### `agentmail_create_draft` diff --git a/apps/docs/content/docs/en/tools/agentphone.mdx b/apps/docs/content/docs/en/integrations/agentphone.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/agentphone.mdx rename to apps/docs/content/docs/en/integrations/agentphone.mdx index fa8d016c77f..f00b01b423c 100644 --- a/apps/docs/content/docs/en/tools/agentphone.mdx +++ b/apps/docs/content/docs/en/integrations/agentphone.mdx @@ -41,7 +41,7 @@ Give your workflow a phone. Provision SMS- and voice-enabled numbers, send messa -## Tools +## Actions ### `agentphone_create_call` diff --git a/apps/docs/content/docs/en/tools/agiloft.mdx b/apps/docs/content/docs/en/integrations/agiloft.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/agiloft.mdx rename to apps/docs/content/docs/en/integrations/agiloft.mdx index 5032b74663d..825affa7769 100644 --- a/apps/docs/content/docs/en/tools/agiloft.mdx +++ b/apps/docs/content/docs/en/integrations/agiloft.mdx @@ -38,7 +38,7 @@ Integrate with Agiloft contract lifecycle management to create, read, update, de -## Tools +## Actions ### `agiloft_attach_file` diff --git a/apps/docs/content/docs/en/tools/ahrefs.mdx b/apps/docs/content/docs/en/integrations/ahrefs.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/ahrefs.mdx rename to apps/docs/content/docs/en/integrations/ahrefs.mdx index 963d852eb8e..553e19943b8 100644 --- a/apps/docs/content/docs/en/tools/ahrefs.mdx +++ b/apps/docs/content/docs/en/integrations/ahrefs.mdx @@ -31,7 +31,7 @@ Integrate Ahrefs SEO tools into your workflow. Analyze domain ratings, backlinks -## Tools +## Actions ### `ahrefs_domain_rating` diff --git a/apps/docs/content/docs/en/tools/airtable.mdx b/apps/docs/content/docs/en/integrations/airtable.mdx similarity index 77% rename from apps/docs/content/docs/en/tools/airtable.mdx rename to apps/docs/content/docs/en/integrations/airtable.mdx index 7825b0264ff..e501d9b6498 100644 --- a/apps/docs/content/docs/en/tools/airtable.mdx +++ b/apps/docs/content/docs/en/integrations/airtable.mdx @@ -30,7 +30,7 @@ Integrates Airtable into the workflow. Can list bases, list tables (with schema) -## Tools +## Actions ### `airtable_list_bases` @@ -221,3 +221,52 @@ Get the schema of all tables, fields, and views in an Airtable base | `metadata` | json | Operation metadata including total tables count | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Airtable Webhook + +Trigger workflow from Airtable record changes like create, update, and delete events (requires Airtable credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires airtable credentials to access your account. | +| `baseId` | string | Yes | The ID of the Airtable Base this webhook will monitor. | +| `tableId` | string | Yes | The ID of the table within the Base that the webhook will monitor. | +| `includeCellValues` | boolean | No | Enable to receive the complete record data in the payload, not just changes. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `payloads` | array | The payloads of the Airtable changes | +| ↳ `timestamp` | string | Timestamp of the change | +| ↳ `baseTransactionNumber` | number | Transaction number | +| `latestPayload` | object | The most recent payload from Airtable | +| ↳ `timestamp` | string | ISO 8601 timestamp of the change | +| ↳ `baseTransactionNumber` | number | Transaction number | +| ↳ `payloadFormat` | string | Payload format version \(e.g., v0\) | +| ↳ `actionMetadata` | object | Metadata about who made the change | +| ↳ `source` | string | Source of the change \(e.g., client, publicApi\) | +| ↳ `sourceMetadata` | object | Source metadata including user info | +| ↳ `user` | object | User who made the change | +| ↳ `id` | string | User ID | +| ↳ `email` | string | User email | +| ↳ `name` | string | User name | +| ↳ `permissionLevel` | string | User permission level | +| ↳ `changedTablesById` | object | Tables that were changed \(keyed by table ID\) | +| ↳ `changedRecordsById` | object | Changed records keyed by record ID | +| ↳ `current` | object | Current state of the record | +| ↳ `cellValuesByFieldId` | object | Cell values keyed by field ID | +| ↳ `createdRecordsById` | object | Created records by ID | +| ↳ `destroyedRecordIds` | array | Array of destroyed record IDs | +| `airtableChanges` | array | Changes made to the Airtable table | +| ↳ `tableId` | string | Table ID | +| ↳ `recordId` | string | Record ID | +| ↳ `changeType` | string | Type of change \(created, changed, destroyed\) | +| ↳ `cellValuesByFieldId` | object | Cell values by field ID | + diff --git a/apps/docs/content/docs/en/tools/airweave.mdx b/apps/docs/content/docs/en/integrations/airweave.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/airweave.mdx rename to apps/docs/content/docs/en/integrations/airweave.mdx index bc9cb8cb3d4..977a13c4ad9 100644 --- a/apps/docs/content/docs/en/tools/airweave.mdx +++ b/apps/docs/content/docs/en/integrations/airweave.mdx @@ -32,7 +32,7 @@ Search across your synced data sources using Airweave. Supports semantic search -## Tools +## Actions ### `airweave_search` diff --git a/apps/docs/content/docs/en/tools/algolia.mdx b/apps/docs/content/docs/en/integrations/algolia.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/algolia.mdx rename to apps/docs/content/docs/en/integrations/algolia.mdx index 681b5be577c..29c6725e6e7 100644 --- a/apps/docs/content/docs/en/tools/algolia.mdx +++ b/apps/docs/content/docs/en/integrations/algolia.mdx @@ -32,7 +32,7 @@ Integrate Algolia into your workflow. Search indices, manage records (add, updat -## Tools +## Actions ### `algolia_search` diff --git a/apps/docs/content/docs/en/tools/amplitude.mdx b/apps/docs/content/docs/en/integrations/amplitude.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/amplitude.mdx rename to apps/docs/content/docs/en/integrations/amplitude.mdx index 177b5c5455e..45a806b31f6 100644 --- a/apps/docs/content/docs/en/tools/amplitude.mdx +++ b/apps/docs/content/docs/en/integrations/amplitude.mdx @@ -35,7 +35,7 @@ Integrate Amplitude into your workflow to track events, identify users and group -## Tools +## Actions ### `amplitude_send_event` diff --git a/apps/docs/content/docs/en/tools/apify.mdx b/apps/docs/content/docs/en/integrations/apify.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/apify.mdx rename to apps/docs/content/docs/en/integrations/apify.mdx index 7b25679ca68..7ea3bd2c87c 100644 --- a/apps/docs/content/docs/en/tools/apify.mdx +++ b/apps/docs/content/docs/en/integrations/apify.mdx @@ -34,7 +34,7 @@ Integrate Apify into your workflow. Run any Apify actor or saved task with custo -## Tools +## Actions ### `apify_run_actor_sync` diff --git a/apps/docs/content/docs/en/tools/apollo.mdx b/apps/docs/content/docs/en/integrations/apollo.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/apollo.mdx rename to apps/docs/content/docs/en/integrations/apollo.mdx index a40efa695e1..62bd659d258 100644 --- a/apps/docs/content/docs/en/tools/apollo.mdx +++ b/apps/docs/content/docs/en/integrations/apollo.mdx @@ -37,7 +37,7 @@ Integrates Apollo.io into the workflow. Search for people and companies, enrich -## Tools +## Actions ### `apollo_people_search` diff --git a/apps/docs/content/docs/en/tools/appconfig.mdx b/apps/docs/content/docs/en/integrations/appconfig.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/appconfig.mdx rename to apps/docs/content/docs/en/integrations/appconfig.mdx index 4d0fe57fffe..516482e61ca 100644 --- a/apps/docs/content/docs/en/tools/appconfig.mdx +++ b/apps/docs/content/docs/en/integrations/appconfig.mdx @@ -34,7 +34,7 @@ Integrate AWS AppConfig into workflows. Manage applications, environments, and c -## Tools +## Actions ### `appconfig_get_configuration` diff --git a/apps/docs/content/docs/en/tools/arxiv.mdx b/apps/docs/content/docs/en/integrations/arxiv.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/arxiv.mdx rename to apps/docs/content/docs/en/integrations/arxiv.mdx index eb5e3ef8162..b72d8ad9de2 100644 --- a/apps/docs/content/docs/en/tools/arxiv.mdx +++ b/apps/docs/content/docs/en/integrations/arxiv.mdx @@ -31,7 +31,7 @@ Integrates ArXiv into the workflow. Can search for papers, get paper details, an -## Tools +## Actions ### `arxiv_search` diff --git a/apps/docs/content/docs/en/tools/asana.mdx b/apps/docs/content/docs/en/integrations/asana.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/asana.mdx rename to apps/docs/content/docs/en/integrations/asana.mdx index 4ab78d9478a..bd9a332e6d0 100644 --- a/apps/docs/content/docs/en/tools/asana.mdx +++ b/apps/docs/content/docs/en/integrations/asana.mdx @@ -31,7 +31,7 @@ Integrate Asana into the workflow. Can read, write, and update tasks. -## Tools +## Actions ### `asana_get_task` diff --git a/apps/docs/content/docs/en/tools/ashby.mdx b/apps/docs/content/docs/en/integrations/ashby.mdx similarity index 92% rename from apps/docs/content/docs/en/tools/ashby.mdx rename to apps/docs/content/docs/en/integrations/ashby.mdx index d4b71708529..b6b27f6f70f 100644 --- a/apps/docs/content/docs/en/tools/ashby.mdx +++ b/apps/docs/content/docs/en/integrations/ashby.mdx @@ -34,7 +34,7 @@ Integrate Ashby into the workflow. Manage candidates (list, get, create, update, -## Tools +## Actions ### `ashby_add_candidate_tag` @@ -1078,3 +1078,185 @@ Updates an existing candidate record in Ashby. Only provided fields are changed. | `syncToken` | string | Sync token for incremental updates | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Ashby Application Submitted + +Trigger workflow when a new application is submitted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `application` | object | application output from the tool | +| ↳ `id` | string | Application UUID | +| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | +| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | +| ↳ `status` | string | Application status \(Active, Hired, Archived, Lead\) | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | string | Candidate UUID | +| ↳ `name` | string | Candidate name | +| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | +| ↳ `id` | string | Current interview stage UUID | +| ↳ `title` | string | Current interview stage title | +| ↳ `job` | object | job output from the tool | +| ↳ `id` | string | Job UUID | +| ↳ `title` | string | Job title | + + +--- + +### Ashby Candidate Deleted + +Trigger workflow when a candidate is deleted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `candidate` | object | candidate output from the tool | +| ↳ `id` | string | Deleted candidate UUID | + + +--- + +### Ashby Candidate Hired + +Trigger workflow when a candidate is hired + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `application` | object | application output from the tool | +| ↳ `id` | string | Application UUID | +| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | +| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | +| ↳ `status` | string | Application status \(Hired\) | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | string | Candidate UUID | +| ↳ `name` | string | Candidate name | +| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | +| ↳ `id` | string | Current interview stage UUID | +| ↳ `title` | string | Current interview stage title | +| ↳ `job` | object | job output from the tool | +| ↳ `id` | string | Job UUID | +| ↳ `title` | string | Job title | +| `offer` | object | offer output from the tool | +| ↳ `id` | string | Accepted offer UUID | +| ↳ `applicationId` | string | Associated application UUID | +| ↳ `acceptanceStatus` | string | Offer acceptance status | +| ↳ `offerStatus` | string | Offer process status | +| ↳ `decidedAt` | string | Offer decision timestamp \(ISO 8601\) | +| ↳ `latestVersion` | object | latestVersion output from the tool | +| ↳ `id` | string | Latest offer version UUID | + + +--- + +### Ashby Candidate Stage Change + +Trigger workflow when a candidate changes interview stages + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `application` | object | application output from the tool | +| ↳ `id` | string | Application UUID | +| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | +| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | +| ↳ `status` | string | Application status \(Active, Hired, Archived, Lead\) | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | string | Candidate UUID | +| ↳ `name` | string | Candidate name | +| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | +| ↳ `id` | string | Current interview stage UUID | +| ↳ `title` | string | Current interview stage title | +| ↳ `job` | object | job output from the tool | +| ↳ `id` | string | Job UUID | +| ↳ `title` | string | Job title | + + +--- + +### Ashby Job Created + +Trigger workflow when a new job is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `job` | object | job output from the tool | +| ↳ `id` | string | Job UUID | +| ↳ `title` | string | Job title | +| ↳ `confidential` | boolean | Whether the job is confidential | +| ↳ `status` | string | Job status \(Open, Closed, Draft, Archived\) | +| ↳ `employmentType` | string | Employment type \(Full-time, Part-time, etc.\) | + + +--- + +### Ashby Offer Created + +Trigger workflow when a new offer is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | +| `offer` | object | offer output from the tool | +| ↳ `id` | string | Offer UUID | +| ↳ `applicationId` | string | Associated application UUID | +| ↳ `acceptanceStatus` | string | Offer acceptance status \(Accepted, Declined, Pending, Created, Cancelled, WaitingOnResponse\) | +| ↳ `offerStatus` | string | Offer process status \(WaitingOnApprovalStart, WaitingOnOfferApproval, WaitingOnCandidateResponse, CandidateAccepted, CandidateRejected, OfferCancelled\) | +| ↳ `decidedAt` | string | Offer decision timestamp \(ISO 8601\). Typically null at creation; populated after candidate responds. | +| ↳ `latestVersion` | object | latestVersion output from the tool | +| ↳ `id` | string | Latest offer version UUID | + diff --git a/apps/docs/content/docs/en/tools/athena.mdx b/apps/docs/content/docs/en/integrations/athena.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/athena.mdx rename to apps/docs/content/docs/en/integrations/athena.mdx index 698188291f6..478acf8369c 100644 --- a/apps/docs/content/docs/en/tools/athena.mdx +++ b/apps/docs/content/docs/en/integrations/athena.mdx @@ -42,7 +42,7 @@ Integrate AWS Athena into workflows. Execute SQL queries against data in S3, che -## Tools +## Actions ### `athena_start_query` diff --git a/apps/docs/content/docs/en/tools/attio.mdx b/apps/docs/content/docs/en/integrations/attio.mdx similarity index 74% rename from apps/docs/content/docs/en/tools/attio.mdx rename to apps/docs/content/docs/en/integrations/attio.mdx index 5a36922ee42..c34ad91c3d6 100644 --- a/apps/docs/content/docs/en/tools/attio.mdx +++ b/apps/docs/content/docs/en/integrations/attio.mdx @@ -31,7 +31,7 @@ Connect to Attio to manage CRM records (people, companies, custom objects), note -## Tools +## Actions ### `attio_list_records` @@ -1073,3 +1073,505 @@ Delete a webhook from Attio | `deleted` | boolean | Whether the webhook was deleted | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Attio Comment Created + +Trigger workflow when a new comment is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `threadId` | string | The thread ID | +| `commentId` | string | The comment ID | +| `objectId` | string | The object type ID | +| `recordId` | string | The record ID | +| `listId` | string | The list ID \(if comment is on a list entry\) | +| `entryId` | string | The list entry ID \(if comment is on a list entry\) | + + +--- + +### Attio Comment Deleted + +Trigger workflow when a comment is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `threadId` | string | The thread ID | +| `commentId` | string | The comment ID | +| `objectId` | string | The object type ID | +| `recordId` | string | The record ID | +| `listId` | string | The list ID \(if comment is on a list entry\) | +| `entryId` | string | The list entry ID \(if comment is on a list entry\) | + + +--- + +### Attio Comment Resolved + +Trigger workflow when a comment thread is resolved in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `threadId` | string | The thread ID | +| `commentId` | string | The comment ID | +| `objectId` | string | The object type ID | +| `recordId` | string | The record ID | +| `listId` | string | The list ID \(if comment is on a list entry\) | +| `entryId` | string | The list entry ID \(if comment is on a list entry\) | + + +--- + +### Attio Comment Unresolved + +Trigger workflow when a comment thread is unresolved in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `threadId` | string | The thread ID | +| `commentId` | string | The comment ID | +| `objectId` | string | The object type ID | +| `recordId` | string | The record ID | +| `listId` | string | The list ID \(if comment is on a list entry\) | +| `entryId` | string | The list entry ID \(if comment is on a list entry\) | + + +--- + +### Attio List Created + +Trigger workflow when a list is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | + + +--- + +### Attio List Deleted + +Trigger workflow when a list is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | + + +--- + +### Attio List Entry Created + +Trigger workflow when a new list entry is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | +| `entryId` | string | The list entry ID | + + +--- + +### Attio List Entry Deleted + +Trigger workflow when a list entry is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | +| `entryId` | string | The list entry ID | + + +--- + +### Attio List Entry Updated + +Trigger workflow when a list entry is updated in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | +| `entryId` | string | The list entry ID | +| `attributeId` | string | The ID of the attribute that was updated on the list entry | + + +--- + +### Attio List Updated + +Trigger workflow when a list is updated in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `listId` | string | The list ID | + + +--- + +### Attio Note Created + +Trigger workflow when a new note is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `noteId` | string | The note ID | +| `parentObjectId` | string | The parent object type ID | +| `parentRecordId` | string | The parent record ID | + + +--- + +### Attio Note Deleted + +Trigger workflow when a note is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `noteId` | string | The note ID | +| `parentObjectId` | string | The parent object type ID | +| `parentRecordId` | string | The parent record ID | + + +--- + +### Attio Note Updated + +Trigger workflow when a note is updated in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `noteId` | string | The note ID | +| `parentObjectId` | string | The parent object type ID | +| `parentRecordId` | string | The parent record ID | + + +--- + +### Attio Record Created + +Trigger workflow when a new record is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `objectId` | string | The object type ID \(e.g. people, companies\) | +| `recordId` | string | The record ID | + + +--- + +### Attio Record Deleted + +Trigger workflow when a record is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `objectId` | string | The object type ID \(e.g. people, companies\) | +| `recordId` | string | The record ID | + + +--- + +### Attio Record Merged + +Trigger workflow when two records are merged in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `objectId` | string | The object type ID of the surviving record | +| `recordId` | string | The surviving record ID after merge | +| `duplicateObjectId` | string | The object type ID of the merged-away record | +| `duplicateRecordId` | string | The record ID that was merged away | + + +--- + +### Attio Record Updated + +Trigger workflow when a record is updated in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `objectId` | string | The object type ID \(e.g. people, companies\) | +| `recordId` | string | The record ID | +| `attributeId` | string | The ID of the attribute that was updated on the record | + + +--- + +### Attio Task Created + +Trigger workflow when a new task is created in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `taskId` | string | The task ID | + + +--- + +### Attio Task Deleted + +Trigger workflow when a task is deleted in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `taskId` | string | The task ID | + + +--- + +### Attio Task Updated + +Trigger workflow when a task is updated in Attio + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `taskId` | string | The task ID | + + +--- + +### Attio Webhook (All Events) + +Trigger workflow on any Attio webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `id` | json | The event ID object containing resource identifiers | +| `parentObjectId` | string | The parent object type ID \(if applicable\) | +| `parentRecordId` | string | The parent record ID \(if applicable\) | + + +--- + +### Attio Workspace Member Created + +Trigger workflow when a new member is added to the Attio workspace + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Attio Account | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g. record.created, note.created\) | +| `workspaceId` | string | The workspace ID | +| `workspaceMemberId` | string | The workspace member ID | + diff --git a/apps/docs/content/docs/en/tools/azure_devops.mdx b/apps/docs/content/docs/en/integrations/azure_devops.mdx similarity index 90% rename from apps/docs/content/docs/en/tools/azure_devops.mdx rename to apps/docs/content/docs/en/integrations/azure_devops.mdx index 14ee59415fb..e4d429d25c7 100644 --- a/apps/docs/content/docs/en/tools/azure_devops.mdx +++ b/apps/docs/content/docs/en/integrations/azure_devops.mdx @@ -33,7 +33,7 @@ Integrate Azure DevOps into your workflow. List and inspect pipelines and builds -## Tools +## Actions ### `azure_devops_list_pipelines` @@ -554,3 +554,75 @@ List comments for an Azure DevOps work item. | ↳ `url` | string | API URL for the comment | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Azure DevOps Build Failed + +Trigger workflow when an Azure DevOps build fails, is canceled, or partially succeeds + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `buildId` | number | Build ID | +| `buildNumber` | string | Build number string \(e.g. 20240101.1\) | +| `result` | string | Build result: failed \| canceled \| partiallySucceeded | +| `pipelineId` | number | Pipeline definition ID | +| `pipelineName` | string | Pipeline definition name | +| `projectName` | string | Azure DevOps project name | +| `branch` | string | Source branch name \(refs/heads/ prefix stripped\) | +| `commitSha` | string | Source commit SHA | +| `triggeredBy` | string | Display name of the person who triggered the build | +| `triggeredByEmail` | string | Email/unique name of the person who triggered the build, or null if not set | +| `startTime` | string | Build start time \(ISO 8601\) | +| `finishTime` | string | Build finish time \(ISO 8601\) | +| `buildUrl` | string | API URL for the build resource | + + +--- + +### Azure DevOps Webhook (All Service Hook Events) + +Trigger on whichever service hook event types you configure in Azure DevOps. Sim does not filter deliveries for this trigger. + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | Service hook event type \(e.g. build.complete, workitem.created\) | +| `notificationId` | number | Notification ID | +| `subscriptionId` | string | Service hook subscription ID | +| `publisherId` | string | Publisher ID \(e.g. tfs\) | +| `createdDate` | string | Event creation time \(ISO 8601\) | +| `resource` | json | Event resource payload | +| `resourceContainers` | json | Resource container references \(project, collection, etc.\) | +| `message` | json | Short message object | +| `detailedMessage` | json | Detailed message object | + + +--- + +### Azure DevOps Work Item Created + +Trigger workflow when a work item is created in Azure DevOps + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `workItemId` | number | Work item ID | +| `workItemType` | string | Work item type for Basic process \(e.g. Issue, Task, Epic\) | +| `title` | string | Work item title | +| `state` | string | Work item state for Basic process \(e.g. To Do, Doing, Done\) | +| `createdBy` | string | Display name of the creator, or null if not set | +| `assignedTo` | string | Assignee display name, or null if unassigned | +| `priority` | number | Priority \(1–4\), or 0 if not set | +| `areaPath` | string | Area path | +| `iterationPath` | string | Iteration path | +| `description` | string | Work item description \(HTML\), or null if not set | +| `projectName` | string | Azure DevOps project name | +| `workItemUrl` | string | API URL for the work item resource | + diff --git a/apps/docs/content/docs/en/tools/box.mdx b/apps/docs/content/docs/en/integrations/box.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/box.mdx rename to apps/docs/content/docs/en/integrations/box.mdx index 905de5cee1a..a86d146ad94 100644 --- a/apps/docs/content/docs/en/tools/box.mdx +++ b/apps/docs/content/docs/en/integrations/box.mdx @@ -40,7 +40,7 @@ Integrate Box into your workflow to manage files, folders, and e-signatures. Upl -## Tools +## Actions ### `box_upload_file` diff --git a/apps/docs/content/docs/en/tools/brandfetch.mdx b/apps/docs/content/docs/en/integrations/brandfetch.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/brandfetch.mdx rename to apps/docs/content/docs/en/integrations/brandfetch.mdx index 148a6726d0a..bd4d7ee6501 100644 --- a/apps/docs/content/docs/en/tools/brandfetch.mdx +++ b/apps/docs/content/docs/en/integrations/brandfetch.mdx @@ -16,7 +16,7 @@ Integrate Brandfetch into your workflow. Retrieve brand logos, colors, fonts, an -## Tools +## Actions ### `brandfetch_get_brand` diff --git a/apps/docs/content/docs/en/tools/brightdata.mdx b/apps/docs/content/docs/en/integrations/brightdata.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/brightdata.mdx rename to apps/docs/content/docs/en/integrations/brightdata.mdx index f3d1772779b..98c4ff0f627 100644 --- a/apps/docs/content/docs/en/tools/brightdata.mdx +++ b/apps/docs/content/docs/en/integrations/brightdata.mdx @@ -16,7 +16,7 @@ Integrate Bright Data into the workflow. Scrape any URL with Web Unlocker, searc -## Tools +## Actions ### `brightdata_scrape_url` diff --git a/apps/docs/content/docs/en/tools/browser_use.mdx b/apps/docs/content/docs/en/integrations/browser_use.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/browser_use.mdx rename to apps/docs/content/docs/en/integrations/browser_use.mdx index 26c1bc1e503..89d7091570e 100644 --- a/apps/docs/content/docs/en/tools/browser_use.mdx +++ b/apps/docs/content/docs/en/integrations/browser_use.mdx @@ -31,7 +31,7 @@ Integrate Browser Use into the workflow. Can navigate the web and perform action -## Tools +## Actions ### `browser_use_run_task` diff --git a/apps/docs/content/docs/en/tools/calcom.mdx b/apps/docs/content/docs/en/integrations/calcom.mdx similarity index 77% rename from apps/docs/content/docs/en/tools/calcom.mdx rename to apps/docs/content/docs/en/integrations/calcom.mdx index f146474271f..0e844252c35 100644 --- a/apps/docs/content/docs/en/tools/calcom.mdx +++ b/apps/docs/content/docs/en/integrations/calcom.mdx @@ -32,7 +32,7 @@ Integrate Cal.com into your workflow. Create and manage bookings, event types, s -## Tools +## Actions ### `calcom_create_booking` @@ -776,3 +776,285 @@ Get available booking slots for a Cal.com event type within a time range | `data` | json | Available time slots grouped by date \(YYYY-MM-DD keys\). Each date maps to an array of slot objects with start time, optional end time, and seated event info. | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### CalCom Booking Cancelled + +Trigger workflow when a booking is cancelled in Cal.com + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Booking start time \(ISO 8601\) | +| ↳ `endTime` | string | Booking end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status | +| ↳ `location` | string | Meeting location or URL | +| ↳ `cancellationReason` | string | Reason for cancellation | +| ↳ `responses` | json | Booking form responses | +| ↳ `metadata` | json | Custom metadata attached to the booking | + + +--- + +### CalCom Booking Created + +Trigger workflow when a new booking is created in Cal.com + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Booking start time \(ISO 8601\) | +| ↳ `endTime` | string | Booking end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status | +| ↳ `location` | string | Meeting location or URL | +| ↳ `responses` | json | Booking form responses \(dynamic - fields depend on your event type configuration\) | +| ↳ `metadata` | json | Custom metadata attached to the booking \(dynamic - user-defined key-value pairs\) | +| ↳ `videoCallData` | json | Video call details \(structure varies by provider\) | + + +--- + +### CalCom Booking Paid + +Trigger workflow when payment is completed for a paid booking + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(BOOKING_PAID\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Booking start time \(ISO 8601\) | +| ↳ `endTime` | string | Booking end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status | +| ↳ `location` | string | Meeting location or URL | +| ↳ `payment` | object | Payment details | +| ↳ `id` | string | Payment ID | +| ↳ `amount` | number | Payment amount | +| ↳ `currency` | string | Payment currency | +| ↳ `success` | boolean | Whether payment succeeded | +| ↳ `metadata` | json | Custom metadata attached to the booking | + + +--- + +### CalCom Booking Rejected + +Trigger workflow when a booking request is rejected by the host + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(BOOKING_REJECTED\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Requested start time \(ISO 8601\) | +| ↳ `endTime` | string | Requested end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status \(rejected\) | +| ↳ `rejectionReason` | string | Reason for rejection provided by host | +| ↳ `metadata` | json | Custom metadata attached to the booking | + + +--- + +### CalCom Booking Requested + +Trigger workflow when a booking request is submitted (pending confirmation) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(BOOKING_REQUESTED\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Requested start time \(ISO 8601\) | +| ↳ `endTime` | string | Requested end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status \(pending\) | +| ↳ `location` | string | Meeting location or URL | +| ↳ `responses` | json | Booking form responses | +| ↳ `metadata` | json | Custom metadata attached to the booking | + + +--- + +### CalCom Booking Rescheduled + +Trigger workflow when a booking is rescheduled in Cal.com + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Booking title | +| ↳ `description` | string | Booking description | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | New booking start time \(ISO 8601\) | +| ↳ `endTime` | string | New booking end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `status` | string | Booking status | +| ↳ `location` | string | Meeting location or URL | +| ↳ `rescheduleId` | number | Previous booking ID | +| ↳ `rescheduleUid` | string | Previous booking UID | +| ↳ `rescheduleStartTime` | string | Original start time \(ISO 8601\) | +| ↳ `rescheduleEndTime` | string | Original end time \(ISO 8601\) | +| ↳ `responses` | json | Booking form responses | +| ↳ `metadata` | json | Custom metadata attached to the booking | + + +--- + +### CalCom Meeting Ended + +Trigger workflow when a Cal.com meeting ends + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(MEETING_ENDED\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Meeting title | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Meeting start time \(ISO 8601\) | +| ↳ `endTime` | string | Meeting end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `duration` | number | Actual meeting duration in minutes | +| ↳ `videoCallData` | json | Video call details | + + +--- + +### CalCom Recording Ready + +Trigger workflow when a meeting recording is ready for download + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(RECORDING_READY\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | object | payload output from the tool | +| ↳ `title` | string | Meeting title | +| ↳ `eventTypeId` | number | Event type ID | +| ↳ `startTime` | string | Meeting start time \(ISO 8601\) | +| ↳ `endTime` | string | Meeting end time \(ISO 8601\) | +| ↳ `uid` | string | Unique booking identifier | +| ↳ `bookingId` | number | Numeric booking ID | +| ↳ `recordingUrl` | string | URL to download the recording | +| ↳ `transcription` | string | Meeting transcription text \(if available\) | + + +--- + +### CalCom Webhook (All Events) + +Trigger workflow on any Cal.com webhook event (configure event types in Cal.com) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `triggerEvent` | string | The webhook event type \(e.g., BOOKING_CREATED, MEETING_ENDED\) | +| `createdAt` | string | When the webhook event was created \(ISO 8601\) | +| `payload` | json | Complete webhook payload \(structure varies by event type\) | + diff --git a/apps/docs/content/docs/en/tools/calendly.mdx b/apps/docs/content/docs/en/integrations/calendly.mdx similarity index 67% rename from apps/docs/content/docs/en/tools/calendly.mdx rename to apps/docs/content/docs/en/integrations/calendly.mdx index 57279226c2f..131f1eb0706 100644 --- a/apps/docs/content/docs/en/tools/calendly.mdx +++ b/apps/docs/content/docs/en/integrations/calendly.mdx @@ -30,7 +30,7 @@ Integrate Calendly into your workflow. Manage event types, scheduled events, inv -## Tools +## Actions ### `calendly_get_current_user` @@ -292,3 +292,173 @@ Cancel a scheduled event | ↳ `created_at` | string | ISO timestamp when event was canceled | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Calendly Invitee Canceled + +Trigger workflow when someone cancels a scheduled event on Calendly + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Personal Access Token | +| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | Event type \(invitee.created or invitee.canceled\) | +| `created_at` | string | Webhook event creation timestamp | +| `created_by` | string | URI of the Calendly user who created this webhook | +| `payload` | object | payload output from the tool | +| ↳ `uri` | string | Invitee URI | +| ↳ `email` | string | Invitee email address | +| ↳ `name` | string | Invitee full name | +| ↳ `first_name` | string | Invitee first name | +| ↳ `last_name` | string | Invitee last name | +| ↳ `status` | string | Invitee status \(active or canceled\) | +| ↳ `timezone` | string | Invitee timezone | +| ↳ `event` | string | Scheduled event URI | +| ↳ `text_reminder_number` | string | Phone number for text reminders | +| ↳ `rescheduled` | boolean | Whether this invitee rescheduled | +| ↳ `old_invitee` | string | URI of the old invitee \(if rescheduled\) | +| ↳ `new_invitee` | string | URI of the new invitee \(if rescheduled\) | +| ↳ `cancel_url` | string | URL to cancel the event | +| ↳ `reschedule_url` | string | URL to reschedule the event | +| ↳ `created_at` | string | Invitee creation timestamp | +| ↳ `updated_at` | string | Invitee last update timestamp | +| ↳ `canceled` | boolean | Whether the event was canceled | +| ↳ `cancellation` | object | Cancellation details | +| ↳ `canceled_by` | string | Who canceled the event | +| ↳ `reason` | string | Cancellation reason | +| ↳ `payment` | object | Payment details | +| ↳ `id` | string | Payment ID | +| ↳ `provider` | string | Payment provider | +| ↳ `amount` | number | Payment amount | +| ↳ `currency` | string | Payment currency | +| ↳ `terms` | string | Payment terms | +| ↳ `successful` | boolean | Whether payment was successful | +| ↳ `no_show` | object | No-show details | +| ↳ `created_at` | string | No-show marked timestamp | +| ↳ `reconfirmation` | object | Reconfirmation details | +| ↳ `created_at` | string | Reconfirmation timestamp | +| ↳ `confirmed_at` | string | Confirmation timestamp | + + +--- + +### Calendly Invitee Created + +Trigger workflow when someone schedules a new event on Calendly + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Personal Access Token | +| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | Event type \(invitee.created or invitee.canceled\) | +| `created_at` | string | Webhook event creation timestamp | +| `created_by` | string | URI of the Calendly user who created this webhook | +| `payload` | object | payload output from the tool | +| ↳ `uri` | string | Invitee URI | +| ↳ `email` | string | Invitee email address | +| ↳ `name` | string | Invitee full name | +| ↳ `first_name` | string | Invitee first name | +| ↳ `last_name` | string | Invitee last name | +| ↳ `status` | string | Invitee status \(active or canceled\) | +| ↳ `timezone` | string | Invitee timezone | +| ↳ `event` | string | Scheduled event URI | +| ↳ `text_reminder_number` | string | Phone number for text reminders | +| ↳ `rescheduled` | boolean | Whether this invitee rescheduled | +| ↳ `old_invitee` | string | URI of the old invitee \(if rescheduled\) | +| ↳ `new_invitee` | string | URI of the new invitee \(if rescheduled\) | +| ↳ `cancel_url` | string | URL to cancel the event | +| ↳ `reschedule_url` | string | URL to reschedule the event | +| ↳ `created_at` | string | Invitee creation timestamp | +| ↳ `updated_at` | string | Invitee last update timestamp | +| ↳ `canceled` | boolean | Whether the event was canceled | +| ↳ `cancellation` | object | Cancellation details | +| ↳ `canceled_by` | string | Who canceled the event | +| ↳ `reason` | string | Cancellation reason | +| ↳ `payment` | object | Payment details | +| ↳ `id` | string | Payment ID | +| ↳ `provider` | string | Payment provider | +| ↳ `amount` | number | Payment amount | +| ↳ `currency` | string | Payment currency | +| ↳ `terms` | string | Payment terms | +| ↳ `successful` | boolean | Whether payment was successful | +| ↳ `no_show` | object | No-show details | +| ↳ `created_at` | string | No-show marked timestamp | +| ↳ `reconfirmation` | object | Reconfirmation details | +| ↳ `created_at` | string | Reconfirmation timestamp | +| ↳ `confirmed_at` | string | Confirmation timestamp | + + +--- + +### Calendly Routing Form Submitted + +Trigger workflow when someone submits a Calendly routing form + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Personal Access Token | +| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | Event type \(routing_form_submission.created\) | +| `created_at` | string | Webhook event creation timestamp | +| `created_by` | string | URI of the Calendly user who created this webhook | +| `payload` | object | payload output from the tool | +| ↳ `uri` | string | Routing form submission URI | +| ↳ `routing_form` | string | Routing form URI | +| ↳ `submitter` | object | Submitter details | +| ↳ `uri` | string | Submitter URI | +| ↳ `email` | string | Submitter email address | +| ↳ `name` | string | Submitter full name | +| ↳ `submitter_type` | string | Type of submitter | +| ↳ `result` | object | Routing result details | +| ↳ `type` | string | Result type \(event_type, custom_message, or external_url\) | +| ↳ `value` | string | Result value \(event type URI, message, or URL\) | +| ↳ `created_at` | string | Submission creation timestamp | +| ↳ `updated_at` | string | Submission last update timestamp | + + +--- + +### Calendly Webhook + +Trigger workflow from any Calendly webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Personal Access Token | +| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | Event type \(invitee.created, invitee.canceled, or routing_form_submission.created\) | +| `created_at` | string | Webhook event creation timestamp | +| `created_by` | string | URI of the Calendly user who created this webhook | +| `payload` | object | Complete event payload \(structure varies by event type\) | + diff --git a/apps/docs/content/docs/en/triggers/circleback.mdx b/apps/docs/content/docs/en/integrations/circleback.mdx similarity index 65% rename from apps/docs/content/docs/en/triggers/circleback.mdx rename to apps/docs/content/docs/en/integrations/circleback.mdx index 28e389317ea..a79f410aa03 100644 --- a/apps/docs/content/docs/en/triggers/circleback.mdx +++ b/apps/docs/content/docs/en/integrations/circleback.mdx @@ -1,6 +1,6 @@ --- title: Circleback -description: Available Circleback triggers for automating workflows +description: Circleback triggers for automating workflows --- import { BlockInfoCard } from "@/components/ui/block-info-card" @@ -10,10 +10,50 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="linear-gradient(180deg, #E0F7FA 0%, #FFFFFF 100%)" /> -Circleback provides 3 triggers for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +[Circleback](https://circleback.ai/) is an AI-powered platform that automates meeting notes, action items, transcripts, and recordings for your team. When a meeting is completed, Circleback processes the conversation and provides detailed notes and action items, along with a transcript and a recording (when available). This helps teams efficiently capture insights, distribute action items, and ensure nothing is missed—all seamlessly integrated into your workflows. + +With the Sim Circleback integration, you can: + +- **Receive detailed meeting notes and action items**: Automatically collect well-formatted meeting summaries and track actionable tasks discussed during your calls. +- **Access complete meeting recordings and transcripts**: Get the full conversation and the associated recording, making it easy to review key moments or share with colleagues. +- **Capture attendee information and meeting context**: Attendee lists, meeting metadata, and tags help keep your data organized and actionable. +- **Deliver insights directly into your workflows**: Trigger automations or send Circleback data to other systems the moment a meeting is done, using Sim’s powerful webhook triggers. + +**How it works in Sim:** +Circleback uses webhook triggers: whenever a meeting is processed, data is pushed automatically to your agent or automation. You can build further automations based on: + +- Meeting completed (all processed data available) +- New notes (notes ready even before full meeting is processed) +- Raw webhook integration for advanced use cases + +**The following information is available in the Circleback meeting webhook payload:** + +| Field | Type | Description | +|----------------|---------|----------------------------------------------------| +| `id` | number | Circleback meeting ID | +| `name` | string | Meeting title | +| `url` | string | Virtual meeting URL (Zoom, Meet, Teams, etc.) | +| `createdAt` | string | Meeting creation timestamp | +| `duration` | number | Duration in seconds | +| `recordingUrl` | string | Recording URL (valid 24 hours) | +| `tags` | json | Array of tags | +| `icalUid` | string | Calendar event ID | +| `attendees` | json | Array of attendee objects | +| `notes` | string | Meeting notes in Markdown | +| `actionItems` | json | Array of action items | +| `transcript` | json | Array of transcript segments | +| `insights` | json | User-created insights | +| `meeting` | json | Full meeting payload | + +Whether you want to distribute instant summaries, log action items, or build custom workflows triggered by new meeting data, Circleback and Sim make it seamless to handle everything related to your meetings—automatically. +{/* MANUAL-CONTENT-END */} + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### Circleback Meeting Completed Trigger workflow when a meeting is processed and ready in Circleback diff --git a/apps/docs/content/docs/en/tools/clay.mdx b/apps/docs/content/docs/en/integrations/clay.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/clay.mdx rename to apps/docs/content/docs/en/integrations/clay.mdx index 7b20f02b1fb..d8388c2a5da 100644 --- a/apps/docs/content/docs/en/tools/clay.mdx +++ b/apps/docs/content/docs/en/integrations/clay.mdx @@ -31,7 +31,7 @@ Integrate Clay into the workflow. Can populate a table with data. -## Tools +## Actions ### `clay_populate` diff --git a/apps/docs/content/docs/en/tools/clerk.mdx b/apps/docs/content/docs/en/integrations/clerk.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/clerk.mdx rename to apps/docs/content/docs/en/integrations/clerk.mdx index abde1d41049..f912d0e1f4e 100644 --- a/apps/docs/content/docs/en/tools/clerk.mdx +++ b/apps/docs/content/docs/en/integrations/clerk.mdx @@ -32,7 +32,7 @@ Integrate Clerk authentication and user management into your workflow. Create, u -## Tools +## Actions ### `clerk_list_users` diff --git a/apps/docs/content/docs/en/tools/clickhouse.mdx b/apps/docs/content/docs/en/integrations/clickhouse.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/clickhouse.mdx rename to apps/docs/content/docs/en/integrations/clickhouse.mdx index f3c9837525b..b22539620ec 100644 --- a/apps/docs/content/docs/en/tools/clickhouse.mdx +++ b/apps/docs/content/docs/en/integrations/clickhouse.mdx @@ -37,7 +37,7 @@ Integrate ClickHouse into the workflow. Query and insert data, manage databases -## Tools +## Actions ### `clickhouse_query` diff --git a/apps/docs/content/docs/en/tools/cloudflare.mdx b/apps/docs/content/docs/en/integrations/cloudflare.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/cloudflare.mdx rename to apps/docs/content/docs/en/integrations/cloudflare.mdx index 67c629e0712..1876af3dda0 100644 --- a/apps/docs/content/docs/en/tools/cloudflare.mdx +++ b/apps/docs/content/docs/en/integrations/cloudflare.mdx @@ -32,7 +32,7 @@ Integrate Cloudflare into the workflow. Manage zones (domains), DNS records, SSL -## Tools +## Actions ### `cloudflare_list_zones` diff --git a/apps/docs/content/docs/en/tools/cloudformation.mdx b/apps/docs/content/docs/en/integrations/cloudformation.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/cloudformation.mdx rename to apps/docs/content/docs/en/integrations/cloudformation.mdx index e4db1981167..064c832a59d 100644 --- a/apps/docs/content/docs/en/tools/cloudformation.mdx +++ b/apps/docs/content/docs/en/integrations/cloudformation.mdx @@ -33,7 +33,7 @@ Integrate AWS CloudFormation into workflows. Describe stacks, list resources, de -## Tools +## Actions ### `cloudformation_describe_stacks` diff --git a/apps/docs/content/docs/en/tools/cloudwatch.mdx b/apps/docs/content/docs/en/integrations/cloudwatch.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/cloudwatch.mdx rename to apps/docs/content/docs/en/integrations/cloudwatch.mdx index 3f0380743c8..6c451cd5c85 100644 --- a/apps/docs/content/docs/en/tools/cloudwatch.mdx +++ b/apps/docs/content/docs/en/integrations/cloudwatch.mdx @@ -34,7 +34,7 @@ Integrate AWS CloudWatch into workflows. Run Log Insights queries, list log grou -## Tools +## Actions ### `cloudwatch_query_logs` diff --git a/apps/docs/content/docs/en/tools/confluence.mdx b/apps/docs/content/docs/en/integrations/confluence.mdx similarity index 69% rename from apps/docs/content/docs/en/tools/confluence.mdx rename to apps/docs/content/docs/en/integrations/confluence.mdx index 8f49145ad31..b5c7ab2aef5 100644 --- a/apps/docs/content/docs/en/tools/confluence.mdx +++ b/apps/docs/content/docs/en/integrations/confluence.mdx @@ -31,7 +31,7 @@ Integrate Confluence into the workflow. Can read, create, update, delete pages, -## Tools +## Actions ### `confluence_retrieve` @@ -1433,3 +1433,684 @@ Get display name and profile info for a Confluence user by account ID. | `publicName` | string | Public name of the user | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Confluence Attachment Created + +Trigger workflow when an attachment is uploaded in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | +| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | +| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | +| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `attachment` | object | attachment output from the tool | +| ↳ `mediaType` | string | MIME type of the attachment | +| ↳ `fileSize` | number | File size in bytes | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Container page/blog ID | +| ↳ `title` | string | Container page/blog title | +| ↳ `contentType` | string | Container content type | +| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | + + +--- + +### Confluence Attachment Removed + +Trigger workflow when an attachment is removed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | +| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | +| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | +| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `attachment` | object | attachment output from the tool | +| ↳ `mediaType` | string | MIME type of the attachment | +| ↳ `fileSize` | number | File size in bytes | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Container page/blog ID | +| ↳ `title` | string | Container page/blog title | +| ↳ `contentType` | string | Container content type | +| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | + + +--- + +### Confluence Attachment Updated + +Trigger workflow when an attachment is updated in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | +| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | +| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | +| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `attachment` | object | attachment output from the tool | +| ↳ `mediaType` | string | MIME type of the attachment | +| ↳ `fileSize` | number | File size in bytes | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Container page/blog ID | +| ↳ `title` | string | Container page/blog title | +| ↳ `contentType` | string | Container content type | +| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | + + +--- + +### Confluence Blog Post Created + +Trigger workflow when a blog post is created in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Blog Post Removed + +Trigger workflow when a blog post is removed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Blog Post Restored + +Trigger workflow when a blog post is restored from trash in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Blog Post Updated + +Trigger workflow when a blog post is updated in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Comment Created + +Trigger workflow when a comment is created in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `comment` | object | comment output from the tool | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Parent page/blog ID | +| ↳ `title` | string | Parent page/blog title | +| ↳ `contentType` | string | Parent content type \(page or blogpost\) | +| ↳ `spaceKey` | string | Space key of the parent | +| ↳ `self` | string | URL link to the parent content | + + +--- + +### Confluence Comment Removed + +Trigger workflow when a comment is removed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `comment` | object | comment output from the tool | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Parent page/blog ID | +| ↳ `title` | string | Parent page/blog title | +| ↳ `contentType` | string | Parent content type \(page or blogpost\) | +| ↳ `spaceKey` | string | Space key of the parent | +| ↳ `self` | string | URL link to the parent content | + + +--- + +### Confluence Comment Updated + +Trigger workflow when a comment is updated in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `comment` | object | comment output from the tool | +| ↳ `parent` | object | parent output from the tool | +| ↳ `id` | number | Parent page/blog ID | +| ↳ `title` | string | Parent page/blog title | +| ↳ `contentType` | string | Parent content type \(page or blogpost\) | +| ↳ `spaceKey` | string | Space key of the parent | +| ↳ `self` | string | URL link to the parent content | + + +--- + +### Confluence Label Added + +Trigger workflow when a label is added to content in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `label` | object | label output from the tool | +| ↳ `name` | string | Label name | +| ↳ `id` | string | Label ID | +| ↳ `prefix` | string | Label prefix \(global, my, team\) | +| `content` | object | content output from the tool | +| ↳ `id` | number | Content ID the label was added to or removed from | +| ↳ `title` | string | Content title | +| ↳ `contentType` | string | Content type \(page, blogpost\) | + + +--- + +### Confluence Label Removed + +Trigger workflow when a label is removed from content in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `label` | object | label output from the tool | +| ↳ `name` | string | Label name | +| ↳ `id` | string | Label ID | +| ↳ `prefix` | string | Label prefix \(global, my, team\) | +| `content` | object | content output from the tool | +| ↳ `id` | number | Content ID the label was added to or removed from | +| ↳ `title` | string | Content title | +| ↳ `contentType` | string | Content type \(page, blogpost\) | + + +--- + +### Confluence Page Created + +Trigger workflow when a new page is created in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Page Moved + +Trigger workflow when a page is moved in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Page Permissions Updated + +Trigger workflow when page permissions are changed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `id` | number | Content ID | +| `title` | string | Content title | +| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | +| `version` | number | Version number | +| `spaceKey` | string | Space key the content belongs to | +| `creatorAccountId` | string | Account ID of the creator | +| `lastModifierAccountId` | string | Account ID of the last modifier | +| `self` | string | URL link to the content | +| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | +| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | +| `page` | object | page output from the tool | +| ↳ `permissions` | json | Updated permissions object for the page | + + +--- + +### Confluence Page Removed + +Trigger workflow when a page is removed or trashed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Page Restored + +Trigger workflow when a page is restored from trash in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Page Updated + +Trigger workflow when a page is updated in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | + + +--- + +### Confluence Space Created + +Trigger workflow when a new space is created in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `space` | object | space output from the tool | +| ↳ `key` | string | Space key | +| ↳ `name` | string | Space name | +| ↳ `self` | string | URL link to the space | + + +--- + +### Confluence Space Removed + +Trigger workflow when a space is removed in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `space` | object | space output from the tool | +| ↳ `key` | string | Space key | +| ↳ `name` | string | Space name | +| ↳ `self` | string | URL link to the space | + + +--- + +### Confluence Space Updated + +Trigger workflow when a space is updated in Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `space` | object | space output from the tool | +| ↳ `key` | string | Space key | +| ↳ `name` | string | Space name | +| ↳ `self` | string | URL link to the space | + + +--- + +### Confluence User Created + +Trigger workflow when a new user is added to Confluence + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `user` | object | user output from the tool | +| ↳ `accountId` | string | Account ID of the new user | +| ↳ `accountType` | string | Account type \(e.g., atlassian, app\) | +| ↳ `displayName` | string | Display name of the user | +| ↳ `emailAddress` | string | Email address of the user \(may not be available due to GDPR/privacy settings\) | +| ↳ `publicName` | string | Public name of the user | +| ↳ `self` | string | URL link to the user profile | + + +--- + +### Confluence Webhook (All Events) + +Trigger workflow on any Confluence webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | +| `confluenceDomain` | string | No | Your Confluence Cloud domain | +| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | +| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | +| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | +| `userAccountId` | string | Account ID of the user who triggered the event | +| `accountType` | string | Account type \(e.g., customer\) | +| `page` | json | Page object \(present in page events\) | +| `comment` | json | Comment object \(present in comment events\) | +| `blog` | json | Blog post object \(present in blog events\) | +| `attachment` | json | Attachment object \(present in attachment events\) | +| `space` | json | Space object \(present in space events\) | +| `label` | json | Label object \(present in label events\) | +| `content` | json | Content object \(present in label events\) | +| `user` | json | User object \(present in user events\) | +| `files` | file[] | Attachment file content \(present in attachment events when includeFileContent is enabled\) | + diff --git a/apps/docs/content/docs/en/tools/crowdstrike.mdx b/apps/docs/content/docs/en/integrations/crowdstrike.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/crowdstrike.mdx rename to apps/docs/content/docs/en/integrations/crowdstrike.mdx index fac75e1213e..92abd6aa84d 100644 --- a/apps/docs/content/docs/en/tools/crowdstrike.mdx +++ b/apps/docs/content/docs/en/integrations/crowdstrike.mdx @@ -16,7 +16,7 @@ Integrate CrowdStrike Identity Protection into workflows to search sensors, fetc -## Tools +## Actions ### `crowdstrike_get_sensor_aggregates` diff --git a/apps/docs/content/docs/en/tools/cursor.mdx b/apps/docs/content/docs/en/integrations/cursor.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/cursor.mdx rename to apps/docs/content/docs/en/integrations/cursor.mdx index e182f7ddd5c..42396a71f29 100644 --- a/apps/docs/content/docs/en/tools/cursor.mdx +++ b/apps/docs/content/docs/en/integrations/cursor.mdx @@ -32,7 +32,7 @@ Interact with Cursor Cloud Agents API to launch AI agents that can work on your -## Tools +## Actions ### `cursor_list_agents` diff --git a/apps/docs/content/docs/en/tools/dagster.mdx b/apps/docs/content/docs/en/integrations/dagster.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/dagster.mdx rename to apps/docs/content/docs/en/integrations/dagster.mdx index ea261196868..1671fa83f2c 100644 --- a/apps/docs/content/docs/en/tools/dagster.mdx +++ b/apps/docs/content/docs/en/integrations/dagster.mdx @@ -30,7 +30,7 @@ Connect to a Dagster instance to launch job runs, monitor run status, list avail -## Tools +## Actions ### `dagster_launch_run` diff --git a/apps/docs/content/docs/en/tools/databricks.mdx b/apps/docs/content/docs/en/integrations/databricks.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/databricks.mdx rename to apps/docs/content/docs/en/integrations/databricks.mdx index a1ded4fab96..c88530ff1d7 100644 --- a/apps/docs/content/docs/en/tools/databricks.mdx +++ b/apps/docs/content/docs/en/integrations/databricks.mdx @@ -31,7 +31,7 @@ Connect to Databricks to execute SQL queries against SQL warehouses, trigger and -## Tools +## Actions ### `databricks_execute_sql` diff --git a/apps/docs/content/docs/en/tools/datadog.mdx b/apps/docs/content/docs/en/integrations/datadog.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/datadog.mdx rename to apps/docs/content/docs/en/integrations/datadog.mdx index 9bbc3e39214..ba847b701dd 100644 --- a/apps/docs/content/docs/en/tools/datadog.mdx +++ b/apps/docs/content/docs/en/integrations/datadog.mdx @@ -31,7 +31,7 @@ Integrate Datadog monitoring into workflows. Submit metrics, manage monitors, qu -## Tools +## Actions ### `datadog_submit_metrics` diff --git a/apps/docs/content/docs/en/tools/devin.mdx b/apps/docs/content/docs/en/integrations/devin.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/devin.mdx rename to apps/docs/content/docs/en/integrations/devin.mdx index eb38d6a03c1..e067a748e10 100644 --- a/apps/docs/content/docs/en/tools/devin.mdx +++ b/apps/docs/content/docs/en/integrations/devin.mdx @@ -39,7 +39,7 @@ Integrate Devin into your workflow. Create sessions to assign coding tasks, send -## Tools +## Actions ### `devin_create_session` diff --git a/apps/docs/content/docs/en/tools/discord.mdx b/apps/docs/content/docs/en/integrations/discord.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/discord.mdx rename to apps/docs/content/docs/en/integrations/discord.mdx index ad3195599a8..91011794893 100644 --- a/apps/docs/content/docs/en/tools/discord.mdx +++ b/apps/docs/content/docs/en/integrations/discord.mdx @@ -42,7 +42,7 @@ Comprehensive Discord integration: messages, threads, channels, roles, members, -## Tools +## Actions ### `discord_send_message` diff --git a/apps/docs/content/docs/en/tools/docusign.mdx b/apps/docs/content/docs/en/integrations/docusign.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/docusign.mdx rename to apps/docs/content/docs/en/integrations/docusign.mdx index 253104c3cec..4bd9e15ae55 100644 --- a/apps/docs/content/docs/en/tools/docusign.mdx +++ b/apps/docs/content/docs/en/integrations/docusign.mdx @@ -33,7 +33,7 @@ Create and send envelopes for e-signature, use templates, check signing status, -## Tools +## Actions ### `docusign_send_envelope` diff --git a/apps/docs/content/docs/en/tools/dropbox.mdx b/apps/docs/content/docs/en/integrations/dropbox.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/dropbox.mdx rename to apps/docs/content/docs/en/integrations/dropbox.mdx index aceae4da077..553c76b064a 100644 --- a/apps/docs/content/docs/en/tools/dropbox.mdx +++ b/apps/docs/content/docs/en/integrations/dropbox.mdx @@ -32,7 +32,7 @@ Integrate Dropbox into your workflow for file management, sharing, and collabora -## Tools +## Actions ### `dropbox_upload` diff --git a/apps/docs/content/docs/en/tools/dspy.mdx b/apps/docs/content/docs/en/integrations/dspy.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/dspy.mdx rename to apps/docs/content/docs/en/integrations/dspy.mdx index a73007d739e..9c3c5bfce16 100644 --- a/apps/docs/content/docs/en/tools/dspy.mdx +++ b/apps/docs/content/docs/en/integrations/dspy.mdx @@ -30,7 +30,7 @@ Integrate with your self-hosted DSPy programs for LLM-powered predictions. Suppo -## Tools +## Actions ### `dspy_predict` diff --git a/apps/docs/content/docs/en/tools/dub.mdx b/apps/docs/content/docs/en/integrations/dub.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/dub.mdx rename to apps/docs/content/docs/en/integrations/dub.mdx index fe8cada02ef..116ee1ff64a 100644 --- a/apps/docs/content/docs/en/tools/dub.mdx +++ b/apps/docs/content/docs/en/integrations/dub.mdx @@ -33,7 +33,7 @@ Create, manage, and track short links with Dub. Supports custom domains, UTM par -## Tools +## Actions ### `dub_create_link` diff --git a/apps/docs/content/docs/en/tools/duckduckgo.mdx b/apps/docs/content/docs/en/integrations/duckduckgo.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/duckduckgo.mdx rename to apps/docs/content/docs/en/integrations/duckduckgo.mdx index 5cf62617e26..e0ac7866cb1 100644 --- a/apps/docs/content/docs/en/tools/duckduckgo.mdx +++ b/apps/docs/content/docs/en/integrations/duckduckgo.mdx @@ -31,7 +31,7 @@ Search the web using DuckDuckGo Instant Answers API. Returns instant answers, ab -## Tools +## Actions ### `duckduckgo_search` diff --git a/apps/docs/content/docs/en/tools/dynamodb.mdx b/apps/docs/content/docs/en/integrations/dynamodb.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/dynamodb.mdx rename to apps/docs/content/docs/en/integrations/dynamodb.mdx index 3d37f479dba..ce68ecab9a8 100644 --- a/apps/docs/content/docs/en/tools/dynamodb.mdx +++ b/apps/docs/content/docs/en/integrations/dynamodb.mdx @@ -41,7 +41,7 @@ Integrate Amazon DynamoDB into workflows. Supports Get, Put, Query, Scan, Update -## Tools +## Actions ### `dynamodb_get` diff --git a/apps/docs/content/docs/en/tools/elasticsearch.mdx b/apps/docs/content/docs/en/integrations/elasticsearch.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/elasticsearch.mdx rename to apps/docs/content/docs/en/integrations/elasticsearch.mdx index bf84fc77a21..b98d1a3deea 100644 --- a/apps/docs/content/docs/en/tools/elasticsearch.mdx +++ b/apps/docs/content/docs/en/integrations/elasticsearch.mdx @@ -32,7 +32,7 @@ Integrate Elasticsearch into workflows for powerful search, indexing, and data m -## Tools +## Actions ### `elasticsearch_search` diff --git a/apps/docs/content/docs/en/tools/elevenlabs.mdx b/apps/docs/content/docs/en/integrations/elevenlabs.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/elevenlabs.mdx rename to apps/docs/content/docs/en/integrations/elevenlabs.mdx index c028f8813ca..0099b3a1fd8 100644 --- a/apps/docs/content/docs/en/tools/elevenlabs.mdx +++ b/apps/docs/content/docs/en/integrations/elevenlabs.mdx @@ -31,7 +31,7 @@ Integrate ElevenLabs into the workflow. Can convert text to speech. -## Tools +## Actions ### `elevenlabs_tts` diff --git a/apps/docs/content/docs/en/triggers/emailbison.mdx b/apps/docs/content/docs/en/integrations/emailbison.mdx similarity index 79% rename from apps/docs/content/docs/en/triggers/emailbison.mdx rename to apps/docs/content/docs/en/integrations/emailbison.mdx index 94a8c041659..8a3050d5d50 100644 --- a/apps/docs/content/docs/en/triggers/emailbison.mdx +++ b/apps/docs/content/docs/en/integrations/emailbison.mdx @@ -1,19 +1,443 @@ --- -title: Emailbison -description: Available Emailbison triggers for automating workflows +title: Email Bison +description: Manage Email Bison leads, campaigns, replies, and tags --- import { BlockInfoCard } from "@/components/ui/block-info-card" - -Emailbison provides 17 triggers for automating workflows based on events. +## Usage Instructions + +Integrate Email Bison into workflows. Create and update leads, manage campaigns, attach leads to campaigns, list replies, and organize leads with tags. + + + +## Actions + +### `emailbison_list_leads` + +Retrieves leads from Email Bison with optional search and tag filters. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `search` | string | No | Search term for filtering leads | +| `campaignStatus` | string | No | Lead campaign status filter: in_sequence, sequence_finished, sequence_stopped, never_contacted, or replied | +| `tagIds` | array | No | Tag IDs to include | +| `excludedTagIds` | array | No | Tag IDs to exclude | +| `withoutTags` | boolean | No | Only return leads without tags | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_get_lead` + +Retrieves a lead by Email Bison lead ID or email address. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `leadId` | string | Yes | Lead ID or email address | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_create_lead` + +Creates a single lead in Email Bison. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `firstName` | string | Yes | Lead first name | +| `lastName` | string | Yes | Lead last name | +| `email` | string | Yes | Lead email address | +| `title` | string | No | Lead job title | +| `company` | string | No | Lead company | +| `notes` | string | No | Additional notes about the lead | +| `customVariables` | array | No | Custom variables to store on the lead | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_update_lead` + +Updates an existing Email Bison lead. Fields omitted from a PUT update may be cleared by Email Bison. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `leadId` | string | Yes | Lead ID or email address | +| `firstName` | string | Yes | Lead first name | +| `lastName` | string | Yes | Lead last name | +| `email` | string | Yes | Lead email address | +| `title` | string | No | Lead job title | +| `company` | string | No | Lead company | +| `notes` | string | No | Additional notes about the lead | +| `customVariables` | array | No | Custom variables to store on the lead | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_list_campaigns` + +Retrieves Email Bison campaigns. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_create_campaign` + +Creates a new Email Bison campaign. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `name` | string | Yes | Campaign name | +| `campaignType` | string | No | Campaign type: outbound or reply_followup | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_update_campaign` + +Updates Email Bison campaign settings. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `campaignId` | number | Yes | Campaign ID | +| `name` | string | No | Campaign name | +| `maxEmailsPerDay` | number | No | Maximum emails per day | +| `maxNewLeadsPerDay` | number | No | Maximum new leads per day | +| `plainText` | boolean | No | Send plain text emails | +| `openTracking` | boolean | No | Enable open tracking | +| `reputationBuilding` | boolean | No | Enable reputation building | +| `canUnsubscribe` | boolean | No | Enable unsubscribe link | +| `includeAutoRepliesInStats` | boolean | No | Include auto replies in campaign stats | +| `sequencePrioritization` | string | No | Sequence prioritization: followups or new_leads | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_update_campaign_status` + +Pauses, resumes, or archives an Email Bison campaign. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `campaignId` | number | Yes | Campaign ID | +| `action` | string | Yes | Status action: pause, resume, or archive | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_attach_leads_to_campaign` + +Adds existing Email Bison leads to a campaign. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `campaignId` | number | Yes | Campaign ID | +| `leadIds` | array | Yes | Lead IDs to add to the campaign | +| `allowParallelSending` | boolean | No | Force add leads already in sequence in other campaigns | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_list_replies` + +Retrieves Email Bison replies with optional status, folder, campaign, sender, lead, and tag filters. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `search` | string | No | Search term for replies | +| `status` | string | No | Reply status: interested, automated_reply, or not_automated_reply | +| `folder` | string | No | Reply folder: inbox, sent, spam, bounced, or all | +| `read` | boolean | No | Filter by read state | +| `campaignId` | number | No | Campaign ID | +| `senderEmailId` | number | No | Sender email ID | +| `leadId` | number | No | Lead ID | +| `tagIds` | array | No | Tag IDs to filter replies by | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_list_tags` + +Retrieves all Email Bison tags for the authenticated workspace. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_create_tag` + +Creates a new Email Bison tag. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `name` | string | Yes | Tag name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + +### `emailbison_attach_tags_to_leads` + +Attaches Email Bison tags to one or more leads. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `tagIds` | array | Yes | Tag IDs to attach | +| `leadIds` | array | Yes | Lead IDs to tag | +| `skipWebhooks` | boolean | No | Skip Email Bison webhooks for this action | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `leads` | array | List of leads | +| `campaigns` | array | List of campaigns | +| `replies` | array | List of replies | +| `tags` | array | List of tags | +| `count` | number | Number of returned records | +| `id` | number | Record ID | +| `uuid` | string | Record UUID | +| `name` | string | Campaign or tag name | +| `first_name` | string | Lead first name | +| `last_name` | string | Lead last name | +| `email` | string | Lead email address | +| `status` | string | Record status | +| `success` | boolean | Whether the action succeeded | +| `message` | string | Action message | + + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### Email Bison Contact First Emailed Trigger when a contact receives their first campaign email in Email Bison diff --git a/apps/docs/content/docs/en/tools/enrich.mdx b/apps/docs/content/docs/en/integrations/enrich.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/enrich.mdx rename to apps/docs/content/docs/en/integrations/enrich.mdx index 5e03c3e6fb8..a8d3ca3a190 100644 --- a/apps/docs/content/docs/en/tools/enrich.mdx +++ b/apps/docs/content/docs/en/integrations/enrich.mdx @@ -32,7 +32,7 @@ Access real-time B2B data intelligence with Enrich.so. Enrich profiles from emai -## Tools +## Actions ### `enrich_check_credits` diff --git a/apps/docs/content/docs/en/tools/enrichment.mdx b/apps/docs/content/docs/en/integrations/enrichment.mdx similarity index 98% rename from apps/docs/content/docs/en/tools/enrichment.mdx rename to apps/docs/content/docs/en/integrations/enrichment.mdx index 3f4b5a85d3d..702ceb50cf8 100644 --- a/apps/docs/content/docs/en/tools/enrichment.mdx +++ b/apps/docs/content/docs/en/integrations/enrichment.mdx @@ -16,7 +16,7 @@ Run a Sim enrichment to look up data — work email, phone number, company domai -## Tools +## Actions ### `enrichment_run` diff --git a/apps/docs/content/docs/en/tools/evernote.mdx b/apps/docs/content/docs/en/integrations/evernote.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/evernote.mdx rename to apps/docs/content/docs/en/integrations/evernote.mdx index 3a31f07459d..21aa7b16173 100644 --- a/apps/docs/content/docs/en/tools/evernote.mdx +++ b/apps/docs/content/docs/en/integrations/evernote.mdx @@ -31,7 +31,7 @@ Integrate with Evernote to manage notes, notebooks, and tags. Create, read, upda -## Tools +## Actions ### `evernote_copy_note` diff --git a/apps/docs/content/docs/en/tools/exa.mdx b/apps/docs/content/docs/en/integrations/exa.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/exa.mdx rename to apps/docs/content/docs/en/integrations/exa.mdx index 4a1c2779073..c136b4f51cd 100644 --- a/apps/docs/content/docs/en/tools/exa.mdx +++ b/apps/docs/content/docs/en/integrations/exa.mdx @@ -33,7 +33,7 @@ Integrate Exa into the workflow. Can search, get contents, find similar links, a -## Tools +## Actions ### `exa_search` diff --git a/apps/docs/content/docs/en/tools/extend.mdx b/apps/docs/content/docs/en/integrations/extend.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/extend.mdx rename to apps/docs/content/docs/en/integrations/extend.mdx index a92d445f1be..c1e6d2c80d6 100644 --- a/apps/docs/content/docs/en/tools/extend.mdx +++ b/apps/docs/content/docs/en/integrations/extend.mdx @@ -16,7 +16,7 @@ Integrate Extend AI into the workflow. Parse and extract structured content from -## Tools +## Actions ### `extend_parser` diff --git a/apps/docs/content/docs/en/tools/fathom.mdx b/apps/docs/content/docs/en/integrations/fathom.mdx similarity index 59% rename from apps/docs/content/docs/en/tools/fathom.mdx rename to apps/docs/content/docs/en/integrations/fathom.mdx index 28984cb9c17..16270807b0e 100644 --- a/apps/docs/content/docs/en/tools/fathom.mdx +++ b/apps/docs/content/docs/en/integrations/fathom.mdx @@ -31,7 +31,7 @@ Integrate Fathom AI Notetaker into your workflow. List meetings, get transcripts -## Tools +## Actions ### `fathom_list_meetings` @@ -148,3 +148,87 @@ List teams in your Fathom organization. | `next_cursor` | string | Pagination cursor for next page | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Fathom New Meeting Content + +Trigger workflow when new meeting content is ready in Fathom + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Fathom. | +| `triggeredFor` | string | No | Which recording types should trigger this webhook. | +| `includeSummary` | boolean | No | Include the meeting summary in the webhook payload. | +| `includeTranscript` | boolean | No | Include the full transcript in the webhook payload. | +| `includeActionItems` | boolean | No | Include action items extracted from the meeting. | +| `includeCrmMatches` | boolean | No | Include matched CRM contacts, companies, and deals from your linked CRM. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `title` | string | Meeting title | +| `meeting_title` | string | Calendar event title | +| `recording_id` | number | Unique recording ID | +| `url` | string | URL to view the meeting in Fathom | +| `share_url` | string | Shareable URL for the meeting | +| `created_at` | string | ISO 8601 creation timestamp | +| `scheduled_start_time` | string | Scheduled start time | +| `scheduled_end_time` | string | Scheduled end time | +| `recording_start_time` | string | Recording start time | +| `recording_end_time` | string | Recording end time | +| `transcript_language` | string | Language of the transcript | +| `calendar_invitees_domains_type` | string | Domain type: only_internal or one_or_more_external | +| `recorded_by` | object | Recorder details | +| `calendar_invitees` | array | Array of calendar invitees with name and email | +| `default_summary` | object | Meeting summary | +| `transcript` | array | Array of transcript entries with speaker, text, and timestamp | +| `action_items` | array | Array of action items extracted from the meeting | +| `crm_matches` | json | Matched CRM contacts, companies, and deals from linked CRM | + + +--- + +### Fathom Webhook + +Generic webhook trigger for all Fathom events + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Fathom. | +| `triggeredFor` | string | No | Which recording types should trigger this webhook. | +| `includeSummary` | boolean | No | Include the meeting summary in the webhook payload. | +| `includeTranscript` | boolean | No | Include the full transcript in the webhook payload. | +| `includeActionItems` | boolean | No | Include action items extracted from the meeting. | +| `includeCrmMatches` | boolean | No | Include matched CRM contacts, companies, and deals from your linked CRM. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `title` | string | Meeting title | +| `meeting_title` | string | Calendar event title | +| `recording_id` | number | Unique recording ID | +| `url` | string | URL to view the meeting in Fathom | +| `share_url` | string | Shareable URL for the meeting | +| `created_at` | string | ISO 8601 creation timestamp | +| `scheduled_start_time` | string | Scheduled start time | +| `scheduled_end_time` | string | Scheduled end time | +| `recording_start_time` | string | Recording start time | +| `recording_end_time` | string | Recording end time | +| `transcript_language` | string | Language of the transcript | +| `calendar_invitees_domains_type` | string | Domain type: only_internal or one_or_more_external | +| `recorded_by` | object | Recorder details | +| `calendar_invitees` | array | Array of calendar invitees with name and email | +| `default_summary` | object | Meeting summary | +| `transcript` | array | Array of transcript entries with speaker, text, and timestamp | +| `action_items` | array | Array of action items extracted from the meeting | +| `crm_matches` | json | Matched CRM contacts, companies, and deals from linked CRM | + diff --git a/apps/docs/content/docs/en/integrations/file.mdx b/apps/docs/content/docs/en/integrations/file.mdx new file mode 100644 index 00000000000..75759eb25d7 --- /dev/null +++ b/apps/docs/content/docs/en/integrations/file.mdx @@ -0,0 +1,119 @@ +--- +title: File +description: Read, get content, fetch, write, and append files +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +## Usage Instructions + +Read workspace file objects, extract the text content of files, fetch and parse files from URLs with optional headers, write new workspace files, or append content to existing files. + + + +## Actions + +### `file_read` + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `files` | file[] | Workspace file objects \(read\) or fetched file objects \(fetch\) | +| `contents` | array | Array of file text contents, one entry per file \(get content\) | +| `combinedContent` | string | All fetched file contents merged into a single text string \(fetch\) | +| `id` | string | File ID \(write and append\) | +| `name` | string | File name \(write and append\) | +| `size` | number | File size in bytes \(write and append\) | +| `url` | string | URL to access the file \(write and append\) | + +### `file_get_content` + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `files` | file[] | Workspace file objects \(read\) or fetched file objects \(fetch\) | +| `contents` | array | Array of file text contents, one entry per file \(get content\) | +| `combinedContent` | string | All fetched file contents merged into a single text string \(fetch\) | +| `id` | string | File ID \(write and append\) | +| `name` | string | File name \(write and append\) | +| `size` | number | File size in bytes \(write and append\) | +| `url` | string | URL to access the file \(write and append\) | + +### `file_fetch` + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `files` | file[] | Workspace file objects \(read\) or fetched file objects \(fetch\) | +| `contents` | array | Array of file text contents, one entry per file \(get content\) | +| `combinedContent` | string | All fetched file contents merged into a single text string \(fetch\) | +| `id` | string | File ID \(write and append\) | +| `name` | string | File name \(write and append\) | +| `size` | number | File size in bytes \(write and append\) | +| `url` | string | URL to access the file \(write and append\) | + +### `file_write` + +Create a new workspace file. If a file with the same name already exists, a numeric suffix is added (e.g., + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `fileName` | string | Yes | File name \(e.g., "data.csv"\). If a file with this name exists, a numeric suffix is added automatically. | +| `content` | string | Yes | The text content to write to the file. | +| `contentType` | string | No | MIME type for new files \(e.g., "text/plain"\). Auto-detected from file extension if omitted. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | File ID | +| `name` | string | File name | +| `size` | number | File size in bytes | +| `url` | string | URL to access the file | + +### `file_append` + +Append content to an existing workspace file. The file must already exist. Content is added to the end of the file. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `fileName` | string | Yes | Name of an existing workspace file to append to. | +| `content` | string | Yes | The text content to append to the file. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | File ID | +| `name` | string | File name | +| `size` | number | File size in bytes | +| `url` | string | URL to access the file | + + diff --git a/apps/docs/content/docs/en/tools/findymail.mdx b/apps/docs/content/docs/en/integrations/findymail.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/findymail.mdx rename to apps/docs/content/docs/en/integrations/findymail.mdx index 8047b38e794..ef5948ec59c 100644 --- a/apps/docs/content/docs/en/tools/findymail.mdx +++ b/apps/docs/content/docs/en/integrations/findymail.mdx @@ -34,7 +34,7 @@ Integrate Findymail to find verified work emails by name, domain, or LinkedIn UR -## Tools +## Actions ### `findymail_verify_email` diff --git a/apps/docs/content/docs/en/tools/firecrawl.mdx b/apps/docs/content/docs/en/integrations/firecrawl.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/firecrawl.mdx rename to apps/docs/content/docs/en/integrations/firecrawl.mdx index 83567420e53..adde3194056 100644 --- a/apps/docs/content/docs/en/tools/firecrawl.mdx +++ b/apps/docs/content/docs/en/integrations/firecrawl.mdx @@ -40,7 +40,7 @@ Integrate Firecrawl into the workflow. Scrape pages, search the web, crawl entir -## Tools +## Actions ### `firecrawl_scrape` diff --git a/apps/docs/content/docs/en/tools/fireflies.mdx b/apps/docs/content/docs/en/integrations/fireflies.mdx similarity index 92% rename from apps/docs/content/docs/en/tools/fireflies.mdx rename to apps/docs/content/docs/en/integrations/fireflies.mdx index 90c59160525..3f961811a02 100644 --- a/apps/docs/content/docs/en/tools/fireflies.mdx +++ b/apps/docs/content/docs/en/integrations/fireflies.mdx @@ -33,7 +33,7 @@ Integrate Fireflies.ai into the workflow. Manage meeting transcripts, add bot to -## Tools +## Actions ### `fireflies_list_transcripts` @@ -255,3 +255,27 @@ List all contacts from your Fireflies.ai meetings | `contacts` | array | List of contacts from meetings | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Fireflies Transcription Complete + +Trigger workflow when a Fireflies meeting transcription is complete + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Secret key for HMAC signature verification \(set in Fireflies dashboard\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `meetingId` | string | The ID of the transcribed meeting | +| `eventType` | string | The type of event \(e.g. Transcription completed, meeting.transcribed\) | +| `clientReferenceId` | string | Custom reference ID if set during upload | +| `timestamp` | number | Unix timestamp in milliseconds when the event was fired \(V2 webhooks\) | + diff --git a/apps/docs/content/docs/en/tools/gamma.mdx b/apps/docs/content/docs/en/integrations/gamma.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/gamma.mdx rename to apps/docs/content/docs/en/integrations/gamma.mdx index f62b2232a5e..bcfa0072e93 100644 --- a/apps/docs/content/docs/en/tools/gamma.mdx +++ b/apps/docs/content/docs/en/integrations/gamma.mdx @@ -30,7 +30,7 @@ Integrate Gamma into the workflow. Can generate presentations, documents, webpag -## Tools +## Actions ### `gamma_generate` diff --git a/apps/docs/content/docs/en/tools/github.mdx b/apps/docs/content/docs/en/integrations/github.mdx similarity index 69% rename from apps/docs/content/docs/en/tools/github.mdx rename to apps/docs/content/docs/en/integrations/github.mdx index 9ea94cb08da..9512707428f 100644 --- a/apps/docs/content/docs/en/tools/github.mdx +++ b/apps/docs/content/docs/en/integrations/github.mdx @@ -33,7 +33,7 @@ Integrate Github into the workflow. Can get get PR details, create PR comment, g -## Tools +## Actions ### `github_pr` @@ -3283,3 +3283,1178 @@ List users who have starred a repository | `count` | number | Number of stargazers returned | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### GitHub Actions Workflow Run + +Trigger workflow when a GitHub Actions workflow run is requested, in progress, or completed + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., workflow_run\) | +| `action` | string | Action performed \(requested, in_progress, completed\) | +| `workflow_run` | object | workflow_run output from the tool | +| ↳ `id` | number | Workflow run ID | +| ↳ `node_id` | string | Workflow run node ID | +| ↳ `name` | string | Workflow name | +| ↳ `workflow_id` | number | Workflow ID | +| ↳ `run_number` | number | Run number for this workflow | +| ↳ `run_attempt` | number | Attempt number for this run | +| ↳ `event` | string | Event that triggered the workflow \(push, pull_request, etc.\) | +| ↳ `status` | string | Current status \(queued, in_progress, completed\) | +| ↳ `conclusion` | string | Conclusion \(success, failure, cancelled, skipped, timed_out, action_required\) | +| ↳ `head_branch` | string | Branch name | +| ↳ `head_sha` | string | Commit SHA that triggered the workflow | +| ↳ `path` | string | Path to the workflow file | +| ↳ `display_title` | string | Display title for the run | +| ↳ `run_started_at` | string | Timestamp when the run started | +| ↳ `created_at` | string | Workflow run creation timestamp | +| ↳ `updated_at` | string | Workflow run last update timestamp | +| ↳ `html_url` | string | Workflow run HTML URL | +| ↳ `check_suite_id` | number | Associated check suite ID | +| ↳ `check_suite_node_id` | string | Associated check suite node ID | +| ↳ `url` | string | Workflow run API URL | +| ↳ `actor` | object | actor output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `triggering_actor` | object | triggering_actor output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name | +| ↳ `private` | boolean | Whether repository is private | +| ↳ `head_repository` | object | head_repository output from the tool | +| ↳ `id` | number | Head repository ID | +| ↳ `node_id` | string | Head repository node ID | +| ↳ `name` | string | Head repository name | +| ↳ `full_name` | string | Head repository full name | +| ↳ `private` | boolean | Whether repository is private | +| ↳ `head_commit` | object | head_commit output from the tool | +| ↳ `id` | string | Commit SHA | +| ↳ `tree_id` | string | Tree ID | +| ↳ `message` | string | Commit message | +| ↳ `timestamp` | string | Commit timestamp | +| ↳ `author` | object | author output from the tool | +| ↳ `name` | string | Author name | +| ↳ `email` | string | Author email | +| ↳ `committer` | object | committer output from the tool | +| ↳ `name` | string | Committer name | +| ↳ `email` | string | Committer email | +| ↳ `pull_requests` | array | Array of associated pull requests | +| ↳ `referenced_workflows` | array | Array of referenced workflow runs | +| `workflow` | object | workflow output from the tool | +| ↳ `id` | number | Workflow ID | +| ↳ `node_id` | string | Workflow node ID | +| ↳ `name` | string | Workflow name | +| ↳ `path` | string | Path to workflow file | +| ↳ `state` | string | Workflow state \(active, deleted, disabled_fork, etc.\) | +| ↳ `created_at` | string | Workflow creation timestamp | +| ↳ `updated_at` | string | Workflow last update timestamp | +| ↳ `url` | string | Workflow API URL | +| ↳ `html_url` | string | Workflow HTML URL | +| ↳ `badge_url` | string | Workflow badge URL | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub Issue Closed + +Trigger workflow when an issue is closed in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issues, pull_request, push\) | +| `action` | string | Action performed \(opened, closed, reopened, edited, etc.\) | +| `issue` | object | issue output from the tool | +| ↳ `id` | number | Issue ID | +| ↳ `node_id` | string | Issue node ID | +| ↳ `number` | number | Issue number | +| ↳ `title` | string | Issue title | +| ↳ `body` | string | Issue body/description | +| ↳ `state` | string | Issue state \(open, closed\) | +| ↳ `state_reason` | string | Reason for state \(completed, not_planned, reopened\) | +| ↳ `html_url` | string | Issue HTML URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `milestone` | object | Milestone object if assigned | +| ↳ `created_at` | string | Issue creation timestamp | +| ↳ `updated_at` | string | Issue last update timestamp | +| ↳ `closed_at` | string | Issue closed timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub Issue Comment + +Trigger workflow when a comment is added to an issue (not pull requests) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issue_comment\) | +| `action` | string | Action performed \(created, edited, deleted\) | +| `issue` | object | issue output from the tool | +| ↳ `number` | number | Issue number | +| ↳ `title` | string | Issue title | +| ↳ `state` | string | Issue state \(open, closed\) | +| ↳ `html_url` | string | Issue HTML URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| `comment` | object | comment output from the tool | +| ↳ `id` | number | Comment ID | +| ↳ `node_id` | string | Comment node ID | +| ↳ `body` | string | Comment text | +| ↳ `html_url` | string | Comment HTML URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `created_at` | string | Comment creation timestamp | +| ↳ `updated_at` | string | Comment last update timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub Issue Opened + +Trigger workflow when a new issue is opened in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issues, pull_request, push\) | +| `action` | string | Action performed \(opened, closed, reopened, edited, etc.\) | +| `issue` | object | issue output from the tool | +| ↳ `id` | number | Issue ID | +| ↳ `node_id` | string | Issue node ID | +| ↳ `number` | number | Issue number | +| ↳ `title` | string | Issue title | +| ↳ `body` | string | Issue body/description | +| ↳ `state` | string | Issue state \(open, closed\) | +| ↳ `state_reason` | string | Reason for state \(completed, not_planned, reopened\) | +| ↳ `html_url` | string | Issue HTML URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `milestone` | object | Milestone object if assigned | +| ↳ `created_at` | string | Issue creation timestamp | +| ↳ `updated_at` | string | Issue last update timestamp | +| ↳ `closed_at` | string | Issue closed timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub PR Closed + +Trigger workflow when a pull request is closed without being merged (e.g., abandoned) in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | +| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | +| `number` | number | Pull request number | +| `pull_request` | object | pull_request output from the tool | +| ↳ `id` | number | Pull request ID | +| ↳ `node_id` | string | Pull request node ID | +| ↳ `number` | number | Pull request number | +| ↳ `title` | string | Pull request title | +| ↳ `body` | string | Pull request description | +| ↳ `state` | string | Pull request state \(open, closed\) | +| ↳ `merged` | boolean | Whether the PR was merged | +| ↳ `merged_at` | string | Timestamp when PR was merged | +| ↳ `merged_by` | object | merged_by output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `draft` | boolean | Whether the PR is a draft | +| ↳ `html_url` | string | Pull request HTML URL | +| ↳ `diff_url` | string | Pull request diff URL | +| ↳ `patch_url` | string | Pull request patch URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `head` | object | head output from the tool | +| ↳ `ref` | string | Source branch name | +| ↳ `sha` | string | Source branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Source repository name | +| ↳ `full_name` | string | Source repository full name | +| ↳ `base` | object | base output from the tool | +| ↳ `ref` | string | Target branch name | +| ↳ `sha` | string | Target branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Target repository name | +| ↳ `full_name` | string | Target repository full name | +| ↳ `additions` | number | Number of lines added | +| ↳ `deletions` | number | Number of lines deleted | +| ↳ `changed_files` | number | Number of files changed | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `requested_reviewers` | array | Array of requested reviewers | +| ↳ `created_at` | string | Pull request creation timestamp | +| ↳ `updated_at` | string | Pull request last update timestamp | +| ↳ `closed_at` | string | Pull request closed timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub PR Comment + +Trigger workflow when a comment is added to a pull request in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issue_comment\) | +| `action` | string | Action performed \(created, edited, deleted\) | +| `issue` | object | issue output from the tool | +| ↳ `id` | number | Issue ID | +| ↳ `node_id` | string | Issue node ID | +| ↳ `number` | number | Issue/PR number | +| ↳ `title` | string | Issue/PR title | +| ↳ `body` | string | Issue/PR description | +| ↳ `state` | string | Issue/PR state \(open, closed\) | +| ↳ `html_url` | string | Issue/PR HTML URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `pull_request` | object | pull_request output from the tool | +| ↳ `url` | string | Pull request API URL \(present only for PR comments\) | +| ↳ `html_url` | string | Pull request HTML URL | +| ↳ `diff_url` | string | Pull request diff URL | +| ↳ `patch_url` | string | Pull request patch URL | +| ↳ `created_at` | string | Issue/PR creation timestamp | +| ↳ `updated_at` | string | Issue/PR last update timestamp | +| `comment` | object | comment output from the tool | +| ↳ `id` | number | Comment ID | +| ↳ `node_id` | string | Comment node ID | +| ↳ `url` | string | Comment API URL | +| ↳ `html_url` | string | Comment HTML URL | +| ↳ `body` | string | Comment text | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `created_at` | string | Comment creation timestamp | +| ↳ `updated_at` | string | Comment last update timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub PR Merged + +Trigger workflow when a pull request is successfully merged in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | +| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | +| `number` | number | Pull request number | +| `pull_request` | object | pull_request output from the tool | +| ↳ `id` | number | Pull request ID | +| ↳ `node_id` | string | Pull request node ID | +| ↳ `number` | number | Pull request number | +| ↳ `title` | string | Pull request title | +| ↳ `body` | string | Pull request description | +| ↳ `state` | string | Pull request state \(open, closed\) | +| ↳ `merged` | boolean | Whether the PR was merged | +| ↳ `merged_at` | string | Timestamp when PR was merged | +| ↳ `merged_by` | object | merged_by output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `draft` | boolean | Whether the PR is a draft | +| ↳ `html_url` | string | Pull request HTML URL | +| ↳ `diff_url` | string | Pull request diff URL | +| ↳ `patch_url` | string | Pull request patch URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `head` | object | head output from the tool | +| ↳ `ref` | string | Source branch name | +| ↳ `sha` | string | Source branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Source repository name | +| ↳ `full_name` | string | Source repository full name | +| ↳ `base` | object | base output from the tool | +| ↳ `ref` | string | Target branch name | +| ↳ `sha` | string | Target branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Target repository name | +| ↳ `full_name` | string | Target repository full name | +| ↳ `additions` | number | Number of lines added | +| ↳ `deletions` | number | Number of lines deleted | +| ↳ `changed_files` | number | Number of files changed | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `requested_reviewers` | array | Array of requested reviewers | +| ↳ `created_at` | string | Pull request creation timestamp | +| ↳ `updated_at` | string | Pull request last update timestamp | +| ↳ `closed_at` | string | Pull request closed timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub PR Opened + +Trigger workflow when a new pull request is opened in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | +| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | +| `number` | number | Pull request number | +| `pull_request` | object | pull_request output from the tool | +| ↳ `id` | number | Pull request ID | +| ↳ `node_id` | string | Pull request node ID | +| ↳ `number` | number | Pull request number | +| ↳ `title` | string | Pull request title | +| ↳ `body` | string | Pull request description | +| ↳ `state` | string | Pull request state \(open, closed\) | +| ↳ `merged` | boolean | Whether the PR was merged | +| ↳ `merged_at` | string | Timestamp when PR was merged | +| ↳ `merged_by` | object | merged_by output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `draft` | boolean | Whether the PR is a draft | +| ↳ `html_url` | string | Pull request HTML URL | +| ↳ `diff_url` | string | Pull request diff URL | +| ↳ `patch_url` | string | Pull request patch URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `head` | object | head output from the tool | +| ↳ `ref` | string | Source branch name | +| ↳ `sha` | string | Source branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Source repository name | +| ↳ `full_name` | string | Source repository full name | +| ↳ `base` | object | base output from the tool | +| ↳ `ref` | string | Target branch name | +| ↳ `sha` | string | Target branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Target repository name | +| ↳ `full_name` | string | Target repository full name | +| ↳ `additions` | number | Number of lines added | +| ↳ `deletions` | number | Number of lines deleted | +| ↳ `changed_files` | number | Number of files changed | +| ↳ `labels` | array | Array of label objects | +| ↳ `assignees` | array | Array of assigned users | +| ↳ `requested_reviewers` | array | Array of requested reviewers | +| ↳ `created_at` | string | Pull request creation timestamp | +| ↳ `updated_at` | string | Pull request last update timestamp | +| ↳ `closed_at` | string | Pull request closed timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub PR Reviewed + +Trigger workflow when a pull request review is submitted, edited, or dismissed in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request_review\) | +| `action` | string | Action performed \(submitted, edited, dismissed\) | +| `review` | object | review output from the tool | +| ↳ `id` | number | Review ID | +| ↳ `node_id` | string | Review node ID | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | Reviewer username | +| ↳ `id` | number | Reviewer user ID | +| ↳ `node_id` | string | Reviewer node ID | +| ↳ `avatar_url` | string | Reviewer avatar URL | +| ↳ `html_url` | string | Reviewer profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `body` | string | Review comment text | +| ↳ `state` | string | Review state \(approved, changes_requested, commented, dismissed\) | +| ↳ `html_url` | string | Review HTML URL | +| ↳ `submitted_at` | string | Review submission timestamp | +| ↳ `commit_id` | string | Commit SHA that was reviewed | +| ↳ `author_association` | string | Author association \(OWNER, MEMBER, COLLABORATOR, CONTRIBUTOR, etc.\) | +| `pull_request` | object | pull_request output from the tool | +| ↳ `id` | number | Pull request ID | +| ↳ `node_id` | string | Pull request node ID | +| ↳ `number` | number | Pull request number | +| ↳ `title` | string | Pull request title | +| ↳ `body` | string | Pull request description | +| ↳ `state` | string | Pull request state \(open, closed\) | +| ↳ `merged` | boolean | Whether the PR was merged | +| ↳ `draft` | boolean | Whether the PR is a draft | +| ↳ `html_url` | string | Pull request HTML URL | +| ↳ `diff_url` | string | Pull request diff URL | +| ↳ `patch_url` | string | Pull request patch URL | +| ↳ `user` | object | user output from the tool | +| ↳ `login` | string | PR author username | +| ↳ `id` | number | PR author user ID | +| ↳ `node_id` | string | PR author node ID | +| ↳ `avatar_url` | string | PR author avatar URL | +| ↳ `html_url` | string | PR author profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `head` | object | head output from the tool | +| ↳ `ref` | string | Source branch name | +| ↳ `sha` | string | Source branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Source repository name | +| ↳ `full_name` | string | Source repository full name | +| ↳ `base` | object | base output from the tool | +| ↳ `ref` | string | Target branch name | +| ↳ `sha` | string | Target branch commit SHA | +| ↳ `repo` | object | repo output from the tool | +| ↳ `name` | string | Target repository name | +| ↳ `full_name` | string | Target repository full name | +| ↳ `created_at` | string | Pull request creation timestamp | +| ↳ `updated_at` | string | Pull request last update timestamp | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub Push + +Trigger workflow when code is pushed to a repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., push\) | +| `branch` | string | Branch name derived from ref \(e.g., main from refs/heads/main\) | +| `ref` | string | Git reference that was pushed \(e.g., refs/heads/main\) | +| `before` | string | SHA of the commit before the push | +| `after` | string | SHA of the commit after the push | +| `created` | boolean | Whether this push created a new branch or tag | +| `deleted` | boolean | Whether this push deleted a branch or tag | +| `forced` | boolean | Whether this was a force push | +| `base_ref` | string | Base reference for the push | +| `compare` | string | URL to compare the changes | +| `commits` | array | Array of commit objects included in this push | +| `head_commit` | object | head_commit output from the tool | +| ↳ `id` | string | Commit SHA of the most recent commit | +| ↳ `tree_id` | string | Git tree SHA | +| ↳ `distinct` | boolean | Whether this commit is distinct | +| ↳ `message` | string | Commit message | +| ↳ `timestamp` | string | Commit timestamp | +| ↳ `url` | string | Commit URL | +| ↳ `author` | object | author output from the tool | +| ↳ `name` | string | Author name | +| ↳ `email` | string | Author email | +| ↳ `username` | string | Author GitHub username | +| ↳ `committer` | object | committer output from the tool | +| ↳ `name` | string | Committer name | +| ↳ `email` | string | Committer email | +| ↳ `username` | string | Committer GitHub username | +| ↳ `added` | array | Array of file paths added in this commit | +| ↳ `removed` | array | Array of file paths removed in this commit | +| ↳ `modified` | array | Array of file paths modified in this commit | +| `pusher` | object | pusher output from the tool | +| ↳ `name` | string | Pusher name | +| ↳ `email` | string | Pusher email | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `default_branch` | string | Default branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | + + +--- + +### GitHub Release Published + +Trigger workflow when a new release is published in a GitHub repository + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., release\) | +| `action` | string | Action performed \(published, unpublished, created, edited, deleted, prereleased, released\) | +| `release` | object | release output from the tool | +| ↳ `id` | number | Release ID | +| ↳ `node_id` | string | Release node ID | +| ↳ `tag_name` | string | Git tag name for the release | +| ↳ `target_commitish` | string | Target branch or commit SHA | +| ↳ `name` | string | Release name/title | +| ↳ `body` | string | Release description/notes in markdown format | +| ↳ `draft` | boolean | Whether the release is a draft | +| ↳ `prerelease` | boolean | Whether the release is a pre-release | +| ↳ `created_at` | string | Release creation timestamp | +| ↳ `published_at` | string | Release publication timestamp | +| ↳ `url` | string | Release API URL | +| ↳ `html_url` | string | Release HTML URL | +| ↳ `assets_url` | string | Release assets API URL | +| ↳ `upload_url` | string | URL for uploading release assets | +| ↳ `tarball_url` | string | Source code tarball download URL | +| ↳ `zipball_url` | string | Source code zipball download URL | +| ↳ `discussion_url` | string | Discussion URL if available | +| ↳ `author` | object | author output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `gravatar_id` | string | Gravatar ID | +| ↳ `url` | string | User API URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `followers_url` | string | Followers API URL | +| ↳ `following_url` | string | Following API URL | +| ↳ `gists_url` | string | Gists API URL | +| ↳ `starred_url` | string | Starred repositories API URL | +| ↳ `subscriptions_url` | string | Subscriptions API URL | +| ↳ `organizations_url` | string | Organizations API URL | +| ↳ `repos_url` | string | Repositories API URL | +| ↳ `events_url` | string | Events API URL | +| ↳ `received_events_url` | string | Received events API URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `site_admin` | boolean | Whether user is a site administrator | +| ↳ `assets` | array | Array of release asset objects with download URLs | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `repo_description` | string | Repository description | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `archive_url` | string | Archive API URL | +| ↳ `assignees_url` | string | Assignees API URL | +| ↳ `blobs_url` | string | Blobs API URL | +| ↳ `branches_url` | string | Branches API URL | +| ↳ `collaborators_url` | string | Collaborators API URL | +| ↳ `comments_url` | string | Comments API URL | +| ↳ `commits_url` | string | Commits API URL | +| ↳ `compare_url` | string | Compare API URL | +| ↳ `contents_url` | string | Contents API URL | +| ↳ `contributors_url` | string | Contributors API URL | +| ↳ `deployments_url` | string | Deployments API URL | +| ↳ `downloads_url` | string | Downloads API URL | +| ↳ `events_url` | string | Events API URL | +| ↳ `forks_url` | string | Forks API URL | +| ↳ `git_commits_url` | string | Git commits API URL | +| ↳ `git_refs_url` | string | Git refs API URL | +| ↳ `git_tags_url` | string | Git tags API URL | +| ↳ `hooks_url` | string | Hooks API URL | +| ↳ `issue_comment_url` | string | Issue comment API URL | +| ↳ `issue_events_url` | string | Issue events API URL | +| ↳ `issues_url` | string | Issues API URL | +| ↳ `keys_url` | string | Keys API URL | +| ↳ `labels_url` | string | Labels API URL | +| ↳ `languages_url` | string | Languages API URL | +| ↳ `merges_url` | string | Merges API URL | +| ↳ `milestones_url` | string | Milestones API URL | +| ↳ `notifications_url` | string | Notifications API URL | +| ↳ `pulls_url` | string | Pull requests API URL | +| ↳ `releases_url` | string | Releases API URL | +| ↳ `stargazers_url` | string | Stargazers API URL | +| ↳ `statuses_url` | string | Statuses API URL | +| ↳ `subscribers_url` | string | Subscribers API URL | +| ↳ `subscription_url` | string | Subscription API URL | +| ↳ `tags_url` | string | Tags API URL | +| ↳ `teams_url` | string | Teams API URL | +| ↳ `trees_url` | string | Trees API URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size in KB | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `has_issues` | boolean | Whether issues are enabled | +| ↳ `has_projects` | boolean | Whether projects are enabled | +| ↳ `has_downloads` | boolean | Whether downloads are enabled | +| ↳ `has_wiki` | boolean | Whether wiki is enabled | +| ↳ `has_pages` | boolean | Whether GitHub Pages is enabled | +| ↳ `forks_count` | number | Number of forks | +| ↳ `mirror_url` | string | Mirror URL if repository is a mirror | +| ↳ `archived` | boolean | Whether the repository is archived | +| ↳ `disabled` | boolean | Whether the repository is disabled | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `license` | object | license output from the tool | +| ↳ `key` | string | License key | +| ↳ `name` | string | License name | +| ↳ `spdx_id` | string | SPDX license identifier | +| ↳ `url` | string | License API URL | +| ↳ `node_id` | string | License node ID | +| ↳ `allow_forking` | boolean | Whether forking is allowed | +| ↳ `is_template` | boolean | Whether repository is a template | +| ↳ `topics` | array | Array of repository topics | +| ↳ `visibility` | string | Repository visibility \(public, private, internal\) | +| ↳ `forks` | number | Number of forks | +| ↳ `open_issues` | number | Number of open issues | +| ↳ `watchers` | number | Number of watchers | +| ↳ `default_branch` | string | Default branch name | +| ↳ `created_at` | string | Repository creation timestamp | +| ↳ `updated_at` | string | Repository last update timestamp | +| ↳ `pushed_at` | string | Repository last push timestamp | +| ↳ `owner` | object | owner output from the tool | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `gravatar_id` | string | Owner gravatar ID | +| ↳ `url` | string | Owner API URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `followers_url` | string | Followers API URL | +| ↳ `following_url` | string | Following API URL | +| ↳ `gists_url` | string | Gists API URL | +| ↳ `starred_url` | string | Starred repositories API URL | +| ↳ `subscriptions_url` | string | Subscriptions API URL | +| ↳ `organizations_url` | string | Organizations API URL | +| ↳ `repos_url` | string | Repositories API URL | +| ↳ `events_url` | string | Events API URL | +| ↳ `received_events_url` | string | Received events API URL | +| ↳ `owner_type` | string | Owner type \(User, Organization\) | +| ↳ `site_admin` | boolean | Whether owner is a site administrator | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Username | +| ↳ `id` | number | User ID | +| ↳ `node_id` | string | User node ID | +| ↳ `avatar_url` | string | Avatar URL | +| ↳ `gravatar_id` | string | Gravatar ID | +| ↳ `url` | string | User API URL | +| ↳ `html_url` | string | Profile URL | +| ↳ `followers_url` | string | Followers API URL | +| ↳ `following_url` | string | Following API URL | +| ↳ `gists_url` | string | Gists API URL | +| ↳ `starred_url` | string | Starred repositories API URL | +| ↳ `subscriptions_url` | string | Subscriptions API URL | +| ↳ `organizations_url` | string | Organizations API URL | +| ↳ `repos_url` | string | Repositories API URL | +| ↳ `events_url` | string | Events API URL | +| ↳ `received_events_url` | string | Received events API URL | +| ↳ `user_type` | string | User type \(User, Bot, Organization\) | +| ↳ `site_admin` | boolean | Whether user is a site administrator | + + +--- + +### GitHub Webhook + +Trigger workflow from GitHub events like push, pull requests, issues, and more + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | +| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | +| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `ref` | string | Git reference \(e.g., refs/heads/fix/telegram-wh\) | +| `before` | string | SHA of the commit before the push | +| `after` | string | SHA of the commit after the push | +| `created` | boolean | Whether the push created the reference | +| `deleted` | boolean | Whether the push deleted the reference | +| `forced` | boolean | Whether the push was forced | +| `base_ref` | string | Base reference for the push | +| `compare` | string | URL to compare the changes | +| `repository` | object | repository output from the tool | +| ↳ `id` | number | Repository ID | +| ↳ `node_id` | string | Repository node ID | +| ↳ `name` | string | Repository name | +| ↳ `full_name` | string | Repository full name \(owner/repo\) | +| ↳ `private` | boolean | Whether the repository is private | +| ↳ `html_url` | string | Repository HTML URL | +| ↳ `fork` | boolean | Whether the repository is a fork | +| ↳ `url` | string | Repository API URL | +| ↳ `created_at` | number | Repository creation timestamp | +| ↳ `updated_at` | string | Repository last updated time | +| ↳ `pushed_at` | number | Repository last push timestamp | +| ↳ `git_url` | string | Repository git URL | +| ↳ `ssh_url` | string | Repository SSH URL | +| ↳ `clone_url` | string | Repository clone URL | +| ↳ `homepage` | string | Repository homepage URL | +| ↳ `size` | number | Repository size | +| ↳ `stargazers_count` | number | Number of stars | +| ↳ `watchers_count` | number | Number of watchers | +| ↳ `language` | string | Primary programming language | +| ↳ `forks_count` | number | Number of forks | +| ↳ `archived` | boolean | Whether the repository is archived | +| ↳ `disabled` | boolean | Whether the repository is disabled | +| ↳ `open_issues_count` | number | Number of open issues | +| ↳ `topics` | array | Repository topics | +| ↳ `visibility` | string | Repository visibility \(public, private\) | +| ↳ `forks` | number | Number of forks | +| ↳ `open_issues` | number | Number of open issues | +| ↳ `watchers` | number | Number of watchers | +| ↳ `default_branch` | string | Default branch name | +| ↳ `stargazers` | number | Number of stargazers | +| ↳ `master_branch` | string | Master branch name | +| ↳ `owner` | object | owner output from the tool | +| ↳ `name` | string | Owner name | +| ↳ `email` | string | Owner email | +| ↳ `login` | string | Owner username | +| ↳ `id` | number | Owner ID | +| ↳ `node_id` | string | Owner node ID | +| ↳ `avatar_url` | string | Owner avatar URL | +| ↳ `gravatar_id` | string | Owner gravatar ID | +| ↳ `url` | string | Owner API URL | +| ↳ `html_url` | string | Owner profile URL | +| ↳ `user_view_type` | string | User view type | +| ↳ `site_admin` | boolean | Whether the owner is a site admin | +| ↳ `license` | object | Repository license information | +| `pusher` | object | Information about who pushed the changes | +| `sender` | object | sender output from the tool | +| ↳ `login` | string | Sender username | +| ↳ `id` | number | Sender ID | +| ↳ `node_id` | string | Sender node ID | +| ↳ `avatar_url` | string | Sender avatar URL | +| ↳ `gravatar_id` | string | Sender gravatar ID | +| ↳ `url` | string | Sender API URL | +| ↳ `html_url` | string | Sender profile URL | +| ↳ `user_view_type` | string | User view type | +| ↳ `site_admin` | boolean | Whether the sender is a site admin | +| `commits` | array | Array of commit objects | +| `head_commit` | object | Head commit object | +| `event_type` | string | Type of GitHub event \(e.g., push, pull_request, issues\) | +| `action` | string | The action that was performed \(e.g., opened, closed, synchronize\) | +| `branch` | string | Branch name extracted from ref | + diff --git a/apps/docs/content/docs/en/tools/gitlab.mdx b/apps/docs/content/docs/en/integrations/gitlab.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/gitlab.mdx rename to apps/docs/content/docs/en/integrations/gitlab.mdx index 64395a4178e..6d7340bac8e 100644 --- a/apps/docs/content/docs/en/tools/gitlab.mdx +++ b/apps/docs/content/docs/en/integrations/gitlab.mdx @@ -31,7 +31,7 @@ Integrate GitLab into the workflow. Can manage projects, issues, merge requests, -## Tools +## Actions ### `gitlab_list_projects` diff --git a/apps/docs/content/docs/en/tools/gmail.mdx b/apps/docs/content/docs/en/integrations/gmail.mdx similarity index 84% rename from apps/docs/content/docs/en/tools/gmail.mdx rename to apps/docs/content/docs/en/integrations/gmail.mdx index 2a19aecc6f1..643ff1fdf35 100644 --- a/apps/docs/content/docs/en/tools/gmail.mdx +++ b/apps/docs/content/docs/en/integrations/gmail.mdx @@ -35,7 +35,7 @@ Integrate Gmail into the workflow. Can send, read, search, and move emails. Can -## Tools +## Actions ### `gmail_send` @@ -315,3 +315,44 @@ Remove label(s) from a Gmail message. Returns API-aligned fields only. | `labelIds` | array | Updated email labels | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### Gmail Email Trigger + +Triggers when new emails are received in Gmail (requires Gmail credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires google email credentials to access your account. | +| `labelIds` | string | No | Choose which Gmail labels to monitor. Leave empty to monitor all emails. | +| `labelFilterBehavior` | string | Yes | Include only emails with selected labels, or exclude emails with selected labels | +| `searchQuery` | string | No | Optional Gmail search query to filter emails. Use the same format as Gmail search box \(e.g., | +| `markAsRead` | boolean | No | Automatically mark emails as read after processing | +| `includeAttachments` | boolean | No | Download and include email attachments in the trigger payload | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `email` | object | email output from the tool | +| ↳ `id` | string | Gmail message ID | +| ↳ `threadId` | string | Gmail thread ID | +| ↳ `subject` | string | Email subject line | +| ↳ `from` | string | Sender email address | +| ↳ `to` | string | Recipient email address | +| ↳ `cc` | string | CC recipients | +| ↳ `date` | string | Email date in ISO format | +| ↳ `bodyText` | string | Plain text email body | +| ↳ `bodyHtml` | string | HTML email body | +| ↳ `labels` | string | Email labels array | +| ↳ `hasAttachments` | boolean | Whether email has attachments | +| ↳ `attachments` | file[] | Array of email attachments as files \(if includeAttachments is enabled\) | +| `timestamp` | string | Event timestamp | + diff --git a/apps/docs/content/docs/en/tools/gong.mdx b/apps/docs/content/docs/en/integrations/gong.mdx similarity index 88% rename from apps/docs/content/docs/en/tools/gong.mdx rename to apps/docs/content/docs/en/integrations/gong.mdx index f01b1ae395a..475a85d7530 100644 --- a/apps/docs/content/docs/en/tools/gong.mdx +++ b/apps/docs/content/docs/en/integrations/gong.mdx @@ -35,7 +35,7 @@ Integrate Gong into your workflow. Access call recordings, transcripts, user dat -## Tools +## Actions ### `gong_list_calls` @@ -807,3 +807,101 @@ Find all references to a phone number in Gong (calls, email messages, meetings, | ↳ `value` | json | Field value | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Gong Call Completed + +Trigger workflow when a call is completed and processed in Gong + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `gongJwtPublicKeyPem` | string | No | Required only when your Gong rule uses **Signed JWT header**. Sim verifies RS256, `webhook_url`, and `body_sha256` per Gong. If empty, only the webhook URL path authenticates the request. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | Constant identifier for automation-rule webhooks \(`gong.automation_rule`\). Gong does not send distinct event names in the payload. | +| `callId` | string | Gong call ID \(same value as metaData.id when present\) | +| `isTest` | boolean | Whether this is a test webhook from the Gong UI | +| `callData` | json | Full call data object | +| `metaData` | object | metaData output from the tool | +| ↳ `id` | string | Gong call ID | +| ↳ `url` | string | URL to the call in Gong | +| ↳ `title` | string | Call title | +| ↳ `scheduled` | string | Scheduled start time \(ISO 8601\) | +| ↳ `started` | string | Actual start time \(ISO 8601\) | +| ↳ `duration` | number | Call duration in seconds | +| ↳ `primaryUserId` | string | Primary Gong user ID | +| ↳ `workspaceId` | string | Gong workspace ID | +| ↳ `direction` | string | Call direction \(Inbound, Outbound, etc.\) | +| ↳ `system` | string | Communication platform used \(e.g. Zoom, Teams\) | +| ↳ `scope` | string | Call scope \(Internal, External, or Unknown\) | +| ↳ `media` | string | Media type \(Video or Audio\) | +| ↳ `language` | string | Language code \(ISO-639-2B\) | +| ↳ `sdrDisposition` | string | SDR disposition classification \(when present\) | +| ↳ `clientUniqueId` | string | Call identifier from the origin recording system \(when present\) | +| ↳ `customData` | string | Custom metadata from call creation \(when present\) | +| ↳ `purpose` | string | Call purpose \(when present\) | +| ↳ `meetingUrl` | string | Web conference provider URL \(when present\) | +| ↳ `isPrivate` | boolean | Whether the call is private \(when present\) | +| ↳ `calendarEventId` | string | Calendar event identifier \(when present\) | +| `parties` | array | Array of call participants with name, email, title, and affiliation | +| `context` | array | Array of CRM context objects \(Salesforce opportunities, accounts, etc.\) | +| `trackers` | array | Keyword and smart trackers from call content \(same shape as Gong extensive-calls `content.trackers`\) | +| `topics` | array | Topic segments with durations from call content \(`content.topics`\) | +| `highlights` | array | AI-generated highlights from call content \(`content.highlights`\) | + + +--- + +### Gong Webhook + +Generic webhook trigger for all Gong events + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `gongJwtPublicKeyPem` | string | No | Required only when your Gong rule uses **Signed JWT header**. Sim verifies RS256, `webhook_url`, and `body_sha256` per Gong. If empty, only the webhook URL path authenticates the request. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | Constant identifier for automation-rule webhooks \(`gong.automation_rule`\). Gong does not send distinct event names in the payload. | +| `callId` | string | Gong call ID \(same value as metaData.id when present\) | +| `isTest` | boolean | Whether this is a test webhook from the Gong UI | +| `callData` | json | Full call data object | +| `metaData` | object | metaData output from the tool | +| ↳ `id` | string | Gong call ID | +| ↳ `url` | string | URL to the call in Gong | +| ↳ `title` | string | Call title | +| ↳ `scheduled` | string | Scheduled start time \(ISO 8601\) | +| ↳ `started` | string | Actual start time \(ISO 8601\) | +| ↳ `duration` | number | Call duration in seconds | +| ↳ `primaryUserId` | string | Primary Gong user ID | +| ↳ `workspaceId` | string | Gong workspace ID | +| ↳ `direction` | string | Call direction \(Inbound, Outbound, etc.\) | +| ↳ `system` | string | Communication platform used \(e.g. Zoom, Teams\) | +| ↳ `scope` | string | Call scope \(Internal, External, or Unknown\) | +| ↳ `media` | string | Media type \(Video or Audio\) | +| ↳ `language` | string | Language code \(ISO-639-2B\) | +| ↳ `sdrDisposition` | string | SDR disposition classification \(when present\) | +| ↳ `clientUniqueId` | string | Call identifier from the origin recording system \(when present\) | +| ↳ `customData` | string | Custom metadata from call creation \(when present\) | +| ↳ `purpose` | string | Call purpose \(when present\) | +| ↳ `meetingUrl` | string | Web conference provider URL \(when present\) | +| ↳ `isPrivate` | boolean | Whether the call is private \(when present\) | +| ↳ `calendarEventId` | string | Calendar event identifier \(when present\) | +| `parties` | array | Array of call participants with name, email, title, and affiliation | +| `context` | array | Array of CRM context objects \(Salesforce opportunities, accounts, etc.\) | +| `trackers` | array | Keyword and smart trackers from call content \(same shape as Gong extensive-calls `content.trackers`\) | +| `topics` | array | Topic segments with durations from call content \(`content.topics`\) | +| `highlights` | array | AI-generated highlights from call content \(`content.highlights`\) | + diff --git a/apps/docs/content/docs/en/tools/google_ads.mdx b/apps/docs/content/docs/en/integrations/google_ads.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_ads.mdx rename to apps/docs/content/docs/en/integrations/google_ads.mdx index 5972f683e8f..c3c1c4866db 100644 --- a/apps/docs/content/docs/en/tools/google_ads.mdx +++ b/apps/docs/content/docs/en/integrations/google_ads.mdx @@ -23,7 +23,7 @@ Connect to Google Ads to list accessible accounts, list campaigns, view ad group -## Tools +## Actions ### `google_ads_list_customers` diff --git a/apps/docs/content/docs/en/tools/google_bigquery.mdx b/apps/docs/content/docs/en/integrations/google_bigquery.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_bigquery.mdx rename to apps/docs/content/docs/en/integrations/google_bigquery.mdx index 048407c0fcf..f14008b9ba3 100644 --- a/apps/docs/content/docs/en/tools/google_bigquery.mdx +++ b/apps/docs/content/docs/en/integrations/google_bigquery.mdx @@ -30,7 +30,7 @@ Connect to Google BigQuery to run SQL queries, list datasets and tables, get tab -## Tools +## Actions ### `google_bigquery_query` diff --git a/apps/docs/content/docs/en/tools/google_books.mdx b/apps/docs/content/docs/en/integrations/google_books.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_books.mdx rename to apps/docs/content/docs/en/integrations/google_books.mdx index 7b3c77df1d3..24deff5c884 100644 --- a/apps/docs/content/docs/en/tools/google_books.mdx +++ b/apps/docs/content/docs/en/integrations/google_books.mdx @@ -28,7 +28,7 @@ Search for books using the Google Books API. Find volumes by title, author, ISBN -## Tools +## Actions ### `google_books_volume_search` diff --git a/apps/docs/content/docs/en/tools/google_calendar.mdx b/apps/docs/content/docs/en/integrations/google_calendar.mdx similarity index 87% rename from apps/docs/content/docs/en/tools/google_calendar.mdx rename to apps/docs/content/docs/en/integrations/google_calendar.mdx index 825c2e109db..4b6011767f8 100644 --- a/apps/docs/content/docs/en/tools/google_calendar.mdx +++ b/apps/docs/content/docs/en/integrations/google_calendar.mdx @@ -34,7 +34,7 @@ Integrate Google Calendar into the workflow. Can create, read, update, and list -## Tools +## Actions ### `google_calendar_create` @@ -318,3 +318,46 @@ Invite attendees to an existing Google Calendar event. Returns API-aligned field | `organizer` | json | Event organizer | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### Google Calendar Event Trigger + +Triggers when events are created, updated, or cancelled in Google Calendar + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Connect your Google account to access Google Calendar. | +| `calendarId` | file-selector | No | The calendar to monitor for event changes. | +| `manualCalendarId` | string | No | The calendar to monitor for event changes. | +| `eventTypeFilter` | string | No | Only trigger for specific event types. Defaults to all events. | +| `searchTerm` | string | No | Optional: Filter events by text match across title, description, location, and attendees. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | object | event output from the tool | +| ↳ `id` | string | Calendar event ID | +| ↳ `status` | string | Event status \(confirmed, tentative, cancelled\) | +| ↳ `eventType` | string | Change type: "created", "updated", or "cancelled" | +| ↳ `summary` | string | Event title | +| ↳ `eventDescription` | string | Event description | +| ↳ `location` | string | Event location | +| ↳ `htmlLink` | string | Link to event in Google Calendar | +| ↳ `start` | json | Event start time | +| ↳ `end` | json | Event end time | +| ↳ `created` | string | Event creation time | +| ↳ `updated` | string | Event last updated time | +| ↳ `attendees` | json | Event attendees | +| ↳ `creator` | json | Event creator | +| ↳ `organizer` | json | Event organizer | +| `calendarId` | string | Calendar ID | +| `timestamp` | string | Event processing timestamp in ISO format | + diff --git a/apps/docs/content/docs/en/tools/google_contacts.mdx b/apps/docs/content/docs/en/integrations/google_contacts.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_contacts.mdx rename to apps/docs/content/docs/en/integrations/google_contacts.mdx index 461aa7d4563..3a98b2aea67 100644 --- a/apps/docs/content/docs/en/tools/google_contacts.mdx +++ b/apps/docs/content/docs/en/integrations/google_contacts.mdx @@ -16,7 +16,7 @@ Integrate Google Contacts into the workflow. Can create, read, update, delete, l -## Tools +## Actions ### `google_contacts_create` diff --git a/apps/docs/content/docs/en/tools/google_docs.mdx b/apps/docs/content/docs/en/integrations/google_docs.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_docs.mdx rename to apps/docs/content/docs/en/integrations/google_docs.mdx index b4b17f34992..e666fcc2ad5 100644 --- a/apps/docs/content/docs/en/tools/google_docs.mdx +++ b/apps/docs/content/docs/en/integrations/google_docs.mdx @@ -31,7 +31,7 @@ Integrate Google Docs into the workflow. Can read, write, and create documents. -## Tools +## Actions ### `google_docs_read` diff --git a/apps/docs/content/docs/en/tools/google_drive.mdx b/apps/docs/content/docs/en/integrations/google_drive.mdx similarity index 94% rename from apps/docs/content/docs/en/tools/google_drive.mdx rename to apps/docs/content/docs/en/integrations/google_drive.mdx index 5e5b3d409be..5b2d22b43f8 100644 --- a/apps/docs/content/docs/en/tools/google_drive.mdx +++ b/apps/docs/content/docs/en/integrations/google_drive.mdx @@ -32,7 +32,7 @@ Integrate Google Drive into the workflow. Can create, upload, download, copy, mo -## Tools +## Actions ### `google_drive_list` @@ -724,3 +724,44 @@ Get information about the user and their Google Drive (storage quota, capabiliti | `maxUploadSize` | string | Maximum upload size in bytes | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### Google Drive File Trigger + +Triggers when files are created, modified, or deleted in Google Drive + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Connect your Google account to access Google Drive. | +| `folderId` | file-selector | No | Optional: The folder to monitor. Leave empty to monitor all files in Drive. | +| `manualFolderId` | string | No | Optional: The folder ID from the Google Drive URL to monitor. Leave empty to monitor all files. | +| `mimeTypeFilter` | string | No | Optional: Only trigger for specific file types. | +| `eventTypeFilter` | string | No | Only trigger for specific change types. Defaults to all changes. | +| `includeSharedDrives` | boolean | No | Include files from shared \(team\) drives. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `file` | object | file output from the tool | +| ↳ `id` | string | Google Drive file ID | +| ↳ `name` | string | File name | +| ↳ `mimeType` | string | File MIME type | +| ↳ `modifiedTime` | string | Last modified time \(ISO\) | +| ↳ `createdTime` | string | File creation time \(ISO\) | +| ↳ `size` | string | File size in bytes | +| ↳ `webViewLink` | string | URL to view file in browser | +| ↳ `parents` | json | Parent folder IDs | +| ↳ `lastModifyingUser` | json | User who last modified the file | +| ↳ `shared` | boolean | Whether file is shared | +| ↳ `starred` | boolean | Whether file is starred | +| `eventType` | string | Change type: "created", "modified", or "deleted" | +| `timestamp` | string | Event timestamp in ISO format | + diff --git a/apps/docs/content/docs/en/tools/google_forms.mdx b/apps/docs/content/docs/en/integrations/google_forms.mdx similarity index 88% rename from apps/docs/content/docs/en/tools/google_forms.mdx rename to apps/docs/content/docs/en/integrations/google_forms.mdx index a828ec9c61b..a580afbbeb5 100644 --- a/apps/docs/content/docs/en/tools/google_forms.mdx +++ b/apps/docs/content/docs/en/integrations/google_forms.mdx @@ -33,7 +33,7 @@ Integrate Google Forms into your workflow. Read form structure, get responses, c -## Tools +## Actions ### `google_forms_get_responses` @@ -256,3 +256,33 @@ Renew a notification watch for another 7 days | `state` | string | The watch state | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Google Forms Webhook + +Trigger workflow from Google Form submissions (via Apps Script forwarder) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `token` | string | Yes | We validate requests using this secret. Send it as Authorization: Bearer <token> or a custom header. | +| `secretHeaderName` | string | No | If set, the webhook will validate this header equals your Shared Secret instead of Authorization. | +| `triggerFormId` | string | No | Optional, for clarity and matching in workflows. Not required for webhook to work. | +| `includeRawPayload` | boolean | No | Include the original payload from Apps Script in the workflow input. | +| `setupScript` | string | No | Copy this code and paste it into your Google Forms Apps Script editor | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `responseId` | string | Unique response identifier \(if available\) | +| `createTime` | string | Response creation timestamp | +| `lastSubmittedTime` | string | Last submitted timestamp | +| `formId` | string | Google Form ID | +| `answers` | object | Normalized map of question -> answer | +| `raw` | object | Original payload \(when enabled\) | + diff --git a/apps/docs/content/docs/en/tools/google_groups.mdx b/apps/docs/content/docs/en/integrations/google_groups.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_groups.mdx rename to apps/docs/content/docs/en/integrations/google_groups.mdx index ee0ac7788e4..24739a8296b 100644 --- a/apps/docs/content/docs/en/tools/google_groups.mdx +++ b/apps/docs/content/docs/en/integrations/google_groups.mdx @@ -33,7 +33,7 @@ Connect to Google Workspace to create, update, and manage groups and their membe -## Tools +## Actions ### `google_groups_list_groups` diff --git a/apps/docs/content/docs/en/tools/google_maps.mdx b/apps/docs/content/docs/en/integrations/google_maps.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_maps.mdx rename to apps/docs/content/docs/en/integrations/google_maps.mdx index 958c36165a4..3fcc90c3d61 100644 --- a/apps/docs/content/docs/en/tools/google_maps.mdx +++ b/apps/docs/content/docs/en/integrations/google_maps.mdx @@ -36,7 +36,7 @@ Integrate Google Maps Platform APIs into your workflow. Supports geocoding addre -## Tools +## Actions ### `google_maps_air_quality` diff --git a/apps/docs/content/docs/en/tools/google_meet.mdx b/apps/docs/content/docs/en/integrations/google_meet.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_meet.mdx rename to apps/docs/content/docs/en/integrations/google_meet.mdx index d7a294dbf8a..531a7dab5ac 100644 --- a/apps/docs/content/docs/en/tools/google_meet.mdx +++ b/apps/docs/content/docs/en/integrations/google_meet.mdx @@ -33,7 +33,7 @@ Integrate Google Meet into your workflow. Create meeting spaces, get space detai -## Tools +## Actions ### `google_meet_create_space` diff --git a/apps/docs/content/docs/en/tools/google_pagespeed.mdx b/apps/docs/content/docs/en/integrations/google_pagespeed.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_pagespeed.mdx rename to apps/docs/content/docs/en/integrations/google_pagespeed.mdx index 6ce1231e5fd..41628ee0221 100644 --- a/apps/docs/content/docs/en/tools/google_pagespeed.mdx +++ b/apps/docs/content/docs/en/integrations/google_pagespeed.mdx @@ -40,7 +40,7 @@ Analyze web pages for performance, accessibility, SEO, and best practices using -## Tools +## Actions ### `google_pagespeed_analyze` diff --git a/apps/docs/content/docs/en/tools/google_search.mdx b/apps/docs/content/docs/en/integrations/google_search.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_search.mdx rename to apps/docs/content/docs/en/integrations/google_search.mdx index f6b8461b1d2..94c9b599914 100644 --- a/apps/docs/content/docs/en/tools/google_search.mdx +++ b/apps/docs/content/docs/en/integrations/google_search.mdx @@ -27,7 +27,7 @@ Integrate Google Search into the workflow. Can search the web. -## Tools +## Actions ### `google_search` diff --git a/apps/docs/content/docs/en/tools/google_sheets.mdx b/apps/docs/content/docs/en/integrations/google_sheets.mdx similarity index 89% rename from apps/docs/content/docs/en/tools/google_sheets.mdx rename to apps/docs/content/docs/en/integrations/google_sheets.mdx index e7efb3a8804..d52ebeaf950 100644 --- a/apps/docs/content/docs/en/tools/google_sheets.mdx +++ b/apps/docs/content/docs/en/integrations/google_sheets.mdx @@ -34,7 +34,7 @@ Integrate Google Sheets into the workflow with explicit sheet selection. Can rea -## Tools +## Actions ### `google_sheets_read` @@ -315,3 +315,38 @@ Copy a sheet from one spreadsheet to another | `destinationSpreadsheetUrl` | string | URL to the destination spreadsheet | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### Google Sheets New Row Trigger + +Triggers when new rows are added to a Google Sheet + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Connect your Google account to access Google Sheets. | +| `spreadsheetId` | file-selector | Yes | The spreadsheet to monitor for new rows. | +| `manualSpreadsheetId` | string | Yes | The spreadsheet to monitor for new rows. | +| `sheetName` | sheet-selector | Yes | The sheet tab to monitor for new rows. | +| `manualSheetName` | string | Yes | The sheet tab to monitor for new rows. | +| `valueRenderOption` | string | No | How values are rendered. Formatted returns display strings, Unformatted returns raw numbers/booleans, Formula returns the formula text. | +| `dateTimeRenderOption` | string | No | How dates and times are rendered. Only applies when Value Render is not | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `row` | json | Row data mapped to column headers from row 1 | +| `rawRow` | json | Raw row values as an array | +| `headers` | json | Column headers from row 1 | +| `rowNumber` | number | The 1-based row number of the new row | +| `spreadsheetId` | string | The spreadsheet ID | +| `sheetName` | string | The sheet tab name | +| `timestamp` | string | Event timestamp in ISO format | + diff --git a/apps/docs/content/docs/en/tools/google_slides.mdx b/apps/docs/content/docs/en/integrations/google_slides.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_slides.mdx rename to apps/docs/content/docs/en/integrations/google_slides.mdx index c199362415d..0957eff851e 100644 --- a/apps/docs/content/docs/en/tools/google_slides.mdx +++ b/apps/docs/content/docs/en/integrations/google_slides.mdx @@ -34,7 +34,7 @@ Build, edit, and export branded Google Slides presentations end-to-end. Copy a t -## Tools +## Actions ### `google_slides_read` diff --git a/apps/docs/content/docs/en/tools/google_tasks.mdx b/apps/docs/content/docs/en/integrations/google_tasks.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_tasks.mdx rename to apps/docs/content/docs/en/integrations/google_tasks.mdx index c6997c3490b..681a83c89ab 100644 --- a/apps/docs/content/docs/en/tools/google_tasks.mdx +++ b/apps/docs/content/docs/en/integrations/google_tasks.mdx @@ -32,7 +32,7 @@ Integrate Google Tasks into your workflow. Create, read, update, delete, and lis -## Tools +## Actions ### `google_tasks_create` diff --git a/apps/docs/content/docs/en/tools/google_translate.mdx b/apps/docs/content/docs/en/integrations/google_translate.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_translate.mdx rename to apps/docs/content/docs/en/integrations/google_translate.mdx index 42de4a86771..d58efeb2c2e 100644 --- a/apps/docs/content/docs/en/tools/google_translate.mdx +++ b/apps/docs/content/docs/en/integrations/google_translate.mdx @@ -28,7 +28,7 @@ Translate and detect languages using the Google Cloud Translation API. Supports -## Tools +## Actions ### `google_translate_text` diff --git a/apps/docs/content/docs/en/tools/google_vault.mdx b/apps/docs/content/docs/en/integrations/google_vault.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/google_vault.mdx rename to apps/docs/content/docs/en/integrations/google_vault.mdx index ebbec02e598..c83ee44eefd 100644 --- a/apps/docs/content/docs/en/tools/google_vault.mdx +++ b/apps/docs/content/docs/en/integrations/google_vault.mdx @@ -32,7 +32,7 @@ Connect Google Vault to create exports, list exports, and manage holds within ma -## Tools +## Actions ### `google_vault_create_matters_export` diff --git a/apps/docs/content/docs/en/tools/grafana.mdx b/apps/docs/content/docs/en/integrations/grafana.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/grafana.mdx rename to apps/docs/content/docs/en/integrations/grafana.mdx index 0636bf3726d..4033539ff75 100644 --- a/apps/docs/content/docs/en/tools/grafana.mdx +++ b/apps/docs/content/docs/en/integrations/grafana.mdx @@ -36,7 +36,7 @@ Integrate Grafana into workflows. Manage dashboards, alerts, annotations, data s -## Tools +## Actions ### `grafana_get_dashboard` diff --git a/apps/docs/content/docs/en/tools/grain.mdx b/apps/docs/content/docs/en/integrations/grain.mdx similarity index 56% rename from apps/docs/content/docs/en/tools/grain.mdx rename to apps/docs/content/docs/en/integrations/grain.mdx index 85eddd19352..f027f2c9575 100644 --- a/apps/docs/content/docs/en/tools/grain.mdx +++ b/apps/docs/content/docs/en/integrations/grain.mdx @@ -37,7 +37,7 @@ Integrate Grain into your workflow. Access meeting recordings, transcripts, high -## Tools +## Actions ### `grain_list_recordings` @@ -259,3 +259,231 @@ Delete a webhook by ID | `success` | boolean | True when webhook was successfully deleted | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Grain All Events + +Trigger on all actions (added, updated, removed) in a Grain view + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., recording_added\) | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | Event data object \(recording, highlight, etc.\) | + + +--- + +### Grain Highlight Created + +Trigger workflow when a new highlight/clip is created in Grain + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | data output from the tool | +| ↳ `id` | string | Highlight UUID | +| ↳ `recording_id` | string | Parent recording UUID | +| ↳ `text` | string | Highlight title/description | +| ↳ `transcript` | string | Transcript text of the clip | +| ↳ `speakers` | array | Array of speaker names | +| ↳ `timestamp` | number | Start timestamp in ms | +| ↳ `duration` | number | Duration in ms | +| ↳ `tags` | array | Array of tag strings | +| ↳ `url` | string | URL to view in Grain | +| ↳ `thumbnail_url` | string | Thumbnail URL | +| ↳ `created_datetime` | string | ISO8601 creation timestamp | + + +--- + +### Grain Highlight Updated + +Trigger workflow when a highlight/clip is updated in Grain + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | data output from the tool | +| ↳ `id` | string | Highlight UUID | +| ↳ `recording_id` | string | Parent recording UUID | +| ↳ `text` | string | Highlight title/description | +| ↳ `transcript` | string | Transcript text of the clip | +| ↳ `speakers` | array | Array of speaker names | +| ↳ `timestamp` | number | Start timestamp in ms | +| ↳ `duration` | number | Duration in ms | +| ↳ `tags` | array | Array of tag strings | +| ↳ `url` | string | URL to view in Grain | +| ↳ `thumbnail_url` | string | Thumbnail URL | +| ↳ `created_datetime` | string | ISO8601 creation timestamp | + + +--- + +### Grain Item Added + +Trigger when a new item is added to a Grain view (recording, highlight, or story) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., recording_added\) | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | Event data object \(recording, highlight, etc.\) | + + +--- + +### Grain Item Updated + +Trigger when an item is updated in a Grain view (recording, highlight, or story) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., recording_added\) | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | Event data object \(recording, highlight, etc.\) | + + +--- + +### Grain Recording Created + +Trigger workflow when a new recording is added in Grain + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | data output from the tool | +| ↳ `id` | string | Recording UUID | +| ↳ `title` | string | Recording title | +| ↳ `start_datetime` | string | ISO8601 start timestamp | +| ↳ `end_datetime` | string | ISO8601 end timestamp | +| ↳ `duration_ms` | number | Duration in milliseconds | +| ↳ `media_type` | string | audio, transcript, or video | +| ↳ `source` | string | Recording source \(zoom, meet, local_capture, etc.\) | +| ↳ `url` | string | URL to view in Grain | +| ↳ `thumbnail_url` | string | Thumbnail URL \(nullable\) | +| ↳ `tags` | array | Array of tag strings | +| ↳ `teams` | array | Array of team objects | +| ↳ `meeting_type` | object | Meeting type info with id, name, scope \(nullable\) | + + +--- + +### Grain Recording Updated + +Trigger workflow when a recording is updated in Grain + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | data output from the tool | +| ↳ `id` | string | Recording UUID | +| ↳ `title` | string | Recording title | +| ↳ `start_datetime` | string | ISO8601 start timestamp | +| ↳ `end_datetime` | string | ISO8601 end timestamp | +| ↳ `duration_ms` | number | Duration in milliseconds | +| ↳ `media_type` | string | audio, transcript, or video | +| ↳ `source` | string | Recording source \(zoom, meet, local_capture, etc.\) | +| ↳ `url` | string | URL to view in Grain | +| ↳ `thumbnail_url` | string | Thumbnail URL \(nullable\) | +| ↳ `tags` | array | Array of tag strings | +| ↳ `teams` | array | Array of team objects | +| ↳ `meeting_type` | object | Meeting type info with id, name, scope \(nullable\) | + + +--- + +### Grain Story Created + +Trigger workflow when a new story is created in Grain + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Grain. | +| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type | +| `user_id` | string | User UUID who triggered the event | +| `data` | object | data output from the tool | +| ↳ `id` | string | Story UUID | +| ↳ `title` | string | Story title | +| ↳ `url` | string | URL to view in Grain | +| ↳ `created_datetime` | string | ISO8601 creation timestamp | + diff --git a/apps/docs/content/docs/en/tools/granola.mdx b/apps/docs/content/docs/en/integrations/granola.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/granola.mdx rename to apps/docs/content/docs/en/integrations/granola.mdx index 5d3a1030093..d4e35e368ff 100644 --- a/apps/docs/content/docs/en/tools/granola.mdx +++ b/apps/docs/content/docs/en/integrations/granola.mdx @@ -16,7 +16,7 @@ Integrate Granola into your workflow to retrieve meeting notes, summaries, atten -## Tools +## Actions ### `granola_list_notes` diff --git a/apps/docs/content/docs/en/tools/greenhouse.mdx b/apps/docs/content/docs/en/integrations/greenhouse.mdx similarity index 63% rename from apps/docs/content/docs/en/tools/greenhouse.mdx rename to apps/docs/content/docs/en/integrations/greenhouse.mdx index a96605a0325..8f60e2b3d3b 100644 --- a/apps/docs/content/docs/en/tools/greenhouse.mdx +++ b/apps/docs/content/docs/en/integrations/greenhouse.mdx @@ -31,7 +31,7 @@ Integrate Greenhouse into the workflow. List and retrieve candidates, jobs, appl -## Tools +## Actions ### `greenhouse_list_candidates` @@ -504,3 +504,287 @@ Lists all interview stages for a specific job in Greenhouse | `count` | number | Number of stages returned | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Greenhouse Candidate Hired + +Trigger workflow when a candidate is hired + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(hire_candidate\) | +| `payload` | object | payload output from the tool | +| ↳ `application` | object | application output from the tool | +| ↳ `id` | number | Application ID | +| ↳ `status` | string | Application status | +| ↳ `prospect` | boolean | Whether the applicant is a prospect | +| ↳ `applied_at` | string | When the application was submitted | +| ↳ `url` | string | Application URL in Greenhouse | +| ↳ `current_stage` | object | current_stage output from the tool | +| ↳ `id` | number | Current stage ID | +| ↳ `name` | string | Current stage name | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | number | Candidate ID | +| ↳ `first_name` | string | First name | +| ↳ `last_name` | string | Last name | +| ↳ `title` | string | Current title | +| ↳ `company` | string | Current company | +| ↳ `email_addresses` | json | Email addresses | +| ↳ `phone_numbers` | json | Phone numbers | +| ↳ `recruiter` | json | Assigned recruiter | +| ↳ `coordinator` | json | Assigned coordinator | +| ↳ `jobs` | json | Associated jobs \(array\) | +| ↳ `offer` | object | offer output from the tool | +| ↳ `id` | number | Offer ID | +| ↳ `version` | number | Offer version | +| ↳ `starts_at` | string | Offer start date | +| ↳ `custom_fields` | json | Offer custom fields | +| ↳ `custom_fields` | json | Application custom fields | + + +--- + +### Greenhouse Candidate Rejected + +Trigger workflow when a candidate is rejected + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(reject_candidate\) | +| `payload` | object | payload output from the tool | +| ↳ `application` | object | application output from the tool | +| ↳ `id` | number | Application ID | +| ↳ `status` | string | Application status \(rejected\) | +| ↳ `prospect` | boolean | Whether the applicant is a prospect | +| ↳ `applied_at` | string | When the application was submitted | +| ↳ `rejected_at` | string | When the candidate was rejected | +| ↳ `url` | string | Application URL in Greenhouse | +| ↳ `current_stage` | object | current_stage output from the tool | +| ↳ `id` | number | Stage ID where rejected | +| ↳ `name` | string | Stage name where rejected | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | number | Candidate ID | +| ↳ `first_name` | string | First name | +| ↳ `last_name` | string | Last name | +| ↳ `email_addresses` | json | Email addresses | +| ↳ `phone_numbers` | json | Phone numbers | +| ↳ `jobs` | json | Associated jobs \(array\) | +| ↳ `rejection_reason` | json | Rejection reason object with id, name, and type fields | +| ↳ `rejection_details` | json | Rejection details with custom fields | +| ↳ `custom_fields` | json | Application custom fields | + + +--- + +### Greenhouse Candidate Stage Change + +Trigger workflow when a candidate changes interview stages + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(candidate_stage_change\) | +| `payload` | object | payload output from the tool | +| ↳ `application` | object | application output from the tool | +| ↳ `id` | number | Application ID | +| ↳ `status` | string | Application status | +| ↳ `prospect` | boolean | Whether the applicant is a prospect | +| ↳ `applied_at` | string | When the application was submitted | +| ↳ `url` | string | Application URL in Greenhouse | +| ↳ `current_stage` | object | current_stage output from the tool | +| ↳ `id` | number | Current stage ID | +| ↳ `name` | string | Current stage name | +| ↳ `interviews` | json | Interviews in this stage | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | number | Candidate ID | +| ↳ `first_name` | string | First name | +| ↳ `last_name` | string | Last name | +| ↳ `title` | string | Current title | +| ↳ `company` | string | Current company | +| ↳ `email_addresses` | json | Email addresses | +| ↳ `phone_numbers` | json | Phone numbers | +| ↳ `jobs` | json | Associated jobs \(array\) | +| ↳ `custom_fields` | json | Application custom fields | + + +--- + +### Greenhouse Job Created + +Trigger workflow when a new job is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(job_created\) | + + +--- + +### Greenhouse Job Updated + +Trigger workflow when a job is updated + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(job_updated\) | + + +--- + +### Greenhouse New Application + +Trigger workflow when a new application is submitted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(new_candidate_application\) | +| `payload` | object | payload output from the tool | +| ↳ `application` | object | application output from the tool | +| ↳ `id` | number | Application ID | +| ↳ `status` | string | Application status | +| ↳ `prospect` | boolean | Whether the applicant is a prospect | +| ↳ `applied_at` | string | When the application was submitted | +| ↳ `url` | string | Application URL in Greenhouse | +| ↳ `current_stage` | object | current_stage output from the tool | +| ↳ `id` | number | Current stage ID | +| ↳ `name` | string | Current stage name | +| ↳ `candidate` | object | candidate output from the tool | +| ↳ `id` | number | Candidate ID | +| ↳ `first_name` | string | First name | +| ↳ `last_name` | string | Last name | +| ↳ `title` | string | Current title | +| ↳ `company` | string | Current company | +| ↳ `created_at` | string | When the candidate was created | +| ↳ `email_addresses` | json | Email addresses | +| ↳ `phone_numbers` | json | Phone numbers | +| ↳ `tags` | json | Candidate tags | +| ↳ `jobs` | json | Associated jobs \(array\) | +| ↳ `answers` | json | Application question answers | +| ↳ `attachments` | json | Application attachments | +| ↳ `custom_fields` | json | Application custom fields | + + +--- + +### Greenhouse Offer Created + +Trigger workflow when a new offer is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type \(offer_created\) | +| `payload` | object | payload output from the tool | +| ↳ `id` | number | Offer ID | +| ↳ `application_id` | number | Associated application ID | +| ↳ `job_id` | number | Associated job ID | +| ↳ `user_id` | number | User who created the offer | +| ↳ `version` | number | Offer version number | +| ↳ `sent_on` | string | When the offer was sent | +| ↳ `resolved_at` | string | When the offer was resolved | +| ↳ `start_date` | string | Offer start date | +| ↳ `notes` | string | Offer notes | +| ↳ `offer_status` | string | Offer status | +| ↳ `custom_fields` | json | Custom field values | + + +--- + +### Greenhouse Webhook (Endpoint Events) + +Trigger on whichever event types you select for this URL in Greenhouse. Sim does not filter deliveries for this trigger. + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | +| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | +| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | +| `action` | string | The webhook event type | +| `payload` | json | Full event payload | + diff --git a/apps/docs/content/docs/en/tools/greptile.mdx b/apps/docs/content/docs/en/integrations/greptile.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/greptile.mdx rename to apps/docs/content/docs/en/integrations/greptile.mdx index f3014feac5e..e68c1f73d6b 100644 --- a/apps/docs/content/docs/en/tools/greptile.mdx +++ b/apps/docs/content/docs/en/integrations/greptile.mdx @@ -36,7 +36,7 @@ Query and search codebases using natural language with Greptile. Get AI-generate -## Tools +## Actions ### `greptile_query` diff --git a/apps/docs/content/docs/en/tools/hex.mdx b/apps/docs/content/docs/en/integrations/hex.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/hex.mdx rename to apps/docs/content/docs/en/integrations/hex.mdx index 28e2a18647e..e728ab635ff 100644 --- a/apps/docs/content/docs/en/tools/hex.mdx +++ b/apps/docs/content/docs/en/integrations/hex.mdx @@ -38,7 +38,7 @@ Integrate Hex into your workflow. Run projects, check run status, manage collect -## Tools +## Actions ### `hex_cancel_run` diff --git a/apps/docs/content/docs/en/integrations/hubspot-setup.mdx b/apps/docs/content/docs/en/integrations/hubspot-setup.mdx new file mode 100644 index 00000000000..3e6da20567a --- /dev/null +++ b/apps/docs/content/docs/en/integrations/hubspot-setup.mdx @@ -0,0 +1,129 @@ +--- +title: HubSpot setup guide +description: Install, configure, use, and disconnect the Sim HubSpot integration. +pageType: guide +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Image } from '@/components/ui/image' + +Sim connects your HubSpot CRM to AI workflows. Once connected, your workflows can: + +- **Read and write CRM records** — create, look up, search, and update contacts, companies, deals, and tickets from any workflow. +- **React to CRM changes** — start a workflow when a contact, company, deal, or ticket is created or updated in HubSpot. +- **Combine HubSpot with AI steps** — enrich a new contact with an [Agent block](/blocks/agent), route deals with a [Condition](/blocks/condition), or sync records into [Tables](/tables). + +This guide covers installing the integration, connecting a HubSpot account, configuring it in a workflow, and disconnecting or uninstalling it. + +## Before you begin + +You need: + +- A [Sim](https://sim.ai) account and a workspace where you have **Write** or **Admin** permission. +- A HubSpot account. To grant the requested scopes, your HubSpot user needs permission to install apps (typically a super admin). + +## Install the app and connect HubSpot + +1. Log in to Sim, open your workspace, and click **Integrations** in the sidebar. +2. Search for **HubSpot** and open it. + +The Integrations page in Sim, with the sidebar entry, a search box, connected accounts, and featured integrations + +3. The HubSpot page lists its skills and templates. Click **+ Add to Sim** in the top right. + +The HubSpot integration page in Sim with the Add to Sim button in the top right + +4. In the **Connect HubSpot** dialog, enter a **Display name** for the connection (for example "Sales HubSpot"), review the permissions requested, and click **Connect**. + +The Connect HubSpot dialog showing the display name field and the list of permissions requested + +5. You are redirected to HubSpot. Sign in, then choose the HubSpot account you want to connect. + +HubSpot's screen for connecting your Sim account, with sign-in options + +6. Review the requested scopes on HubSpot's approval screen and click **Connect app**. + +{/* VISUAL: screenshot of the HubSpot scope approval screen for the Sim app. */} + +7. You are returned to Sim. The connection appears under **Connected** on the Integrations page. + +You can connect more than one HubSpot account — for example, separate sales and support portals — and choose per workflow which one to use. + +## Configure the app in a workflow + +The fastest start is from the HubSpot page itself: its **skills** (like *upsert-contact*, *create-deal-for-account*, or *triage-support-ticket*) and **templates** add ready-made HubSpot capabilities to your workspace with one click. + +For your own workflows, the integration runs through the **HubSpot block**. + +1. Open a workflow in the editor and add a **HubSpot** block. +2. In the block's **Account** field, select the HubSpot connection you created. +3. Pick an **Operation** — for example *Create Contact*, *Search Deals*, *Update Ticket*, or *List Companies*. +4. Fill in the operation's fields. Reference outputs from earlier blocks with [connection tags](/workflows/connections), like `` or ``. + +{/* VISUAL: screenshot of a HubSpot block configured with an account and the Create Contact operation. */} + +The full list of operations, with every input and output, is on the [HubSpot integration reference](/integrations/hubspot). + +### Start workflows from HubSpot events + +The HubSpot block can also act as a trigger. Toggle **Use as Trigger**, select the connection, and choose which events to watch — contacts, companies, deals, or tickets, created or updated. Sim polls HubSpot for changes and runs the workflow once per changed record, with the record's fields available to downstream blocks. + +Triggers run against your workflow's active [deployment](/deployment), so deploy the workflow to activate them. + +## Use the app + +Once configured, the integration runs automatically: + +- **Workflow actions** run whenever the workflow runs — manually from the editor, on a schedule, from an API call, or from a chat. +- **Triggers** run on their own: when a watched record changes in HubSpot, the workflow starts with that record as input. + +Every run is recorded in [Logs](/logs-debugging), block by block, so you can verify exactly what was read from or written to HubSpot. + +## Disconnect HubSpot from Sim + + +When you disconnect, workflows that use this HubSpot connection will fail at the HubSpot block on their next run, and HubSpot triggers using it stop firing. Data already written to HubSpot or stored in Sim is not affected. + + +1. In Sim, click **Integrations** in the sidebar. +2. Under **Connected**, open your HubSpot connection. +3. Click **Disconnect**, and confirm. + +Disconnecting deletes the stored OAuth tokens. To use HubSpot again later, reconnect and update your workflows to use the new connection. + +## Uninstall the app from HubSpot + +You can also remove Sim from the HubSpot side, which revokes its access entirely: + +1. In HubSpot, go to **Settings → Integrations → Connected apps**. +2. Find **Sim** and choose **Uninstall**. + +See HubSpot's guide to [connecting and uninstalling apps](https://knowledge.hubspot.com/integrations/connect-apps-to-hubspot) for details. Uninstalling revokes Sim's tokens, so connected workflows fail at the HubSpot block until you reinstall and reconnect. Your HubSpot data itself is not changed or deleted. + +## Troubleshooting + +- **A HubSpot block fails with an authorization error.** The connection may have been disconnected or its token revoked. Open **Integrations** in the sidebar, check the connection, and reconnect it. +- **A trigger isn't firing.** Confirm the workflow is deployed, and check [Logs](/logs-debugging) for recent runs. +- **You manage multiple portals.** Connect each HubSpot account separately and pick the right connection per block. + +Need help? Contact [help@sim.ai](mailto:help@sim.ai). diff --git a/apps/docs/content/docs/en/tools/hubspot.mdx b/apps/docs/content/docs/en/integrations/hubspot.mdx similarity index 94% rename from apps/docs/content/docs/en/tools/hubspot.mdx rename to apps/docs/content/docs/en/integrations/hubspot.mdx index 1952ec4f457..f21d38fbeee 100644 --- a/apps/docs/content/docs/en/tools/hubspot.mdx +++ b/apps/docs/content/docs/en/integrations/hubspot.mdx @@ -21,6 +21,8 @@ With the HubSpot integration in Sim, you can: - **Access users**: Retrieve user information from your HubSpot account In Sim, the HubSpot integration enables your agents to interact with your CRM data as part of automated workflows. Agents can qualify leads, enrich contact records, track deals, and synchronize data across your tech stack—enabling intelligent sales and marketing automation. + +New to the integration? Follow the [HubSpot setup guide](/integrations/hubspot-setup) to install it, connect your account, and configure your first workflow. {/* MANUAL-CONTENT-END */} @@ -30,7 +32,7 @@ Integrate HubSpot into your workflow. Manage contacts, companies, deals, tickets -## Tools +## Actions ### `hubspot_get_users` @@ -1417,3 +1419,49 @@ Create a new list in HubSpot. Specify the object type and processing type (MANUA | `success` | boolean | Operation success status | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### HubSpot CRM Trigger + +Triggers when HubSpot CRM records (contacts, companies, deals, tickets, custom objects) are created or updated, or when contacts join a list + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | Connect a HubSpot account so Sim can poll your CRM on your behalf. | +| `objectType` | string | Yes | What you want to watch. | +| `customObjectTypeId` | string | No | HubSpot custom object type ID \(e.g. | +| `listId` | string | No | The HubSpot list to watch for new members. | +| `eventType` | string | No | Created fires once per new record. Updated fires on any modification. Property Changed fires only when the chosen property changes value. | +| `targetPropertyName` | string | No | Fires only when this specific property changes value on a record. | +| `properties` | string | No | Properties to include on each record. Leave empty to use sensible defaults. Sim always includes the timestamps it needs internally. | +| `pipelineId` | string | No | Restrict to a single pipeline. | +| `stageId` | string | No | Restrict to a single stage within the selected pipeline. | +| `ownerId` | string | No | Restrict to records owned by a specific HubSpot user. | +| `filters` | string | No | JSON array of HubSpot search filters, AND-combined. Each item: \{ | +| `maxRecordsPerPoll` | string | No | Soft cap on records emitted per poll \(default 50, max 1000\). Excess rolls over to the next poll. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `objectType` | string | HubSpot object type \(contact, company, deal, ticket, custom object id, or list_membership\) | +| `eventType` | string | Event type \(created, updated, property_changed, or joined\) | +| `objectId` | string | HubSpot ID of the affected record \(or contact id for list memberships\) | +| `occurredAt` | string | ISO timestamp of when the change happened in HubSpot | +| `properties` | json | HubSpot properties on the record as a key-value object \(property internal name → value\). Default keys per object type \(override via "Properties to Fetch"\): Contact → firstname, lastname, email, phone, company, lifecyclestage, hs_lead_status, hubspot_owner_id, createdate, lastmodifieddate. Company → name, domain, industry, lifecyclestage, hubspot_owner_id, createdate, hs_lastmodifieddate. Deal → dealname, amount, dealstage, pipeline, closedate, hubspot_owner_id, createdate, hs_lastmodifieddate. Ticket → subject, content, hs_pipeline, hs_pipeline_stage, hs_ticket_priority, hubspot_owner_id, createdate, hs_lastmodifieddate. Custom and user-requested properties appear keyed by their HubSpot internal name. | +| `createdAt` | string | ISO timestamp when the record was created in HubSpot | +| `updatedAt` | string | ISO timestamp when the record was last updated in HubSpot | +| `archived` | boolean | Whether the record is archived | +| `propertyName` | string | Name of the property that changed \(property_changed events only\) | +| `propertyValue` | string | New value of the changed property \(property_changed events only\) | +| `previousValue` | string | Previous value before the change \(property_changed events only\) | +| `listId` | string | HubSpot list ID \(list_membership events only\) | +| `timestamp` | string | ISO timestamp when Sim emitted the event | + diff --git a/apps/docs/content/docs/en/tools/huggingface.mdx b/apps/docs/content/docs/en/integrations/huggingface.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/huggingface.mdx rename to apps/docs/content/docs/en/integrations/huggingface.mdx index 88b3b09e6c9..dc7181b3c45 100644 --- a/apps/docs/content/docs/en/tools/huggingface.mdx +++ b/apps/docs/content/docs/en/integrations/huggingface.mdx @@ -27,7 +27,7 @@ Integrate Hugging Face into the workflow. Can generate completions using the Hug -## Tools +## Actions ### `huggingface_chat` diff --git a/apps/docs/content/docs/en/tools/hunter.mdx b/apps/docs/content/docs/en/integrations/hunter.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/hunter.mdx rename to apps/docs/content/docs/en/integrations/hunter.mdx index 492edc864ca..88ff25a6381 100644 --- a/apps/docs/content/docs/en/tools/hunter.mdx +++ b/apps/docs/content/docs/en/integrations/hunter.mdx @@ -31,7 +31,7 @@ Integrate Hunter into the workflow. Can search domains, find email addresses, ve -## Tools +## Actions ### `hunter_discover` diff --git a/apps/docs/content/docs/en/tools/iam.mdx b/apps/docs/content/docs/en/integrations/iam.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/iam.mdx rename to apps/docs/content/docs/en/integrations/iam.mdx index 36b3aee42f5..47da12f0acb 100644 --- a/apps/docs/content/docs/en/tools/iam.mdx +++ b/apps/docs/content/docs/en/integrations/iam.mdx @@ -31,7 +31,7 @@ Integrate AWS Identity and Access Management into your workflow. Create and mana -## Tools +## Actions ### `iam_list_users` diff --git a/apps/docs/content/docs/en/tools/identity_center.mdx b/apps/docs/content/docs/en/integrations/identity_center.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/identity_center.mdx rename to apps/docs/content/docs/en/integrations/identity_center.mdx index 4c000e8fe05..9762dd23873 100644 --- a/apps/docs/content/docs/en/tools/identity_center.mdx +++ b/apps/docs/content/docs/en/integrations/identity_center.mdx @@ -33,7 +33,7 @@ Provision and revoke temporary access to AWS accounts via IAM Identity Center (S -## Tools +## Actions ### `identity_center_list_instances` diff --git a/apps/docs/content/docs/en/triggers/imap.mdx b/apps/docs/content/docs/en/integrations/imap.mdx similarity index 56% rename from apps/docs/content/docs/en/triggers/imap.mdx rename to apps/docs/content/docs/en/integrations/imap.mdx index 9ef6e2fb07c..1cdeb54a21c 100644 --- a/apps/docs/content/docs/en/triggers/imap.mdx +++ b/apps/docs/content/docs/en/integrations/imap.mdx @@ -1,6 +1,6 @@ --- title: IMAP -description: Available IMAP triggers for automating workflows +description: IMAP triggers for automating workflows --- import { BlockInfoCard } from "@/components/ui/block-info-card" @@ -10,12 +10,28 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="#6366F1" /> -IMAP provides 1 trigger for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +The IMAP Email trigger allows your Sim workflows to start automatically whenever a new email is received in any mailbox that supports the IMAP protocol. This works with Gmail, Outlook, Yahoo, and most other email providers. + +With the IMAP trigger, you can: + +- **Automate email processing**: Start workflows in real time when new messages arrive in your inbox. +- **Filter by sender, subject, or folder**: Configure your trigger to react only to emails that match certain conditions. +- **Extract and process attachments**: Automatically download and use file attachments in your automated flows. +- **Parse and use email content**: Access the subject, sender, recipients, full body, and other metadata in downstream workflow steps. +- **Integrate with any email provider**: Works with any service that provides standard IMAP access, without vendor lock-in. +- **Trigger on unread, flagged, or custom criteria**: Set up advanced filters for the kinds of emails that start your workflows. + +With Sim, the IMAP integration gives you the power to turn email into an actionable source of automation. Respond to customer inquiries, process notifications, kick off data pipelines, and more—directly from your email inbox, with no manual intervention. +{/* MANUAL-CONTENT-END */} -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + ### IMAP Email Trigger Triggers when new emails are received via IMAP (works with any email provider) diff --git a/apps/docs/content/docs/en/tools/incidentio.mdx b/apps/docs/content/docs/en/integrations/incidentio.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/incidentio.mdx rename to apps/docs/content/docs/en/integrations/incidentio.mdx index 9c97413810e..43c1bf81c60 100644 --- a/apps/docs/content/docs/en/tools/incidentio.mdx +++ b/apps/docs/content/docs/en/integrations/incidentio.mdx @@ -38,7 +38,7 @@ Integrate incident.io into the workflow. Manage incidents, actions, follow-ups, -## Tools +## Actions ### `incidentio_incidents_list` diff --git a/apps/docs/content/docs/en/integrations/index.mdx b/apps/docs/content/docs/en/integrations/index.mdx index 463e664e4cc..a2efe1c7930 100644 --- a/apps/docs/content/docs/en/integrations/index.mdx +++ b/apps/docs/content/docs/en/integrations/index.mdx @@ -1,85 +1,83 @@ --- title: Integrations description: Connect third-party services and OAuth accounts for your workflows +pageType: guide --- import { Callout } from 'fumadocs-ui/components/callout' import { Image } from '@/components/ui/image' import { FAQ } from '@/components/ui/faq' -Integrations are authenticated connections to third-party services like Gmail, Slack, GitHub, Dropbox, and more. Sim handles the OAuth flow, token storage, and automatic token refresh — you connect once and select the account in any block that needs it. +Integrations are authenticated connections to third-party services like Gmail, Slack, GitHub, and HubSpot. Sim handles the OAuth flow, token storage, and automatic token refresh — you connect once and select the account in any block that needs it. You can connect **multiple accounts per service** — for example, two separate Gmail accounts for different workflows. -## Managing Integrations +## The Integrations page -To manage integrations, open your workspace **Settings** and navigate to the **Integrations** tab. +Click **Integrations** in the workspace sidebar. The page shows your **Connected** accounts, a **Featured** list, and a search box covering every available service. Integrations tab showing connected accounts with service icons, names, and Details/Disconnect buttons -The list shows all your connected accounts with the service icon, display name, and provider. Each entry has a **Details** button and a **Disconnect** button. +The page's second tab, **Skills**, holds your workspace's [agent skills](/skills). -## Connecting an Account +Open a service to see what it offers: -Click **+ Connect** in the top right to open the connection modal. +- **Skills** — ready-made capabilities you add with one click, like *upsert-contact* for HubSpot. +- **Templates** — starter workflows built around the service. +- **+ Add to Sim** — connects your account. Connect Integration modal showing a searchable list of available services -Search for or select the service you want to connect, then fill in the connection details: +## Connecting an account + +1. Open the service's page and click **+ Add to Sim**. +2. Enter a **Display name** to identify this connection (e.g. "Work Gmail" or "Sales HubSpot"), and optionally a **Description**. +3. Review the **Permissions requested** — these are the scopes Sim will ask the provider for. +4. Click **Connect** and complete the provider's sign-in and approval flow. Connect Gmail modal showing permissions requested, display name field, and description field -1. Review the **Permissions requested** — these are the scopes Sim will request from the provider -2. Enter a **Display name** to identify this connection (e.g. "Work Gmail" or "Marketing Slack") -3. Optionally add a **Description** -4. Click **Connect** and complete the authorization flow +When the provider redirects you back, the connection appears under **Connected**. -## Using Integrations in Workflows +## Using integrations in workflows -Blocks that require authentication (e.g. Gmail, Slack, Google Sheets) display a credential selector. Select the connected account you want that block to use. +Blocks that require authentication (e.g. Gmail, Slack, HubSpot) display an account selector. Select the connected account you want that block to use. Gmail block showing the account selector dropdown with connected accounts -You can also connect additional accounts directly from the block by selecting **Connect another [service] account** at the bottom of the dropdown. +You can also connect another account directly from the block by selecting **Connect another [service] account** at the bottom of the dropdown. If a block requires an integration and none is selected, the workflow will fail at that step. -## Using a Credential ID +## Using a credential ID -Each integration has a unique credential ID you can use to reference it dynamically. This is useful when you have multiple accounts for the same service and want to switch between them programmatically — for example, routing different workflow runs to different Gmail accounts based on a variable. +Each connection has a unique credential ID you can use to reference it dynamically. This is useful when you have multiple accounts for the same service and want to switch between them programmatically — for example, routing different workflow runs to different Gmail accounts based on a variable. -To copy a credential ID, open **Details** on any integration and click the clipboard icon next to the Display Name. +To copy a credential ID, open the connection from the **Connected** list and use the copy control next to its name. -Integration details showing the Copy credential ID tooltip on the clipboard icon next to the Display Name - -In any block that requires an integration, click **Switch to manual ID** next to the credential selector to switch from the dropdown to a text field. +In any block that requires an integration, click **Switch to manual ID** next to the account selector to switch from the dropdown to a text field. -## Integration Details +## Managing a connection -Click **Details** on any integration to open its detail view. +Open a connection from the **Connected** list to manage it: -Integration details view showing Display Name, Description, Members, Reconnect, and Disconnect +{/* VISUAL: the connection detail view in the new Integrations page — display name, members, reconnect, disconnect. */} -From here you can: - -- Edit the **Display Name** and **Description** -- Manage **Members** — invite teammates by email and assign them an **Admin** or **Member** role -- **Reconnect** — re-authorize the connection if it has expired or if you need to update permissions -- **Disconnect** — remove the integration entirely - -Click **Save** to apply changes, or **Back** to return to the list. +- Edit the **Display name** and **Description**. +- Manage **Members** — invite teammates and assign them an **Admin** or **Member** role. Admins can edit, reconnect, disconnect, and manage access; Members can use the connection in workflows. When you connect an account, you are its Admin. +- **Reconnect** — re-authorize if the connection expired or you need updated permissions. +- **Disconnect** — remove the connection entirely. If you disconnect an integration that is used in a workflow, that workflow will fail at any block referencing it. Update blocks before disconnecting. -## Access Control - -Each integration has role-based access: +## Email polling groups -- **Admin** — can view, edit, disconnect, reconnect, and manage member access -- **Member** — can use the integration in workflows (read-only) +The Gmail and Outlook email triggers can watch several team members' inboxes through a single trigger, called an **email polling group** (Team and Enterprise plans). An admin creates a group under **Settings → Email Polling**, picks Gmail or Outlook, and invites members by email; each invitee connects their own inbox through a link. On an email trigger, select the group from the credentials dropdown instead of a single account, and the trigger routes everyone's mail through the workflow. -When you connect an integration, you are automatically set as its Admin. You can share it with teammates from the Details view. +Inviting someone to a group grants inbox access for that trigger only, which is separate from workspace membership. diff --git a/apps/docs/content/docs/en/tools/infisical.mdx b/apps/docs/content/docs/en/integrations/infisical.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/infisical.mdx rename to apps/docs/content/docs/en/integrations/infisical.mdx index 63ceedb50ff..912361c25d0 100644 --- a/apps/docs/content/docs/en/tools/infisical.mdx +++ b/apps/docs/content/docs/en/integrations/infisical.mdx @@ -31,7 +31,7 @@ Integrate Infisical into your workflow. List, get, create, update, and delete se -## Tools +## Actions ### `infisical_list_secrets` diff --git a/apps/docs/content/docs/en/tools/instantly.mdx b/apps/docs/content/docs/en/integrations/instantly.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/instantly.mdx rename to apps/docs/content/docs/en/integrations/instantly.mdx index dc932a0cd25..7ed15ea7aef 100644 --- a/apps/docs/content/docs/en/tools/instantly.mdx +++ b/apps/docs/content/docs/en/integrations/instantly.mdx @@ -16,7 +16,7 @@ Integrate Instantly API V2 into workflows. Create and list leads, manage lead in -## Tools +## Actions ### `instantly_list_leads` diff --git a/apps/docs/content/docs/en/tools/intercom.mdx b/apps/docs/content/docs/en/integrations/intercom.mdx similarity index 91% rename from apps/docs/content/docs/en/tools/intercom.mdx rename to apps/docs/content/docs/en/integrations/intercom.mdx index 67a764e3bd8..d7616665d57 100644 --- a/apps/docs/content/docs/en/tools/intercom.mdx +++ b/apps/docs/content/docs/en/integrations/intercom.mdx @@ -33,7 +33,7 @@ Integrate Intercom into the workflow. Can create, get, update, list, search, and -## Tools +## Actions ### `intercom_create_contact` @@ -1088,3 +1088,155 @@ Remove a contact from a company in Intercom | `name` | string | Name of the company | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Intercom Contact Created + +Trigger workflow when a new lead is created in Intercom + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + + +--- + +### Intercom Conversation Closed + +Trigger workflow when a conversation is closed in Intercom + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + + +--- + +### Intercom Conversation Created + +Trigger workflow when a new conversation is created in Intercom + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + + +--- + +### Intercom Conversation Reply + +Trigger workflow when someone replies to an Intercom conversation + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + + +--- + +### Intercom User Created + +Trigger workflow when a new user is created in Intercom + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + + +--- + +### Intercom Webhook (All Events) + +Trigger workflow on any Intercom webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Your app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | +| `id` | string | Unique notification ID | +| `app_id` | string | Your Intercom app ID | +| `created_at` | number | Unix timestamp when the event occurred | +| `delivery_attempts` | number | Number of delivery attempts for this notification | +| `first_sent_at` | number | Unix timestamp of first delivery attempt | +| `data` | json | data output from the tool | + diff --git a/apps/docs/content/docs/en/tools/jina.mdx b/apps/docs/content/docs/en/integrations/jina.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/jina.mdx rename to apps/docs/content/docs/en/integrations/jina.mdx index d04cf7d71a6..0841a28ff38 100644 --- a/apps/docs/content/docs/en/tools/jina.mdx +++ b/apps/docs/content/docs/en/integrations/jina.mdx @@ -33,7 +33,7 @@ Integrate Jina AI into the workflow. Search the web and get LLM-friendly results -## Tools +## Actions ### `jina_read_url` diff --git a/apps/docs/content/docs/en/tools/jira.mdx b/apps/docs/content/docs/en/integrations/jira.mdx similarity index 50% rename from apps/docs/content/docs/en/tools/jira.mdx rename to apps/docs/content/docs/en/integrations/jira.mdx index 6df2f92b602..86ba0172594 100644 --- a/apps/docs/content/docs/en/tools/jira.mdx +++ b/apps/docs/content/docs/en/integrations/jira.mdx @@ -36,7 +36,7 @@ Integrate Jira into the workflow. Can read, write, and update issues. Can also t -## Tools +## Actions ### `jira_retrieve` @@ -1047,3 +1047,968 @@ Search for Jira users by email address or display name. Returns matching users w | `maxResults` | number | Maximum results per page | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Jira Comment Deleted + +Trigger workflow when a comment is deleted from a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which comment deletions trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the comment | +| ↳ `accountId` | string | Account ID of the user who last updated the comment | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | +| ↳ `self` | string | REST API URL for this comment | + + +--- + +### Jira Comment Updated + +Trigger workflow when a comment is updated on a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which comment updates trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the comment | +| ↳ `accountId` | string | Account ID of the user who last updated the comment | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | +| ↳ `self` | string | REST API URL for this comment | + + +--- + +### Jira Issue Commented + +Trigger workflow when a comment is added to a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which issue comments trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the comment | +| ↳ `accountId` | string | Account ID of the user who last updated the comment | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | +| ↳ `self` | string | REST API URL for this comment | + + +--- + +### Jira Issue Created + +Trigger workflow when a new issue is created in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which issues trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | + + +--- + +### Jira Issue Deleted + +Trigger workflow when an issue is deleted in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which issue deletions trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | + + +--- + +### Jira Issue Updated + +Trigger workflow when an issue is updated in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which issue updates trigger this workflow using JQL | +| `fieldFilters` | string | No | Comma-separated list of fields to monitor. Only trigger when these fields change. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | +| `changelog` | object | changelog output from the tool | +| ↳ `id` | string | Changelog ID | + + +--- + +### Jira Project Created + +Trigger workflow when a project is created in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(project_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `self` | string | REST API URL for this project | +| ↳ `projectTypeKey` | string | Project type \(e.g., software, business\) | +| ↳ `lead` | object | lead output from the tool | +| ↳ `displayName` | string | Project lead display name | +| ↳ `accountId` | string | Project lead account ID | + + +--- + +### Jira Sprint Closed + +Trigger workflow when a sprint is closed in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `sprint` | object | sprint output from the tool | +| ↳ `id` | number | Sprint ID | +| ↳ `self` | string | REST API URL for this sprint | +| ↳ `state` | string | Sprint state \(future, active, closed\) | +| ↳ `name` | string | Sprint name | +| ↳ `startDate` | string | Sprint start date \(ISO format\) | +| ↳ `endDate` | string | Sprint end date \(ISO format\) | +| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | +| ↳ `originBoardId` | number | Board ID the sprint belongs to | +| ↳ `goal` | string | Sprint goal | +| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | + + +--- + +### Jira Sprint Created + +Trigger workflow when a sprint is created in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `sprint` | object | sprint output from the tool | +| ↳ `id` | number | Sprint ID | +| ↳ `self` | string | REST API URL for this sprint | +| ↳ `state` | string | Sprint state \(future, active, closed\) | +| ↳ `name` | string | Sprint name | +| ↳ `startDate` | string | Sprint start date \(ISO format\) | +| ↳ `endDate` | string | Sprint end date \(ISO format\) | +| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | +| ↳ `originBoardId` | number | Board ID the sprint belongs to | +| ↳ `goal` | string | Sprint goal | +| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | + + +--- + +### Jira Sprint Started + +Trigger workflow when a sprint is started in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `sprint` | object | sprint output from the tool | +| ↳ `id` | number | Sprint ID | +| ↳ `self` | string | REST API URL for this sprint | +| ↳ `state` | string | Sprint state \(future, active, closed\) | +| ↳ `name` | string | Sprint name | +| ↳ `startDate` | string | Sprint start date \(ISO format\) | +| ↳ `endDate` | string | Sprint end date \(ISO format\) | +| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | +| ↳ `originBoardId` | number | Board ID the sprint belongs to | +| ↳ `goal` | string | Sprint goal | +| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | + + +--- + +### Jira Version Released + +Trigger workflow when a version is released in Jira + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(jira:version_released\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `version` | object | version output from the tool | +| ↳ `id` | string | Version ID | +| ↳ `name` | string | Version name | +| ↳ `self` | string | REST API URL for this version | +| ↳ `released` | boolean | Whether the version is released | +| ↳ `releaseDate` | string | Release date \(ISO format\) | +| ↳ `projectId` | number | Project ID the version belongs to | +| ↳ `description` | string | Version description | +| ↳ `archived` | boolean | Whether the version is archived | + + +--- + +### Jira Webhook (All Events) + +Trigger workflow on any Jira webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `changelog` | object | changelog output from the tool | +| ↳ `id` | string | Changelog ID | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | string | Comment text/body | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | +| `worklog` | object | worklog output from the tool | +| ↳ `id` | string | Worklog entry ID | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Worklog author display name | +| ↳ `accountId` | string | Worklog author account ID | +| ↳ `emailAddress` | string | Worklog author email address | +| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | +| ↳ `timeSpentSeconds` | number | Time spent in seconds | +| ↳ `comment` | string | Worklog comment/description | +| ↳ `started` | string | When the work was started \(ISO format\) | + + +--- + +### Jira Worklog Created + +Trigger workflow when time is logged on a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which worklog entries trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `worklog` | object | worklog output from the tool | +| ↳ `id` | string | Worklog entry ID | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Worklog author display name | +| ↳ `accountId` | string | Worklog author account ID | +| ↳ `emailAddress` | string | Worklog author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the worklog | +| ↳ `accountId` | string | Account ID of the user who last updated the worklog | +| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | +| ↳ `timeSpentSeconds` | number | Time spent in seconds | +| ↳ `comment` | string | Worklog comment/description | +| ↳ `started` | string | When the work was started \(ISO format\) | +| ↳ `created` | string | When the worklog entry was created \(ISO format\) | +| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | +| ↳ `issueId` | string | ID of the issue this worklog belongs to | +| ↳ `self` | string | REST API URL for this worklog entry | + + +--- + +### Jira Worklog Deleted + +Trigger workflow when a worklog entry is deleted from a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which worklog deletions trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `worklog` | object | worklog output from the tool | +| ↳ `id` | string | Worklog entry ID | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Worklog author display name | +| ↳ `accountId` | string | Worklog author account ID | +| ↳ `emailAddress` | string | Worklog author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the worklog | +| ↳ `accountId` | string | Account ID of the user who last updated the worklog | +| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | +| ↳ `timeSpentSeconds` | number | Time spent in seconds | +| ↳ `comment` | string | Worklog comment/description | +| ↳ `started` | string | When the work was started \(ISO format\) | +| ↳ `created` | string | When the worklog entry was created \(ISO format\) | +| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | +| ↳ `issueId` | string | ID of the issue this worklog belongs to | +| ↳ `self` | string | REST API URL for this worklog entry | + + +--- + +### Jira Worklog Updated + +Trigger workflow when a worklog entry is updated on a Jira issue + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which worklog updates trigger this workflow using JQL | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| ↳ `emailAddress` | string | Email address of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `votes` | json | Votes on this issue | +| ↳ `labels` | array | Array of labels applied to this issue | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `created` | string | Issue creation date \(ISO format\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `duedate` | string | Due date for the issue | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `summary` | string | Issue summary/title | +| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `watches` | json | Watchers information | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `progress` | json | Progress tracking information | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `security` | string | Security level | +| ↳ `subtasks` | array | Array of subtask objects | +| ↳ `versions` | array | Array of affected versions | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name | +| ↳ `id` | string | Issue type ID | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| ↳ `components` | array | Array of component objects associated with this issue | +| ↳ `fixVersions` | array | Array of fix version objects for this issue | +| `worklog` | object | worklog output from the tool | +| ↳ `id` | string | Worklog entry ID | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Worklog author display name | +| ↳ `accountId` | string | Worklog author account ID | +| ↳ `emailAddress` | string | Worklog author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the worklog | +| ↳ `accountId` | string | Account ID of the user who last updated the worklog | +| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | +| ↳ `timeSpentSeconds` | number | Time spent in seconds | +| ↳ `comment` | string | Worklog comment/description | +| ↳ `started` | string | When the work was started \(ISO format\) | +| ↳ `created` | string | When the worklog entry was created \(ISO format\) | +| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | +| ↳ `issueId` | string | ID of the issue this worklog belongs to | +| ↳ `self` | string | REST API URL for this worklog entry | + diff --git a/apps/docs/content/docs/en/tools/jira_service_management.mdx b/apps/docs/content/docs/en/integrations/jira_service_management.mdx similarity index 72% rename from apps/docs/content/docs/en/tools/jira_service_management.mdx rename to apps/docs/content/docs/en/integrations/jira_service_management.mdx index efd1ca28a4f..46440071f19 100644 --- a/apps/docs/content/docs/en/tools/jira_service_management.mdx +++ b/apps/docs/content/docs/en/integrations/jira_service_management.mdx @@ -34,7 +34,7 @@ Integrate with Jira Service Management for IT service management. Create and man -## Tools +## Actions ### `jsm_get_service_desks` @@ -989,3 +989,306 @@ Copy forms from one Jira issue to another | `errors` | json | Array of errors encountered during copy | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### JSM Request Commented + +Trigger workflow when a comment is added to a Jira Service Management request + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Issue key \(e.g., SD-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `summary` | string | Request summary/title | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Current status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | +| ↳ `id` | string | Issue type ID | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `created` | string | Request creation date \(ISO format\) | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `duedate` | string | Due date for the request | +| ↳ `labels` | array | Array of labels applied to this request | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `updateAuthor` | object | updateAuthor output from the tool | +| ↳ `displayName` | string | Display name of the user who last updated the comment | +| ↳ `accountId` | string | Account ID of the user who last updated the comment | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | + + +--- + +### JSM Request Created + +Trigger workflow when a new service request is created in Jira Service Management + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Issue key \(e.g., SD-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `summary` | string | Request summary/title | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Current status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | +| ↳ `id` | string | Issue type ID | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `created` | string | Request creation date \(ISO format\) | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `duedate` | string | Due date for the request | +| ↳ `labels` | array | Array of labels applied to this request | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| `issue_event_type_name` | string | Issue event type name from Jira | + + +--- + +### JSM Request Resolved + +Trigger workflow when a service request is resolved in Jira Service Management + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Issue key \(e.g., SD-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `summary` | string | Request summary/title | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Current status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | +| ↳ `id` | string | Issue type ID | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `created` | string | Request creation date \(ISO format\) | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `duedate` | string | Due date for the request | +| ↳ `labels` | array | Array of labels applied to this request | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| `issue_event_type_name` | string | Issue event type name from Jira | +| `changelog` | object | changelog output from the tool | +| ↳ `id` | string | Changelog ID | + + +--- + +### JSM Request Updated + +Trigger workflow when a service request is updated in Jira Service Management + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | +| `timestamp` | number | Timestamp of the webhook event | +| `user` | object | user output from the tool | +| ↳ `displayName` | string | Display name of the user who triggered the event | +| ↳ `accountId` | string | Account ID of the user who triggered the event | +| `issue` | object | issue output from the tool | +| ↳ `id` | string | Jira issue ID | +| ↳ `key` | string | Issue key \(e.g., SD-123\) | +| ↳ `self` | string | REST API URL for this issue | +| ↳ `fields` | object | fields output from the tool | +| ↳ `summary` | string | Request summary/title | +| ↳ `status` | object | status output from the tool | +| ↳ `name` | string | Current status name | +| ↳ `id` | string | Status ID | +| ↳ `statusCategory` | json | Status category information | +| ↳ `priority` | object | priority output from the tool | +| ↳ `name` | string | Priority name | +| ↳ `id` | string | Priority ID | +| ↳ `issuetype` | object | issuetype output from the tool | +| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | +| ↳ `id` | string | Issue type ID | +| ↳ `project` | object | project output from the tool | +| ↳ `key` | string | Project key | +| ↳ `name` | string | Project name | +| ↳ `id` | string | Project ID | +| ↳ `reporter` | object | reporter output from the tool | +| ↳ `displayName` | string | Reporter display name | +| ↳ `accountId` | string | Reporter account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `assignee` | object | assignee output from the tool | +| ↳ `displayName` | string | Assignee display name | +| ↳ `accountId` | string | Assignee account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `creator` | object | creator output from the tool | +| ↳ `displayName` | string | Creator display name | +| ↳ `accountId` | string | Creator account ID | +| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | +| ↳ `created` | string | Request creation date \(ISO format\) | +| ↳ `updated` | string | Last updated date \(ISO format\) | +| ↳ `duedate` | string | Due date for the request | +| ↳ `labels` | array | Array of labels applied to this request | +| ↳ `resolution` | object | resolution output from the tool | +| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | +| ↳ `id` | string | Resolution ID | +| `issue_event_type_name` | string | Issue event type name from Jira | +| `changelog` | object | changelog output from the tool | +| ↳ `id` | string | Changelog ID | + + +--- + +### JSM Webhook (All Events) + +Trigger workflow on any Jira Service Management webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | +| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `changelog` | object | changelog output from the tool | +| ↳ `id` | string | Changelog ID | +| `comment` | object | comment output from the tool | +| ↳ `id` | string | Comment ID | +| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | +| ↳ `author` | object | author output from the tool | +| ↳ `displayName` | string | Comment author display name | +| ↳ `accountId` | string | Comment author account ID | +| ↳ `emailAddress` | string | Comment author email address | +| ↳ `created` | string | Comment creation date \(ISO format\) | +| ↳ `updated` | string | Comment last updated date \(ISO format\) | + diff --git a/apps/docs/content/docs/en/tools/kalshi.mdx b/apps/docs/content/docs/en/integrations/kalshi.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/kalshi.mdx rename to apps/docs/content/docs/en/integrations/kalshi.mdx index c482b3c1bda..e780c20b4d3 100644 --- a/apps/docs/content/docs/en/tools/kalshi.mdx +++ b/apps/docs/content/docs/en/integrations/kalshi.mdx @@ -32,7 +32,7 @@ Integrate Kalshi prediction markets into the workflow. Can get markets, market, -## Tools +## Actions ### `kalshi_get_markets` diff --git a/apps/docs/content/docs/en/tools/ketch.mdx b/apps/docs/content/docs/en/integrations/ketch.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/ketch.mdx rename to apps/docs/content/docs/en/integrations/ketch.mdx index 145fec7ddbb..b2fe393695f 100644 --- a/apps/docs/content/docs/en/tools/ketch.mdx +++ b/apps/docs/content/docs/en/integrations/ketch.mdx @@ -32,7 +32,7 @@ Integrate Ketch into the workflow. Retrieve and update consent preferences, mana -## Tools +## Actions ### `ketch_get_consent` diff --git a/apps/docs/content/docs/en/blocks/knowledge.mdx b/apps/docs/content/docs/en/integrations/knowledge.mdx similarity index 98% rename from apps/docs/content/docs/en/blocks/knowledge.mdx rename to apps/docs/content/docs/en/integrations/knowledge.mdx index 40da7b3f0e3..d5493b4bb8c 100644 --- a/apps/docs/content/docs/en/blocks/knowledge.mdx +++ b/apps/docs/content/docs/en/integrations/knowledge.mdx @@ -29,7 +29,7 @@ Integrate Knowledge into the workflow. Perform full CRUD operations on documents -## Tools +## Actions ### `knowledge_search` @@ -43,10 +43,6 @@ Search for similar content in a knowledge base using vector similarity | `query` | string | No | Search query text \(optional when using tag filters\) | | `topK` | number | No | Number of most similar results to return \(1-100\) | | `tagFilters` | array | No | Array of tag filters with tagName and tagValue properties | -| `items` | object | No | No description | -| `properties` | string | No | No description | -| `tagName` | string | No | No description | -| `tagValue` | string | No | No description | | `rerankerEnabled` | boolean | No | Whether to apply Cohere reranking to vector search results | | `rerankerModel` | string | No | Cohere rerank model to use \(one of: rerank-v4.0-pro, rerank-v4.0-fast, rerank-v3.5\) | | `rerankerInputCount` | number | No | Number of vector results sent to the Cohere reranker \(1–100\). Defaults to topK × 4 capped at 100. | diff --git a/apps/docs/content/docs/en/tools/langsmith.mdx b/apps/docs/content/docs/en/integrations/langsmith.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/langsmith.mdx rename to apps/docs/content/docs/en/integrations/langsmith.mdx index 3ba86a6b1f1..caf4577f8a8 100644 --- a/apps/docs/content/docs/en/tools/langsmith.mdx +++ b/apps/docs/content/docs/en/integrations/langsmith.mdx @@ -33,7 +33,7 @@ Send run data to LangSmith to trace executions, attach metadata, and monitor wor -## Tools +## Actions ### `langsmith_create_run` diff --git a/apps/docs/content/docs/en/tools/launchdarkly.mdx b/apps/docs/content/docs/en/integrations/launchdarkly.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/launchdarkly.mdx rename to apps/docs/content/docs/en/integrations/launchdarkly.mdx index 121765bd9e5..27cc716cc98 100644 --- a/apps/docs/content/docs/en/tools/launchdarkly.mdx +++ b/apps/docs/content/docs/en/integrations/launchdarkly.mdx @@ -40,7 +40,7 @@ Integrate LaunchDarkly into your workflow. List, create, update, toggle, and del -## Tools +## Actions ### `launchdarkly_create_flag` diff --git a/apps/docs/content/docs/en/triggers/lemlist.mdx b/apps/docs/content/docs/en/integrations/lemlist.mdx similarity index 74% rename from apps/docs/content/docs/en/triggers/lemlist.mdx rename to apps/docs/content/docs/en/integrations/lemlist.mdx index 1af50a5d6d0..02f2f8fdbda 100644 --- a/apps/docs/content/docs/en/triggers/lemlist.mdx +++ b/apps/docs/content/docs/en/integrations/lemlist.mdx @@ -1,19 +1,128 @@ --- title: Lemlist -description: Available Lemlist triggers for automating workflows +description: Manage outreach activities, leads, and send emails via Lemlist --- import { BlockInfoCard } from "@/components/ui/block-info-card" - -Lemlist provides 9 triggers for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +Supercharge your sales outreach and engagement with [Lemlist](https://lemlist.com) – the personalized outreach automation platform trusted by thousands of sales teams. With Lemlist, you can automate multi-channel campaigns, nurture leads, and boost reply rates, all while keeping your communication highly personalized and authentic. + +With the Lemlist integration, you can: + +- **Automate outreach sequences:** Launch personalized email, LinkedIn, and calling campaigns at scale, tailored to each recipient. +- **Track campaign activity:** Instantly monitor opens, clicks, replies, bounces, and every lead interaction for granular campaign insights. +- **Centralize engagement data:** Fetch real-time activity and replies for each campaign or lead, and sync it directly into your workflow automation. +- **Get lead details automatically:** Retrieve enriched lead information by email or ID to keep your CRM and processes up to date without manual data entry. +- **Send targeted emails from your inbox:** Trigger bespoke emails to leads directly from the workflow, using up-to-date templates and data. +- **Boost team collaboration and follow-up:** Assign leads, track outcomes, and ensure no prospect is lost thanks to Lemlist’s built-in tools—all accessible via automation. + +Lemlist empowers sales, marketing, and outbound teams to save time, personalize at scale, and convert more prospects. Automate and optimize your campaigns, integrate with your stack, and never miss a valuable opportunity. + +Drive more replies, book more meetings, and grow your pipeline by connecting Lemlist to your automated workflows today! +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate Lemlist into your workflow. Retrieve campaign activities and replies, get lead information, and send emails through the Lemlist inbox. + + + +## Actions + +### `lemlist_get_activities` + +Retrieves campaign activities and steps performed, including email opens, clicks, replies, and other events. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Lemlist API key | +| `type` | string | No | Filter by activity type \(e.g., emailOpened, emailClicked, emailReplied, paused\) | +| `campaignId` | string | No | Filter by campaign ID \(e.g., "cam_abc123def456"\) | +| `leadId` | string | No | Filter by lead ID \(e.g., "lea_abc123def456"\) | +| `isFirst` | boolean | No | Filter for first activity only | +| `limit` | number | No | Number of results per request \(e.g., 50\). Max 100, default 100 | +| `offset` | number | No | Number of records to skip for pagination \(e.g., 0, 100, 200\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `activities` | array | List of activities | +| ↳ `_id` | string | Activity ID | +| ↳ `type` | string | Activity type | +| ↳ `leadId` | string | Associated lead ID | +| ↳ `campaignId` | string | Campaign ID | +| ↳ `sequenceId` | string | Sequence ID | +| ↳ `stepId` | string | Step ID | +| ↳ `createdAt` | string | When the activity occurred | +| `count` | number | Number of activities returned | + +### `lemlist_get_lead` + +Retrieves lead information by email address or lead ID. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Lemlist API key | +| `leadIdentifier` | string | Yes | Lead email address \(e.g., "john@example.com"\) or lead ID \(e.g., "lea_abc123def456"\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `_id` | string | Lead ID | +| `email` | string | Lead email address | +| `firstName` | string | Lead first name | +| `lastName` | string | Lead last name | +| `companyName` | string | Company name | +| `jobTitle` | string | Job title | +| `companyDomain` | string | Company domain | +| `isPaused` | boolean | Whether the lead is paused | +| `campaignId` | string | Campaign ID the lead belongs to | +| `contactId` | string | Contact ID | +| `emailStatus` | string | Email deliverability status | + +### `lemlist_send_email` + +Sends an email to a contact through the Lemlist inbox. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Lemlist API key | +| `sendUserId` | string | Yes | Identifier for the user sending the message \(e.g., "usr_abc123def456"\) | +| `sendUserEmail` | string | Yes | Email address of the sender \(e.g., "sales@company.com"\) | +| `sendUserMailboxId` | string | Yes | Mailbox identifier for the sender \(e.g., "mbx_abc123def456"\) | +| `contactId` | string | Yes | Recipient contact identifier \(e.g., "con_abc123def456"\) | +| `leadId` | string | Yes | Associated lead identifier \(e.g., "lea_abc123def456"\) | +| `subject` | string | Yes | Email subject line | +| `message` | string | Yes | Email message body in HTML format | +| `cc` | json | No | Array of CC email addresses | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `ok` | boolean | Whether the email was sent successfully | + + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### Lemlist Email Bounced Trigger workflow when an email bounces diff --git a/apps/docs/content/docs/en/tools/linear.mdx b/apps/docs/content/docs/en/integrations/linear.mdx similarity index 94% rename from apps/docs/content/docs/en/tools/linear.mdx rename to apps/docs/content/docs/en/integrations/linear.mdx index 9a23938192e..039caefb9bc 100644 --- a/apps/docs/content/docs/en/tools/linear.mdx +++ b/apps/docs/content/docs/en/integrations/linear.mdx @@ -35,7 +35,7 @@ Integrate Linear into the workflow. Can manage issues, comments, projects, label -## Tools +## Actions ### `linear_read_issues` @@ -2173,3 +2173,229 @@ List all project statuses in Linear | ↳ `archivedAt` | string | Archive timestamp \(ISO 8601\) | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Linear Comment Created + +Trigger workflow when a new comment is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Comment Updated + +Trigger workflow when a comment is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Customer Request Created + +Trigger workflow when a new customer request is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Customer Request Updated + +Trigger workflow when a customer request is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Cycle Created + +Trigger workflow when a new cycle is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Cycle Updated + +Trigger workflow when a cycle is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Issue Created + +Trigger workflow when a new issue is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Issue Removed + +Trigger workflow when an issue is removed/deleted in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Issue Updated + +Trigger workflow when an issue is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Label Created + +Trigger workflow when a new label is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Label Updated + +Trigger workflow when a label is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Project Created + +Trigger workflow when a new project is created in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Project Update Created + +Trigger workflow when a new project update is posted in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Project Updated + +Trigger workflow when a project is updated in Linear + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + + +--- + +### Linear Webhook + +Trigger workflow from Linear events you select when creating the webhook in Linear (not guaranteed to be every model or event type). + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | API Key | +| `teamId` | string | No | Team ID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `action` | string | Action performed \(create, update, remove\) | +| `type` | string | Entity type \(Issue, Comment, Project, Cycle, IssueLabel, ProjectUpdate, etc.\) | +| `webhookId` | string | Webhook ID | +| `webhookTimestamp` | number | Webhook timestamp \(milliseconds\) | +| `organizationId` | string | Organization ID | +| `createdAt` | string | Event creation timestamp | +| `url` | string | URL of the subject entity in Linear \(top-level webhook payload\) | +| `data` | object | Complete entity data object | +| `updatedFrom` | object | Previous values for changed fields \(only present on update\) | + diff --git a/apps/docs/content/docs/en/tools/linkedin.mdx b/apps/docs/content/docs/en/integrations/linkedin.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/linkedin.mdx rename to apps/docs/content/docs/en/integrations/linkedin.mdx index 6e692833403..1b9ef8afbfa 100644 --- a/apps/docs/content/docs/en/tools/linkedin.mdx +++ b/apps/docs/content/docs/en/integrations/linkedin.mdx @@ -30,7 +30,7 @@ Integrate LinkedIn into workflows. Share posts to your personal feed and access -## Tools +## Actions ### `linkedin_share_post` diff --git a/apps/docs/content/docs/en/tools/linkup.mdx b/apps/docs/content/docs/en/integrations/linkup.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/linkup.mdx rename to apps/docs/content/docs/en/integrations/linkup.mdx index 29d7d04dfd3..2ea9d4c7ae0 100644 --- a/apps/docs/content/docs/en/tools/linkup.mdx +++ b/apps/docs/content/docs/en/integrations/linkup.mdx @@ -30,7 +30,7 @@ Integrate Linkup into the workflow. Can search the web. -## Tools +## Actions ### `linkup_search` diff --git a/apps/docs/content/docs/en/tools/linq.mdx b/apps/docs/content/docs/en/integrations/linq.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/linq.mdx rename to apps/docs/content/docs/en/integrations/linq.mdx index 3bb5f0994e5..82ad460cfe1 100644 --- a/apps/docs/content/docs/en/tools/linq.mdx +++ b/apps/docs/content/docs/en/integrations/linq.mdx @@ -38,7 +38,7 @@ Reach people on iMessage, SMS, and RCS through Linq. Start chats, send messages -## Tools +## Actions ### `linq_add_participant` diff --git a/apps/docs/content/docs/en/tools/loops.mdx b/apps/docs/content/docs/en/integrations/loops.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/loops.mdx rename to apps/docs/content/docs/en/integrations/loops.mdx index aa45836d20a..98b1df23c2f 100644 --- a/apps/docs/content/docs/en/tools/loops.mdx +++ b/apps/docs/content/docs/en/integrations/loops.mdx @@ -40,7 +40,7 @@ Integrate Loops into the workflow. Create and manage contacts, send transactiona -## Tools +## Actions ### `loops_create_contact` diff --git a/apps/docs/content/docs/en/tools/luma.mdx b/apps/docs/content/docs/en/integrations/luma.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/luma.mdx rename to apps/docs/content/docs/en/integrations/luma.mdx index 23df00951fc..3abc9db2a2d 100644 --- a/apps/docs/content/docs/en/tools/luma.mdx +++ b/apps/docs/content/docs/en/integrations/luma.mdx @@ -34,7 +34,7 @@ Integrate Luma into the workflow. Can create, update, look up, and cancel events -## Tools +## Actions ### `luma_get_event` diff --git a/apps/docs/content/docs/en/tools/mailchimp.mdx b/apps/docs/content/docs/en/integrations/mailchimp.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/mailchimp.mdx rename to apps/docs/content/docs/en/integrations/mailchimp.mdx index 305c2ceb380..6bb22dcb1f4 100644 --- a/apps/docs/content/docs/en/tools/mailchimp.mdx +++ b/apps/docs/content/docs/en/integrations/mailchimp.mdx @@ -52,7 +52,7 @@ Integrate Mailchimp into the workflow. Can manage audiences (lists), list member -## Tools +## Actions ### `mailchimp_get_audiences` diff --git a/apps/docs/content/docs/en/tools/mailgun.mdx b/apps/docs/content/docs/en/integrations/mailgun.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/mailgun.mdx rename to apps/docs/content/docs/en/integrations/mailgun.mdx index b5474d84835..90eb8b3bc8f 100644 --- a/apps/docs/content/docs/en/tools/mailgun.mdx +++ b/apps/docs/content/docs/en/integrations/mailgun.mdx @@ -34,7 +34,7 @@ Integrate Mailgun into your workflow. Send transactional emails, manage mailing -## Tools +## Actions ### `mailgun_send_message` diff --git a/apps/docs/content/docs/en/tools/mem0.mdx b/apps/docs/content/docs/en/integrations/mem0.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/mem0.mdx rename to apps/docs/content/docs/en/integrations/mem0.mdx index 2e2ef80dce8..940b0842183 100644 --- a/apps/docs/content/docs/en/tools/mem0.mdx +++ b/apps/docs/content/docs/en/integrations/mem0.mdx @@ -32,7 +32,7 @@ Integrate Mem0 into the workflow. Can add, search, and retrieve memories. -## Tools +## Actions ### `mem0_add_memories` diff --git a/apps/docs/content/docs/en/integrations/memory.mdx b/apps/docs/content/docs/en/integrations/memory.mdx new file mode 100644 index 00000000000..a02bf48c00e --- /dev/null +++ b/apps/docs/content/docs/en/integrations/memory.mdx @@ -0,0 +1,113 @@ +--- +title: Memory +description: Add memory store +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +The Memory tool enables your agents to store, retrieve, and manage conversation memories across workflows. It acts as a persistent memory store that agents can access to maintain conversation context, recall facts, or track actions over time. + +With the Memory tool, you can: + +- **Add new memories**: Store relevant information, events, or conversation history by saving agent or user messages into a structured memory database +- **Retrieve memories**: Fetch specific memories or all memories tied to a conversation, helping agents recall previous interactions or facts +- **Delete memories**: Remove outdated or incorrect memories from the database to maintain accurate context +- **Append to existing conversations**: Update or expand on existing memory threads by appending new messages with the same conversation identifier + +Sim’s Memory block is especially useful for building agents that require persistent state—helping them remember what was said earlier in a conversation, persist facts between tasks, or apply long-term history in decision-making. By integrating Memory, you enable richer, more contextual, and more dynamic workflows for your agents. +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate Memory into the workflow. Can add, get a memory, get all memories, and delete memories. + + + +## Actions + +### `memory_add` + +Add a new memory to the database or append to existing memory with the same ID. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). If a memory with this conversationId already exists, the new message will be appended to it. | +| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. | +| `role` | string | Yes | Role for agent memory \(user, assistant, or system\) | +| `content` | string | Yes | Content for agent memory | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the memory was added successfully | +| `memories` | array | Array of memory objects including the new or updated memory | +| `error` | string | Error message if operation failed | + +### `memory_get` + +Retrieve memory by conversationId. Returns matching memories. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). Returns memories for this conversation. | +| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the memory was retrieved successfully | +| `memories` | array | Array of memory objects with conversationId and data fields | +| `message` | string | Success or error message | +| `error` | string | Error message if operation failed | + +### `memory_get_all` + +Retrieve all memories from the database + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether all memories were retrieved successfully | +| `memories` | array | Array of all memory objects with key, conversationId, and data fields | +| `message` | string | Success or error message | +| `error` | string | Error message if operation failed | + +### `memory_delete` + +Delete memories by conversationId. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). Deletes all memories for this conversation. | +| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the memory was deleted successfully | +| `message` | string | Success or error message | +| `error` | string | Error message if operation failed | + + diff --git a/apps/docs/content/docs/en/integrations/meta.json b/apps/docs/content/docs/en/integrations/meta.json index 424b4ce6d4f..89be69e55c4 100644 --- a/apps/docs/content/docs/en/integrations/meta.json +++ b/apps/docs/content/docs/en/integrations/meta.json @@ -1,5 +1,212 @@ { - "title": "Integrations", - "pages": ["index", "google-service-account", "atlassian-service-account"], - "defaultOpen": false + "pages": [ + "index", + "agentmail", + "agentphone", + "agiloft", + "ahrefs", + "airtable", + "airweave", + "algolia", + "amplitude", + "apify", + "apollo", + "appconfig", + "arxiv", + "asana", + "ashby", + "athena", + "atlassian-service-account", + "attio", + "azure_devops", + "box", + "brandfetch", + "brightdata", + "browser_use", + "calcom", + "calendly", + "circleback", + "clay", + "clerk", + "clickhouse", + "cloudflare", + "cloudformation", + "cloudwatch", + "confluence", + "crowdstrike", + "cursor", + "dagster", + "databricks", + "datadog", + "devin", + "discord", + "docusign", + "dropbox", + "dspy", + "dub", + "duckduckgo", + "dynamodb", + "elasticsearch", + "elevenlabs", + "emailbison", + "enrich", + "enrichment", + "evernote", + "exa", + "extend", + "fathom", + "file", + "findymail", + "firecrawl", + "fireflies", + "gamma", + "github", + "gitlab", + "gmail", + "gong", + "google-service-account", + "google_ads", + "google_bigquery", + "google_books", + "google_calendar", + "google_contacts", + "google_docs", + "google_drive", + "google_forms", + "google_groups", + "google_maps", + "google_meet", + "google_pagespeed", + "google_search", + "google_sheets", + "google_slides", + "google_tasks", + "google_translate", + "google_vault", + "grafana", + "grain", + "granola", + "greenhouse", + "greptile", + "hex", + "hubspot", + "hubspot-setup", + "huggingface", + "hunter", + "iam", + "identity_center", + "imap", + "incidentio", + "infisical", + "instantly", + "intercom", + "jina", + "jira", + "jira_service_management", + "kalshi", + "ketch", + "knowledge", + "langsmith", + "launchdarkly", + "lemlist", + "linear", + "linkedin", + "linkup", + "linq", + "loops", + "luma", + "mailchimp", + "mailgun", + "mem0", + "memory", + "microsoft_ad", + "microsoft_dataverse", + "microsoft_excel", + "microsoft_planner", + "microsoft_teams", + "millionverifier", + "mistral_parse", + "monday", + "mongodb", + "neo4j", + "neverbounce", + "new_relic", + "notion", + "obsidian", + "okta", + "onedrive", + "onepassword", + "openai", + "outlook", + "pagerduty", + "parallel_ai", + "peopledatalabs", + "perplexity", + "pinecone", + "pipedrive", + "polymarket", + "posthog", + "profound", + "prospeo", + "pulse", + "qdrant", + "quiver", + "railway", + "rb2b", + "rds", + "reddit", + "redis", + "reducto", + "resend", + "revenuecat", + "rippling", + "rootly", + "s3", + "salesforce", + "sap_concur", + "sap_s4hana", + "secrets_manager", + "sendblue", + "sendgrid", + "sentry", + "serper", + "servicenow", + "ses", + "sharepoint", + "shopify", + "similarweb", + "sixtyfour", + "slack", + "sqs", + "stagehand", + "stripe", + "sts", + "supabase", + "table", + "tailscale", + "tavily", + "telegram", + "textract", + "tinybird", + "trello", + "twilio_sms", + "twilio_voice", + "typeform", + "upstash", + "vercel", + "wealthbox", + "webflow", + "whatsapp", + "wikipedia", + "wiza", + "wordpress", + "workday", + "x", + "youtube", + "zendesk", + "zep", + "zerobounce", + "zoom", + "zoominfo" + ] } diff --git a/apps/docs/content/docs/en/tools/microsoft_ad.mdx b/apps/docs/content/docs/en/integrations/microsoft_ad.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/microsoft_ad.mdx rename to apps/docs/content/docs/en/integrations/microsoft_ad.mdx index 3f16dfd31ac..2d752e06c4d 100644 --- a/apps/docs/content/docs/en/tools/microsoft_ad.mdx +++ b/apps/docs/content/docs/en/integrations/microsoft_ad.mdx @@ -35,7 +35,7 @@ Integrate Azure Active Directory into your workflows. List, create, update, and -## Tools +## Actions ### `microsoft_ad_list_users` diff --git a/apps/docs/content/docs/en/tools/microsoft_dataverse.mdx b/apps/docs/content/docs/en/integrations/microsoft_dataverse.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/microsoft_dataverse.mdx rename to apps/docs/content/docs/en/integrations/microsoft_dataverse.mdx index eb3a5051f23..fbfc837fa9f 100644 --- a/apps/docs/content/docs/en/tools/microsoft_dataverse.mdx +++ b/apps/docs/content/docs/en/integrations/microsoft_dataverse.mdx @@ -34,7 +34,7 @@ Integrate Microsoft Dataverse into your workflow. Create, read, update, delete, -## Tools +## Actions ### `microsoft_dataverse_associate` diff --git a/apps/docs/content/docs/en/tools/microsoft_excel.mdx b/apps/docs/content/docs/en/integrations/microsoft_excel.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/microsoft_excel.mdx rename to apps/docs/content/docs/en/integrations/microsoft_excel.mdx index 35912dae3dd..2bd43e79516 100644 --- a/apps/docs/content/docs/en/tools/microsoft_excel.mdx +++ b/apps/docs/content/docs/en/integrations/microsoft_excel.mdx @@ -34,7 +34,7 @@ Integrate Microsoft Excel into the workflow with explicit sheet selection. Can r -## Tools +## Actions ### `microsoft_excel_read` diff --git a/apps/docs/content/docs/en/tools/microsoft_planner.mdx b/apps/docs/content/docs/en/integrations/microsoft_planner.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/microsoft_planner.mdx rename to apps/docs/content/docs/en/integrations/microsoft_planner.mdx index 9e88d5a50b7..0138c2c582d 100644 --- a/apps/docs/content/docs/en/tools/microsoft_planner.mdx +++ b/apps/docs/content/docs/en/integrations/microsoft_planner.mdx @@ -30,7 +30,7 @@ Integrate Microsoft Planner into the workflow. Manage tasks, plans, buckets, and -## Tools +## Actions ### `microsoft_planner_read_task` diff --git a/apps/docs/content/docs/en/tools/microsoft_teams.mdx b/apps/docs/content/docs/en/integrations/microsoft_teams.mdx similarity index 82% rename from apps/docs/content/docs/en/tools/microsoft_teams.mdx rename to apps/docs/content/docs/en/integrations/microsoft_teams.mdx index 5523fe8d148..955088c7fc5 100644 --- a/apps/docs/content/docs/en/tools/microsoft_teams.mdx +++ b/apps/docs/content/docs/en/integrations/microsoft_teams.mdx @@ -33,7 +33,7 @@ Integrate Microsoft Teams into the workflow. Read, write, update, and delete cha -## Tools +## Actions ### `microsoft_teams_read_chat` @@ -348,3 +348,84 @@ List all members of a Microsoft Teams channel | `memberCount` | number | Total number of members | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Microsoft Teams Channel + +Trigger workflow from Microsoft Teams channel messages via outgoing webhooks + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `hmacSecret` | string | Yes | The security token provided by Teams when creating an outgoing webhook. Used to verify request authenticity. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `from` | object | from output from the tool | +| ↳ `id` | string | Sender ID | +| ↳ `name` | string | Sender name | +| ↳ `aadObjectId` | string | AAD Object ID | +| `message` | object | message output from the tool | +| ↳ `raw` | object | raw output from the tool | +| ↳ `attachments` | json | Array of attachments | +| ↳ `channelData` | object | channelData output from the tool | +| ↳ `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| ↳ `tenant` | object | tenant output from the tool | +| ↳ `id` | string | Tenant ID | +| ↳ `channel` | object | channel output from the tool | +| ↳ `id` | string | Channel ID | +| ↳ `teamsTeamId` | string | Teams team ID | +| ↳ `teamsChannelId` | string | Teams channel ID | +| ↳ `conversation` | object | conversation output from the tool | +| ↳ `id` | string | Composite conversation ID | +| ↳ `name` | string | Conversation name \(nullable\) | +| ↳ `isGroup` | boolean | Is group conversation | +| ↳ `tenantId` | string | Tenant ID | +| ↳ `aadObjectId` | string | AAD Object ID \(nullable\) | +| ↳ `conversationType` | string | Conversation type \(channel\) | +| ↳ `text` | string | Message text content | +| ↳ `messageType` | string | Message type | +| ↳ `channelId` | string | Channel ID \(msteams\) | +| ↳ `timestamp` | string | Timestamp | +| `activity` | object | Activity payload | +| `conversation` | object | conversation output from the tool | +| ↳ `id` | string | Composite conversation ID | +| ↳ `name` | string | Conversation name \(nullable\) | +| ↳ `isGroup` | boolean | Is group conversation | +| ↳ `tenantId` | string | Tenant ID | +| ↳ `aadObjectId` | string | AAD Object ID \(nullable\) | +| ↳ `conversationType` | string | Conversation type \(channel\) | + + +--- + +### Microsoft Teams Chat + +Trigger workflow from new messages in Microsoft Teams chats via Microsoft Graph subscriptions + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires microsoft teams credentials to access your account. | +| `triggerChatId` | string | Yes | The ID of the Teams chat to monitor | +| `includeAttachments` | boolean | No | Fetch hosted contents and upload to storage | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `message_id` | string | Message ID | +| `chat_id` | string | Chat ID | +| `from_name` | string | Sender display name | +| `text` | string | Message body \(HTML or text\) | +| `created_at` | string | Message timestamp | +| `attachments` | file[] | Uploaded attachments as files | + diff --git a/apps/docs/content/docs/en/tools/millionverifier.mdx b/apps/docs/content/docs/en/integrations/millionverifier.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/millionverifier.mdx rename to apps/docs/content/docs/en/integrations/millionverifier.mdx index 2c24baeeab2..50fffe92282 100644 --- a/apps/docs/content/docs/en/tools/millionverifier.mdx +++ b/apps/docs/content/docs/en/integrations/millionverifier.mdx @@ -21,7 +21,7 @@ Integrate MillionVerifier to verify email deliverability in real time — classi -## Tools +## Actions ### `millionverifier_verify_email` diff --git a/apps/docs/content/docs/en/tools/mistral_parse.mdx b/apps/docs/content/docs/en/integrations/mistral_parse.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/mistral_parse.mdx rename to apps/docs/content/docs/en/integrations/mistral_parse.mdx index 9a74a864fd3..47c16ccc71b 100644 --- a/apps/docs/content/docs/en/tools/mistral_parse.mdx +++ b/apps/docs/content/docs/en/integrations/mistral_parse.mdx @@ -31,7 +31,7 @@ Integrate Mistral Parse into the workflow. Can extract text from uploaded PDF do -## Tools +## Actions ### `mistral_parser` diff --git a/apps/docs/content/docs/en/tools/monday.mdx b/apps/docs/content/docs/en/integrations/monday.mdx similarity index 63% rename from apps/docs/content/docs/en/tools/monday.mdx rename to apps/docs/content/docs/en/integrations/monday.mdx index 72f7d11e32d..d60977dd329 100644 --- a/apps/docs/content/docs/en/tools/monday.mdx +++ b/apps/docs/content/docs/en/integrations/monday.mdx @@ -16,7 +16,7 @@ Integrate with Monday.com to list boards, get board details, fetch and search it -## Tools +## Actions ### `monday_list_boards` @@ -385,3 +385,207 @@ Create a new group on a Monday.com board | ↳ `position` | string | Group position | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Monday Column Value Changed + +Trigger workflow when any column value changes on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `columnId` | string | The ID of the changed column | +| `columnType` | string | The type of the changed column | +| `columnTitle` | string | The title of the changed column | +| `value` | json | The new value of the column | +| `previousValue` | json | The previous value of the column | + + +--- + +### Monday Item Archived + +Trigger workflow when an item is archived on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | + + +--- + +### Monday Item Created + +Trigger workflow when a new item is created on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | + + +--- + +### Monday Item Deleted + +Trigger workflow when an item is deleted on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | + + +--- + +### Monday Item Moved to Group + +Trigger workflow when an item is moved to any group on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `destGroupId` | string | The destination group ID the item was moved to | +| `sourceGroupId` | string | The source group ID the item was moved from | + + +--- + +### Monday Item Name Changed + +Trigger workflow when an item name changes on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `columnId` | string | The ID of the changed column | +| `columnType` | string | The type of the changed column | +| `columnTitle` | string | The title of the changed column | +| `value` | json | The new value of the column | +| `previousValue` | json | The previous value of the column | + + +--- + +### Monday Status Changed + +Trigger workflow when a status column value changes on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `columnId` | string | The ID of the changed column | +| `columnType` | string | The type of the changed column | +| `columnTitle` | string | The title of the changed column | +| `value` | json | The new value of the column | +| `previousValue` | json | The previous value of the column | + + +--- + +### Monday Subitem Created + +Trigger workflow when a subitem is created on a Monday.com board + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `parentItemId` | string | The parent item ID | +| `parentItemBoardId` | string | The parent item board ID | + + +--- + +### Monday Update Posted + +Trigger workflow when an update or comment is posted on a Monday.com item + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `boardId` | string | The board ID where the event occurred | +| `itemId` | string | The item ID \(pulseId\) | +| `itemName` | string | The item name \(pulseName\) | +| `groupId` | string | The group ID of the item | +| `userId` | string | The ID of the user who triggered the event | +| `triggerTime` | string | ISO timestamp of when the event occurred | +| `triggerUuid` | string | Unique identifier for this event | +| `subscriptionId` | string | The webhook subscription ID | +| `updateId` | string | The ID of the created update | +| `body` | string | The HTML body of the update | +| `textBody` | string | The plain text body of the update | + diff --git a/apps/docs/content/docs/en/tools/mongodb.mdx b/apps/docs/content/docs/en/integrations/mongodb.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/mongodb.mdx rename to apps/docs/content/docs/en/integrations/mongodb.mdx index b04d6337415..f93f9b4c509 100644 --- a/apps/docs/content/docs/en/tools/mongodb.mdx +++ b/apps/docs/content/docs/en/integrations/mongodb.mdx @@ -31,7 +31,7 @@ Integrate MongoDB into the workflow. Can find, insert, update, delete, and aggre -## Tools +## Actions ### `mongodb_query` diff --git a/apps/docs/content/docs/en/tools/neo4j.mdx b/apps/docs/content/docs/en/integrations/neo4j.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/neo4j.mdx rename to apps/docs/content/docs/en/integrations/neo4j.mdx index fea2a4832e0..a8d490b902b 100644 --- a/apps/docs/content/docs/en/tools/neo4j.mdx +++ b/apps/docs/content/docs/en/integrations/neo4j.mdx @@ -32,7 +32,7 @@ Integrate Neo4j graph database into the workflow. Can query, create, merge, upda -## Tools +## Actions ### `neo4j_query` diff --git a/apps/docs/content/docs/en/tools/neverbounce.mdx b/apps/docs/content/docs/en/integrations/neverbounce.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/neverbounce.mdx rename to apps/docs/content/docs/en/integrations/neverbounce.mdx index b907232afae..478c92a1dc2 100644 --- a/apps/docs/content/docs/en/tools/neverbounce.mdx +++ b/apps/docs/content/docs/en/integrations/neverbounce.mdx @@ -21,7 +21,7 @@ Integrate NeverBounce to verify email deliverability in real time — classify a -## Tools +## Actions ### `neverbounce_verify_email` diff --git a/apps/docs/content/docs/en/tools/new_relic.mdx b/apps/docs/content/docs/en/integrations/new_relic.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/new_relic.mdx rename to apps/docs/content/docs/en/integrations/new_relic.mdx index 587b875f972..7f24f87e7bb 100644 --- a/apps/docs/content/docs/en/tools/new_relic.mdx +++ b/apps/docs/content/docs/en/integrations/new_relic.mdx @@ -30,7 +30,7 @@ Integrate New Relic into workflows. Run NRQL queries, search monitored entities, -## Tools +## Actions ### `new_relic_nrql_query` diff --git a/apps/docs/content/docs/en/triggers/notion.mdx b/apps/docs/content/docs/en/integrations/notion.mdx similarity index 60% rename from apps/docs/content/docs/en/triggers/notion.mdx rename to apps/docs/content/docs/en/integrations/notion.mdx index 552a1e77fb1..4f0edfa5bd5 100644 --- a/apps/docs/content/docs/en/triggers/notion.mdx +++ b/apps/docs/content/docs/en/integrations/notion.mdx @@ -1,19 +1,284 @@ --- title: Notion -description: Available Notion triggers for automating workflows +description: Manage Notion pages --- import { BlockInfoCard } from "@/components/ui/block-info-card" - -Notion provides 9 triggers for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +The Notion tool integration enables your agents to read, create, and manage Notion pages and databases directly within your workflows. This allows you to automate the retrieval and updating of structured content, notes, documents, and more from your Notion workspace. + +With the Notion tool, you can: + +- **Read pages or databases**: Extract rich content or metadata from specified Notion pages or entire databases +- **Create new content**: Programmatically create new pages or databases for dynamic content generation +- **Append content**: Add new blocks or properties to existing pages and databases +- **Query databases**: Run advanced filters and searches on structured Notion data for custom workflows +- **Search your workspace**: Locate pages and databases across your Notion workspace automatically + +This tool is ideal for scenarios where agents need to synchronize information, generate reports, or maintain structured notes within Notion. By bringing Notion's capabilities into automated workflows, you empower your agents to interface with knowledge, documentation, and project management data programmatically and seamlessly. +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate with Notion into the workflow. Can read page, read database, create page, create database, append content, query database, and search workspace. + + + +## Actions + +### `notion_read` + +Read content from a Notion page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `pageId` | string | Yes | The UUID of the Notion page to read | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `url` | string | Notion page URL | +| `created_time` | string | ISO 8601 creation timestamp | +| `last_edited_time` | string | ISO 8601 last edit timestamp | +| `content` | string | Page content in markdown format | +| `title` | string | Page title | + +### `notion_read_database` + +Read database information and structure from Notion + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `databaseId` | string | Yes | The UUID of the Notion database to read | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Database UUID | +| `url` | string | Notion database URL | +| `created_time` | string | ISO 8601 creation timestamp | +| `last_edited_time` | string | ISO 8601 last edit timestamp | +| `properties` | object | Database properties schema | +| `title` | string | Database title | + +### `notion_write` + +Append content to a Notion page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `pageId` | string | Yes | The UUID of the Notion page to append content to | +| `content` | string | Yes | The content to append to the page | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `appended` | boolean | Whether content was successfully appended | + +### `notion_create_page` + +Create a new page in Notion + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `parentId` | string | Yes | The UUID of the parent Notion page where this page will be created | +| `title` | string | No | Title of the new page | +| `content` | string | No | Optional content to add to the page upon creation | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page UUID | +| `url` | string | Notion page URL | +| `created_time` | string | ISO 8601 creation timestamp | +| `last_edited_time` | string | ISO 8601 last edit timestamp | +| `title` | string | Page title | + +### `notion_update_page` + +Update properties of a Notion page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `pageId` | string | Yes | The UUID of the Notion page to update | +| `properties` | json | Yes | JSON object of properties to update | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page UUID | +| `url` | string | Notion page URL | +| `last_edited_time` | string | ISO 8601 last edit timestamp | +| `title` | string | Page title | + +### `notion_query_database` + +Query and filter Notion database entries with advanced filtering + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `databaseId` | string | Yes | The UUID of the Notion database to query | +| `filter` | string | No | Filter conditions as JSON \(optional\) | +| `sorts` | string | No | Sort criteria as JSON array \(optional\) | +| `pageSize` | number | No | Number of results to return \(default: 100, max: 100\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `results` | array | Array of page objects from the database | +| ↳ `object` | string | Always "page" | +| ↳ `id` | string | Page UUID | +| ↳ `created_time` | string | ISO 8601 creation timestamp | +| ↳ `last_edited_time` | string | ISO 8601 last edit timestamp | +| ↳ `created_by` | object | Partial user object | +| ↳ `object` | string | Always "user" | +| ↳ `id` | string | User UUID | +| ↳ `last_edited_by` | object | Partial user object | +| ↳ `object` | string | Always "user" | +| ↳ `id` | string | User UUID | +| ↳ `archived` | boolean | Whether the page is archived | +| ↳ `in_trash` | boolean | Whether the page is in trash | +| ↳ `url` | string | Notion page URL | +| ↳ `public_url` | string | Public web URL if shared, null otherwise | +| ↳ `parent` | object | Parent object specifying hierarchical relationship | +| ↳ `type` | string | Parent type: "database_id", "data_source_id", "page_id", "workspace", or "block_id" | +| ↳ `database_id` | string | Parent database UUID \(if type is database_id\) | +| ↳ `data_source_id` | string | Parent data source UUID \(if type is data_source_id\) | +| ↳ `page_id` | string | Parent page UUID \(if type is page_id\) | +| ↳ `workspace` | boolean | True if parent is workspace \(if type is workspace\) | +| ↳ `block_id` | string | Parent block UUID \(if type is block_id\) | +| ↳ `icon` | object | Page/database icon \(emoji, custom_emoji, or file\) | +| ↳ `url` | string | Authenticated URL valid for one hour | +| ↳ `expiry_time` | string | ISO 8601 timestamp when URL expires | +| ↳ `cover` | object | Page/database cover image | +| ↳ `type` | string | File type: "file", "file_upload", or "external" | +| ↳ `file` | object | Notion-hosted file object \(when type is "file"\) | +| ↳ `url` | string | Authenticated URL valid for one hour | +| ↳ `expiry_time` | string | ISO 8601 timestamp when URL expires | +| ↳ `file_upload` | object | API-uploaded file object \(when type is "file_upload"\) | +| ↳ `id` | string | File upload UUID | +| ↳ `external` | object | External file object \(when type is "external"\) | +| ↳ `url` | string | External file URL \(never expires\) | +| ↳ `properties` | object | Page property values \(structure depends on parent type - database properties or title only\) | +| `has_more` | boolean | Whether more results are available | +| `next_cursor` | string | Cursor for next page of results | +| `total_results` | number | Number of results returned | + +### `notion_search` + +Search across all pages and databases in Notion workspace + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `query` | string | No | Search terms to find pages and databases \(leave empty to get all pages\) | +| `filterType` | string | No | Filter by object type: "page", "database", or leave empty for all | +| `pageSize` | number | No | Number of results to return \(default: 100, max: 100\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `results` | array | Array of search results \(pages and/or databases\) | +| ↳ `object` | string | Object type: "page" or "database" | +| ↳ `id` | string | Object UUID | +| ↳ `created_time` | string | ISO 8601 creation timestamp | +| ↳ `last_edited_time` | string | ISO 8601 last edit timestamp | +| ↳ `created_by` | object | Partial user object | +| ↳ `object` | string | Always "user" | +| ↳ `id` | string | User UUID | +| ↳ `last_edited_by` | object | Partial user object | +| ↳ `object` | string | Always "user" | +| ↳ `id` | string | User UUID | +| ↳ `archived` | boolean | Whether the object is archived | +| ↳ `in_trash` | boolean | Whether the object is in trash | +| ↳ `url` | string | Object URL | +| ↳ `public_url` | string | Public web URL if shared | +| ↳ `parent` | object | Parent object specifying hierarchical relationship | +| ↳ `type` | string | Parent type: "database_id", "data_source_id", "page_id", "workspace", or "block_id" | +| ↳ `database_id` | string | Parent database UUID \(if type is database_id\) | +| ↳ `data_source_id` | string | Parent data source UUID \(if type is data_source_id\) | +| ↳ `page_id` | string | Parent page UUID \(if type is page_id\) | +| ↳ `workspace` | boolean | True if parent is workspace \(if type is workspace\) | +| ↳ `block_id` | string | Parent block UUID \(if type is block_id\) | +| ↳ `properties` | object | Object properties | +| `has_more` | boolean | Whether more results are available | +| `next_cursor` | string | Cursor for next page of results | +| `total_results` | number | Number of results returned | + +### `notion_create_database` + +Create a new database in Notion with custom properties + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `parentId` | string | Yes | ID of the parent page where the database will be created | +| `title` | string | Yes | Title for the new database | +| `properties` | json | No | Database properties as JSON object \(optional, will create a default "Name" property if empty\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Database UUID | +| `url` | string | Notion database URL | +| `created_time` | string | ISO 8601 creation timestamp | +| `properties` | object | Database properties schema | +| `title` | string | Database title | + +### `notion_add_database_row` + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `databaseId` | string | Yes | ID of the database to add the row to | +| `properties` | json | Yes | Row properties as JSON object matching the database schema \(e.g., \{"Name": \{"title": \[\{"text": \{"content": "Task 1"\}\}\]\}, "Status": \{"select": \{"name": "Done"\}\}\}\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page UUID | +| `url` | string | Notion page URL | +| `created_time` | string | ISO 8601 creation timestamp | +| `last_edited_time` | string | ISO 8601 last edit timestamp | +| `title` | string | Row title | + + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### Notion Comment Created Trigger workflow when a comment or suggested edit is added in Notion diff --git a/apps/docs/content/docs/en/tools/obsidian.mdx b/apps/docs/content/docs/en/integrations/obsidian.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/obsidian.mdx rename to apps/docs/content/docs/en/integrations/obsidian.mdx index e15f6f9f9f2..fc13d9e6d94 100644 --- a/apps/docs/content/docs/en/tools/obsidian.mdx +++ b/apps/docs/content/docs/en/integrations/obsidian.mdx @@ -32,7 +32,7 @@ Read, create, update, search, and delete notes in your Obsidian vault. Manage pe -## Tools +## Actions ### `obsidian_append_active` diff --git a/apps/docs/content/docs/en/tools/okta.mdx b/apps/docs/content/docs/en/integrations/okta.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/okta.mdx rename to apps/docs/content/docs/en/integrations/okta.mdx index 04eaa51532c..6c2176557c3 100644 --- a/apps/docs/content/docs/en/tools/okta.mdx +++ b/apps/docs/content/docs/en/integrations/okta.mdx @@ -36,7 +36,7 @@ Integrate Okta identity management into your workflow. List, create, update, act -## Tools +## Actions ### `okta_list_users` diff --git a/apps/docs/content/docs/en/tools/onedrive.mdx b/apps/docs/content/docs/en/integrations/onedrive.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/onedrive.mdx rename to apps/docs/content/docs/en/integrations/onedrive.mdx index b20dea513cb..1383114ec11 100644 --- a/apps/docs/content/docs/en/tools/onedrive.mdx +++ b/apps/docs/content/docs/en/integrations/onedrive.mdx @@ -34,7 +34,7 @@ Integrate OneDrive into the workflow. Can create text and Excel files, upload fi -## Tools +## Actions ### `onedrive_upload` diff --git a/apps/docs/content/docs/en/tools/onepassword.mdx b/apps/docs/content/docs/en/integrations/onepassword.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/onepassword.mdx rename to apps/docs/content/docs/en/integrations/onepassword.mdx index c1fac1dab89..0d4c22ff9cb 100644 --- a/apps/docs/content/docs/en/tools/onepassword.mdx +++ b/apps/docs/content/docs/en/integrations/onepassword.mdx @@ -33,7 +33,7 @@ Access and manage secrets stored in 1Password vaults using the Connect API or Se -## Tools +## Actions ### `onepassword_list_vaults` diff --git a/apps/docs/content/docs/en/tools/openai.mdx b/apps/docs/content/docs/en/integrations/openai.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/openai.mdx rename to apps/docs/content/docs/en/integrations/openai.mdx index d7dc4216a71..251092e8ffc 100644 --- a/apps/docs/content/docs/en/tools/openai.mdx +++ b/apps/docs/content/docs/en/integrations/openai.mdx @@ -33,7 +33,7 @@ Integrate Embeddings into the workflow. Can generate embeddings from text. -## Tools +## Actions ### `openai_embeddings` diff --git a/apps/docs/content/docs/en/tools/outlook.mdx b/apps/docs/content/docs/en/integrations/outlook.mdx similarity index 83% rename from apps/docs/content/docs/en/tools/outlook.mdx rename to apps/docs/content/docs/en/integrations/outlook.mdx index 04f4075aea9..d99b8b83839 100644 --- a/apps/docs/content/docs/en/tools/outlook.mdx +++ b/apps/docs/content/docs/en/integrations/outlook.mdx @@ -41,7 +41,7 @@ Integrate Outlook into the workflow. Can read, draft, send, forward, and move em -## Tools +## Actions ### `outlook_send` @@ -263,3 +263,46 @@ Copy an Outlook message to another folder | `destinationFolderId` | string | ID of the destination folder | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +These run on a schedule \(**polling-based**\) — they check for new data rather than receiving push notifications. + +### Outlook Email Trigger + +Triggers when new emails are received in Outlook (requires Microsoft credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires outlook credentials to access your account. | +| `folderIds` | string | No | Choose which Outlook folders to monitor. Leave empty to monitor all emails. | +| `folderFilterBehavior` | string | Yes | Include only emails from selected folders, or exclude emails from selected folders | +| `markAsRead` | boolean | No | Automatically mark emails as read after processing | +| `includeAttachments` | boolean | No | Download and include email attachments in the trigger payload | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `email` | object | email output from the tool | +| ↳ `id` | string | Outlook message ID | +| ↳ `conversationId` | string | Outlook conversation ID | +| ↳ `subject` | string | Email subject line | +| ↳ `from` | string | Sender email address | +| ↳ `to` | string | Recipient email address | +| ↳ `cc` | string | CC recipients | +| ↳ `date` | string | Email date in ISO format | +| ↳ `bodyText` | string | Plain text email body | +| ↳ `bodyHtml` | string | HTML email body | +| ↳ `hasAttachments` | boolean | Whether email has attachments | +| ↳ `attachments` | file[] | Array of email attachments as files \(if includeAttachments is enabled\) | +| ↳ `isRead` | boolean | Whether email is read | +| ↳ `folderId` | string | Outlook folder ID where email is located | +| ↳ `messageId` | string | Message ID for threading | +| ↳ `threadId` | string | Thread ID for conversation threading | +| `timestamp` | string | Event timestamp | + diff --git a/apps/docs/content/docs/en/tools/pagerduty.mdx b/apps/docs/content/docs/en/integrations/pagerduty.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/pagerduty.mdx rename to apps/docs/content/docs/en/integrations/pagerduty.mdx index 5876c1cd7da..01e870eba61 100644 --- a/apps/docs/content/docs/en/tools/pagerduty.mdx +++ b/apps/docs/content/docs/en/integrations/pagerduty.mdx @@ -34,7 +34,7 @@ Integrate PagerDuty into your workflow to list, create, and update incidents, ad -## Tools +## Actions ### `pagerduty_list_incidents` diff --git a/apps/docs/content/docs/en/tools/parallel_ai.mdx b/apps/docs/content/docs/en/integrations/parallel_ai.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/parallel_ai.mdx rename to apps/docs/content/docs/en/integrations/parallel_ai.mdx index 5b0634bece5..e120ad35107 100644 --- a/apps/docs/content/docs/en/tools/parallel_ai.mdx +++ b/apps/docs/content/docs/en/integrations/parallel_ai.mdx @@ -33,7 +33,7 @@ Integrate Parallel AI into the workflow. Can search the web, extract information -## Tools +## Actions ### `parallel_search` diff --git a/apps/docs/content/docs/en/tools/peopledatalabs.mdx b/apps/docs/content/docs/en/integrations/peopledatalabs.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/peopledatalabs.mdx rename to apps/docs/content/docs/en/integrations/peopledatalabs.mdx index ace546acde5..334384fb439 100644 --- a/apps/docs/content/docs/en/tools/peopledatalabs.mdx +++ b/apps/docs/content/docs/en/integrations/peopledatalabs.mdx @@ -32,7 +32,7 @@ Enrich a single person or company with People Data Labs, or search the global pe -## Tools +## Actions ### `pdl_person_enrich` diff --git a/apps/docs/content/docs/en/tools/perplexity.mdx b/apps/docs/content/docs/en/integrations/perplexity.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/perplexity.mdx rename to apps/docs/content/docs/en/integrations/perplexity.mdx index 299c0bb1c09..3f63040c0c1 100644 --- a/apps/docs/content/docs/en/tools/perplexity.mdx +++ b/apps/docs/content/docs/en/integrations/perplexity.mdx @@ -33,7 +33,7 @@ Integrate Perplexity into the workflow. Can generate completions using Perplexit -## Tools +## Actions ### `perplexity_chat` diff --git a/apps/docs/content/docs/en/tools/pinecone.mdx b/apps/docs/content/docs/en/integrations/pinecone.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/pinecone.mdx rename to apps/docs/content/docs/en/integrations/pinecone.mdx index abda1f1f6cd..2c9cc031079 100644 --- a/apps/docs/content/docs/en/tools/pinecone.mdx +++ b/apps/docs/content/docs/en/integrations/pinecone.mdx @@ -33,7 +33,7 @@ Integrate Pinecone into the workflow. Can generate embeddings, upsert text, sear -## Tools +## Actions ### `pinecone_generate_embeddings` diff --git a/apps/docs/content/docs/en/tools/pipedrive.mdx b/apps/docs/content/docs/en/integrations/pipedrive.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/pipedrive.mdx rename to apps/docs/content/docs/en/integrations/pipedrive.mdx index cf4f2dc8194..a8da325c01f 100644 --- a/apps/docs/content/docs/en/tools/pipedrive.mdx +++ b/apps/docs/content/docs/en/integrations/pipedrive.mdx @@ -33,7 +33,7 @@ Integrate Pipedrive into your workflow. Manage deals, contacts, sales pipeline, -## Tools +## Actions ### `pipedrive_get_all_deals` diff --git a/apps/docs/content/docs/en/tools/polymarket.mdx b/apps/docs/content/docs/en/integrations/polymarket.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/polymarket.mdx rename to apps/docs/content/docs/en/integrations/polymarket.mdx index 979b14002e3..4d780ba2cdd 100644 --- a/apps/docs/content/docs/en/tools/polymarket.mdx +++ b/apps/docs/content/docs/en/integrations/polymarket.mdx @@ -33,7 +33,7 @@ Integrate Polymarket prediction markets into the workflow. Can get markets, mark -## Tools +## Actions ### `polymarket_get_markets` diff --git a/apps/docs/content/docs/en/tools/posthog.mdx b/apps/docs/content/docs/en/integrations/posthog.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/posthog.mdx rename to apps/docs/content/docs/en/integrations/posthog.mdx index f0fd26081c6..4cb5f25de0e 100644 --- a/apps/docs/content/docs/en/tools/posthog.mdx +++ b/apps/docs/content/docs/en/integrations/posthog.mdx @@ -37,7 +37,7 @@ Integrate PostHog into your workflow. Track events, manage feature flags, analyz -## Tools +## Actions ### `posthog_capture_event` diff --git a/apps/docs/content/docs/en/tools/profound.mdx b/apps/docs/content/docs/en/integrations/profound.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/profound.mdx rename to apps/docs/content/docs/en/integrations/profound.mdx index 23ff1444cc5..9aa1aa4c52c 100644 --- a/apps/docs/content/docs/en/tools/profound.mdx +++ b/apps/docs/content/docs/en/integrations/profound.mdx @@ -34,7 +34,7 @@ Track how your brand appears across AI platforms. Monitor visibility scores, sen -## Tools +## Actions ### `profound_list_categories` diff --git a/apps/docs/content/docs/en/tools/prospeo.mdx b/apps/docs/content/docs/en/integrations/prospeo.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/prospeo.mdx rename to apps/docs/content/docs/en/integrations/prospeo.mdx index 9e40823dfd9..d8080d2ebdf 100644 --- a/apps/docs/content/docs/en/tools/prospeo.mdx +++ b/apps/docs/content/docs/en/integrations/prospeo.mdx @@ -40,7 +40,7 @@ Find verified work emails and mobile numbers, enrich person and company profiles -## Tools +## Actions ### `prospeo_account_information` diff --git a/apps/docs/content/docs/en/tools/pulse.mdx b/apps/docs/content/docs/en/integrations/pulse.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/pulse.mdx rename to apps/docs/content/docs/en/integrations/pulse.mdx index e924a9f4774..f7c3eaec6d5 100644 --- a/apps/docs/content/docs/en/tools/pulse.mdx +++ b/apps/docs/content/docs/en/integrations/pulse.mdx @@ -35,7 +35,7 @@ Integrate Pulse into the workflow. Extract text from PDF documents, images, and -## Tools +## Actions ### `pulse_parser` diff --git a/apps/docs/content/docs/en/tools/qdrant.mdx b/apps/docs/content/docs/en/integrations/qdrant.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/qdrant.mdx rename to apps/docs/content/docs/en/integrations/qdrant.mdx index a902750b808..8f8b99d8e64 100644 --- a/apps/docs/content/docs/en/tools/qdrant.mdx +++ b/apps/docs/content/docs/en/integrations/qdrant.mdx @@ -37,7 +37,7 @@ Integrate Qdrant into the workflow. Can upsert, search, and fetch points. -## Tools +## Actions ### `qdrant_upsert_points` diff --git a/apps/docs/content/docs/en/tools/quiver.mdx b/apps/docs/content/docs/en/integrations/quiver.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/quiver.mdx rename to apps/docs/content/docs/en/integrations/quiver.mdx index c135299b2a4..d7b7a84cb57 100644 --- a/apps/docs/content/docs/en/tools/quiver.mdx +++ b/apps/docs/content/docs/en/integrations/quiver.mdx @@ -32,7 +32,7 @@ Generate SVG images from text prompts or vectorize raster images into SVGs using -## Tools +## Actions ### `quiver_text_to_svg` diff --git a/apps/docs/content/docs/en/tools/railway.mdx b/apps/docs/content/docs/en/integrations/railway.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/railway.mdx rename to apps/docs/content/docs/en/integrations/railway.mdx index c597bc020c2..9d41fe8492b 100644 --- a/apps/docs/content/docs/en/tools/railway.mdx +++ b/apps/docs/content/docs/en/integrations/railway.mdx @@ -30,7 +30,7 @@ Integrate Railway into workflows to list projects, manage services and environme -## Tools +## Actions ### `railway_list_projects` diff --git a/apps/docs/content/docs/en/tools/rb2b.mdx b/apps/docs/content/docs/en/integrations/rb2b.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/rb2b.mdx rename to apps/docs/content/docs/en/integrations/rb2b.mdx index a8e8bcacdb4..74395f0ee10 100644 --- a/apps/docs/content/docs/en/tools/rb2b.mdx +++ b/apps/docs/content/docs/en/integrations/rb2b.mdx @@ -16,7 +16,7 @@ Resolve IP addresses, hashed emails, and LinkedIn profiles into person-level ide -## Tools +## Actions ### `rb2b_credit_check` diff --git a/apps/docs/content/docs/en/tools/rds.mdx b/apps/docs/content/docs/en/integrations/rds.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/rds.mdx rename to apps/docs/content/docs/en/integrations/rds.mdx index 9a383557d9a..1868c7c17d3 100644 --- a/apps/docs/content/docs/en/tools/rds.mdx +++ b/apps/docs/content/docs/en/integrations/rds.mdx @@ -39,7 +39,7 @@ Integrate Amazon RDS Aurora Serverless into the workflow using the Data API. Can -## Tools +## Actions ### `rds_query` diff --git a/apps/docs/content/docs/en/tools/reddit.mdx b/apps/docs/content/docs/en/integrations/reddit.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/reddit.mdx rename to apps/docs/content/docs/en/integrations/reddit.mdx index f297ca297e6..42540dbd32d 100644 --- a/apps/docs/content/docs/en/tools/reddit.mdx +++ b/apps/docs/content/docs/en/integrations/reddit.mdx @@ -28,7 +28,7 @@ Integrate Reddit into workflows. Read posts, comments, and search content. Submi -## Tools +## Actions ### `reddit_get_posts` diff --git a/apps/docs/content/docs/en/tools/redis.mdx b/apps/docs/content/docs/en/integrations/redis.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/redis.mdx rename to apps/docs/content/docs/en/integrations/redis.mdx index cf862f762e6..6d9c658eeb5 100644 --- a/apps/docs/content/docs/en/tools/redis.mdx +++ b/apps/docs/content/docs/en/integrations/redis.mdx @@ -32,7 +32,7 @@ Connect to any Redis instance to perform key-value, hash, list, and utility oper -## Tools +## Actions ### `redis_get` diff --git a/apps/docs/content/docs/en/tools/reducto.mdx b/apps/docs/content/docs/en/integrations/reducto.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/reducto.mdx rename to apps/docs/content/docs/en/integrations/reducto.mdx index cce140b86ed..076fb08c46d 100644 --- a/apps/docs/content/docs/en/tools/reducto.mdx +++ b/apps/docs/content/docs/en/integrations/reducto.mdx @@ -33,7 +33,7 @@ Integrate Reducto Parse into the workflow. Can extract text from uploaded PDF do -## Tools +## Actions ### `reducto_parser` diff --git a/apps/docs/content/docs/en/triggers/resend.mdx b/apps/docs/content/docs/en/integrations/resend.mdx similarity index 57% rename from apps/docs/content/docs/en/triggers/resend.mdx rename to apps/docs/content/docs/en/integrations/resend.mdx index 630640b03bc..53671593923 100644 --- a/apps/docs/content/docs/en/triggers/resend.mdx +++ b/apps/docs/content/docs/en/integrations/resend.mdx @@ -1,19 +1,230 @@ --- title: Resend -description: Available Resend triggers for automating workflows +description: Send emails and manage contacts with Resend. --- import { BlockInfoCard } from "@/components/ui/block-info-card" - -Resend provides 8 triggers for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +[Resend](https://resend.com/) is a modern email service designed for developers to send transactional and marketing emails with ease. It provides a simple, reliable API and dashboard for managing email delivery, templates, and analytics, making it a popular choice for integrating email functionality into applications and workflows. + +With Resend, you can: + +- **Send transactional emails**: Deliver password resets, notifications, confirmations, and more with high deliverability +- **Manage templates**: Create and update email templates for consistent branding and messaging +- **Track analytics**: Monitor delivery, open, and click rates to optimize your email performance +- **Integrate easily**: Use a straightforward API and SDKs for seamless integration with your applications +- **Ensure security**: Benefit from robust authentication and domain verification to protect your email reputation + +In Sim, the Resend integration allows your agents to programmatically send emails as part of your automated workflows. This enables use cases such as sending notifications, alerts, or custom messages directly from your Sim-powered agents. By connecting Sim with Resend, you can automate communication tasks, ensuring timely and reliable email delivery without manual intervention. The integration leverages your Resend API key, keeping your credentials secure while enabling powerful email automation scenarios. +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate Resend into your workflow. Send emails, retrieve email status, manage contacts, and view domains. Requires API Key. + + + +## Actions + +### `resend_send` + +Send an email using your own Resend API key and from address + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `fromAddress` | string | Yes | Email address to send from \(e.g., "sender@example.com" or "Sender Name <sender@example.com>"\) | +| `to` | string | Yes | Recipient email address \(e.g., "recipient@example.com" or "Recipient Name <recipient@example.com>"\) | +| `subject` | string | Yes | Email subject line | +| `body` | string | Yes | Email body content \(plain text or HTML based on contentType\) | +| `contentType` | string | No | Content type for the email body: "text" for plain text or "html" for HTML content | +| `cc` | string | No | Carbon copy recipient email address | +| `bcc` | string | No | Blind carbon copy recipient email address | +| `replyTo` | string | No | Reply-to email address | +| `scheduledAt` | string | No | Schedule email to be sent later in ISO 8601 format | +| `tags` | string | No | Comma-separated key:value pairs for email tags \(e.g., "category:welcome,type:onboarding"\) | +| `resendApiKey` | string | Yes | Resend API key for sending emails | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the email was sent successfully | +| `id` | string | Email ID returned by Resend | +| `to` | string | Recipient email address | +| `subject` | string | Email subject | +| `body` | string | Email body content | + +### `resend_get_email` + +Retrieve details of a previously sent email by its ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `emailId` | string | Yes | The ID of the email to retrieve | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Email ID | +| `from` | string | Sender email address | +| `to` | array | Recipient email addresses | +| `subject` | string | Email subject | +| `html` | string | HTML email content | +| `text` | string | Plain text email content | +| `cc` | array | CC email addresses | +| `bcc` | array | BCC email addresses | +| `replyTo` | array | Reply-to email addresses | +| `lastEvent` | string | Last event status \(e.g., delivered, bounced\) | +| `createdAt` | string | Email creation timestamp | +| `scheduledAt` | string | Scheduled send timestamp | +| `tags` | array | Email tags as name-value pairs | +| ↳ `name` | string | Tag name | +| ↳ `value` | string | Tag value | + +### `resend_create_contact` + +Create a new contact in Resend + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `email` | string | Yes | Email address of the contact | +| `firstName` | string | No | First name of the contact | +| `lastName` | string | No | Last name of the contact | +| `unsubscribed` | boolean | No | Whether the contact is unsubscribed from all broadcasts | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Created contact ID | + +### `resend_list_contacts` + +List all contacts in Resend + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `contacts` | array | Array of contacts | +| ↳ `id` | string | Contact ID | +| ↳ `email` | string | Contact email address | +| ↳ `first_name` | string | Contact first name | +| ↳ `last_name` | string | Contact last name | +| ↳ `created_at` | string | Contact creation timestamp | +| ↳ `unsubscribed` | boolean | Whether the contact is unsubscribed | +| `hasMore` | boolean | Whether there are more contacts to retrieve | + +### `resend_get_contact` + +Retrieve details of a contact by ID or email + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contactId` | string | Yes | The contact ID or email address to retrieve | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Contact ID | +| `email` | string | Contact email address | +| `firstName` | string | Contact first name | +| `lastName` | string | Contact last name | +| `createdAt` | string | Contact creation timestamp | +| `unsubscribed` | boolean | Whether the contact is unsubscribed | + +### `resend_update_contact` + +Update an existing contact in Resend + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contactId` | string | Yes | The contact ID or email address to update | +| `firstName` | string | No | Updated first name | +| `lastName` | string | No | Updated last name | +| `unsubscribed` | boolean | No | Whether the contact should be unsubscribed from all broadcasts | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Updated contact ID | + +### `resend_delete_contact` + +Delete a contact from Resend by ID or email + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `contactId` | string | Yes | The contact ID or email address to delete | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Deleted contact ID | +| `deleted` | boolean | Whether the contact was successfully deleted | + +### `resend_list_domains` + +List all verified domains in your Resend account + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `resendApiKey` | string | Yes | Resend API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `domains` | array | Array of domains | +| ↳ `id` | string | Domain ID | +| ↳ `name` | string | Domain name | +| ↳ `status` | string | Domain verification status | +| ↳ `region` | string | Region the domain is configured in | +| ↳ `createdAt` | string | Domain creation timestamp | +| `hasMore` | boolean | Whether there are more domains to retrieve | + + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### Resend Email Bounced Trigger workflow when an email bounces diff --git a/apps/docs/content/docs/en/tools/revenuecat.mdx b/apps/docs/content/docs/en/integrations/revenuecat.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/revenuecat.mdx rename to apps/docs/content/docs/en/integrations/revenuecat.mdx index 6c2813db7b7..5822fc971ac 100644 --- a/apps/docs/content/docs/en/tools/revenuecat.mdx +++ b/apps/docs/content/docs/en/integrations/revenuecat.mdx @@ -32,7 +32,7 @@ Integrate RevenueCat into the workflow. Manage subscribers, entitlements, offeri -## Tools +## Actions ### `revenuecat_get_customer` diff --git a/apps/docs/content/docs/en/tools/rippling.mdx b/apps/docs/content/docs/en/integrations/rippling.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/rippling.mdx rename to apps/docs/content/docs/en/integrations/rippling.mdx index 553d762db51..31013ea5c68 100644 --- a/apps/docs/content/docs/en/tools/rippling.mdx +++ b/apps/docs/content/docs/en/integrations/rippling.mdx @@ -44,7 +44,7 @@ Integrate Rippling Platform into your workflow. Manage workers, users, departmen -## Tools +## Actions ### `rippling_list_workers` diff --git a/apps/docs/content/docs/en/tools/rootly.mdx b/apps/docs/content/docs/en/integrations/rootly.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/rootly.mdx rename to apps/docs/content/docs/en/integrations/rootly.mdx index b0496830200..5b45b01fe44 100644 --- a/apps/docs/content/docs/en/tools/rootly.mdx +++ b/apps/docs/content/docs/en/integrations/rootly.mdx @@ -42,7 +42,7 @@ Integrate Rootly incident management into workflows. Create and manage incidents -## Tools +## Actions ### `rootly_create_incident` diff --git a/apps/docs/content/docs/en/tools/s3.mdx b/apps/docs/content/docs/en/integrations/s3.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/s3.mdx rename to apps/docs/content/docs/en/integrations/s3.mdx index f7780eb585c..0678a74bc1b 100644 --- a/apps/docs/content/docs/en/tools/s3.mdx +++ b/apps/docs/content/docs/en/integrations/s3.mdx @@ -33,7 +33,7 @@ Integrate S3 into the workflow. Upload files, download objects, list bucket cont -## Tools +## Actions ### `s3_put_object` diff --git a/apps/docs/content/docs/en/tools/salesforce.mdx b/apps/docs/content/docs/en/integrations/salesforce.mdx similarity index 83% rename from apps/docs/content/docs/en/tools/salesforce.mdx rename to apps/docs/content/docs/en/integrations/salesforce.mdx index ce4f86ff31b..7c15ea20e14 100644 --- a/apps/docs/content/docs/en/tools/salesforce.mdx +++ b/apps/docs/content/docs/en/integrations/salesforce.mdx @@ -31,7 +31,7 @@ Integrate Salesforce into your workflow. Manage accounts, contacts, leads, oppor -## Tools +## Actions ### `salesforce_get_accounts` @@ -1026,3 +1026,200 @@ Get a list of all available Salesforce objects | ↳ `success` | boolean | Salesforce operation success | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Salesforce Case Status Changed + +Trigger workflow when a case status changes + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type \(Case\) | +| `recordId` | string | Case ID | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | object | record output from the tool | +| ↳ `Id` | string | Case ID | +| ↳ `Subject` | string | Case subject | +| ↳ `Status` | string | Current case status | +| ↳ `Priority` | string | Case priority | +| ↳ `CaseNumber` | string | Case number | +| ↳ `AccountId` | string | Related Account ID | +| ↳ `ContactId` | string | Related Contact ID | +| ↳ `OwnerId` | string | Case owner ID | +| `previousStatus` | string | Previous case status | +| `newStatus` | string | New case status | +| `payload` | json | Full webhook payload | + + +--- + +### Salesforce Opportunity Stage Changed + +Trigger workflow when an opportunity stage changes + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type \(Opportunity\) | +| `recordId` | string | Opportunity ID | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | object | record output from the tool | +| ↳ `Id` | string | Opportunity ID | +| ↳ `Name` | string | Opportunity name | +| ↳ `StageName` | string | Current stage name | +| ↳ `Amount` | string | Deal amount | +| ↳ `CloseDate` | string | Expected close date | +| ↳ `Probability` | string | Win probability | +| ↳ `AccountId` | string | Related Account ID \(standard Opportunity field\) | +| ↳ `OwnerId` | string | Opportunity owner ID | +| `previousStage` | string | Previous stage name | +| `newStage` | string | New stage name | +| `payload` | json | Full webhook payload | + + +--- + +### Salesforce Record Created + +Trigger workflow when a Salesforce record is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | +| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | +| `recordId` | string | ID of the affected record | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | object | record output from the tool | +| ↳ `Id` | string | Record ID | +| ↳ `Name` | string | Record name | +| ↳ `CreatedDate` | string | Record creation date | +| ↳ `LastModifiedDate` | string | Last modification date | +| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | +| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | +| `changedFields` | json | Fields that were changed \(for update events\) | +| `payload` | json | Full webhook payload | + + +--- + +### Salesforce Record Deleted + +Trigger workflow when a Salesforce record is deleted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | +| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | +| `recordId` | string | ID of the affected record | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | object | record output from the tool | +| ↳ `Id` | string | Record ID | +| ↳ `Name` | string | Record name | +| ↳ `CreatedDate` | string | Record creation date | +| ↳ `LastModifiedDate` | string | Last modification date | +| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | +| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | +| `changedFields` | json | Fields that were changed \(for update events\) | +| `payload` | json | Full webhook payload | + + +--- + +### Salesforce Record Updated + +Trigger workflow when a Salesforce record is updated + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | +| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | +| `recordId` | string | ID of the affected record | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | object | record output from the tool | +| ↳ `Id` | string | Record ID | +| ↳ `Name` | string | Record name | +| ↳ `CreatedDate` | string | Record creation date | +| ↳ `LastModifiedDate` | string | Last modification date | +| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | +| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | +| `changedFields` | json | Fields that were changed \(for update events\) | +| `payload` | json | Full webhook payload | + + +--- + +### Salesforce Webhook (All Events) + +Trigger workflow on any Salesforce webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | +| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | The type of event | +| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | +| `objectType` | string | Salesforce object type | +| `recordId` | string | ID of the affected record | +| `timestamp` | string | When the event occurred \(ISO 8601\) | +| `record` | json | Full record data | +| `payload` | json | Full webhook payload | + diff --git a/apps/docs/content/docs/en/tools/sap_concur.mdx b/apps/docs/content/docs/en/integrations/sap_concur.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sap_concur.mdx rename to apps/docs/content/docs/en/integrations/sap_concur.mdx index 19ce53cb7f5..8fe00adedac 100644 --- a/apps/docs/content/docs/en/tools/sap_concur.mdx +++ b/apps/docs/content/docs/en/integrations/sap_concur.mdx @@ -38,7 +38,7 @@ Connect SAP Concur via OAuth 2.0. Manage expense reports and line items, allocat -## Tools +## Actions ### `sap_concur_approve_expense_report` diff --git a/apps/docs/content/docs/en/tools/sap_s4hana.mdx b/apps/docs/content/docs/en/integrations/sap_s4hana.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sap_s4hana.mdx rename to apps/docs/content/docs/en/integrations/sap_s4hana.mdx index bc9bb49302a..75845287e0b 100644 --- a/apps/docs/content/docs/en/tools/sap_s4hana.mdx +++ b/apps/docs/content/docs/en/integrations/sap_s4hana.mdx @@ -52,7 +52,7 @@ Connect SAP S4HANA Cloud Public Edition with per-tenant OAuth 2.0 client credent -## Tools +## Actions ### `sap_s4hana_list_business_partners` diff --git a/apps/docs/content/docs/en/tools/secrets_manager.mdx b/apps/docs/content/docs/en/integrations/secrets_manager.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/secrets_manager.mdx rename to apps/docs/content/docs/en/integrations/secrets_manager.mdx index 81fb8d21165..ca685d9de1b 100644 --- a/apps/docs/content/docs/en/tools/secrets_manager.mdx +++ b/apps/docs/content/docs/en/integrations/secrets_manager.mdx @@ -32,7 +32,7 @@ Integrate AWS Secrets Manager into the workflow. Can retrieve, create, update, l -## Tools +## Actions ### `secrets_manager_get_secret` diff --git a/apps/docs/content/docs/en/tools/sendblue.mdx b/apps/docs/content/docs/en/integrations/sendblue.mdx similarity index 69% rename from apps/docs/content/docs/en/tools/sendblue.mdx rename to apps/docs/content/docs/en/integrations/sendblue.mdx index 57c30e9f78b..ca03c545710 100644 --- a/apps/docs/content/docs/en/tools/sendblue.mdx +++ b/apps/docs/content/docs/en/integrations/sendblue.mdx @@ -40,7 +40,7 @@ Send iMessages and SMS to individuals or groups, check whether a number supports -## Tools +## Actions ### `sendblue_send_message` @@ -195,3 +195,85 @@ Retrieve a single message and its current status by message handle/ID. | `date_updated` | string | ISO 8601 last-update timestamp | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Sendblue Message Received + +Trigger when an inbound iMessage or SMS is received in Sendblue + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `account_email` | string | Email of the Sendblue account | +| `content` | string | Message text content | +| `media_url` | string | CDN link to attached media, if any | +| `is_outbound` | boolean | True for outbound messages, false for inbound | +| `status` | string | Message status \(e.g., RECEIVED, QUEUED, SENT, DELIVERED, ERROR\) | +| `error_code` | number | Error identifier, null if none | +| `error_message` | string | Descriptive error text, null if none | +| `error_reason` | string | Additional error context, null if none | +| `error_detail` | string | Detailed error information, null if none | +| `message_handle` | string | Sendblue message identifier \(use to deduplicate\) | +| `date_sent` | string | ISO 8601 creation timestamp | +| `date_updated` | string | ISO 8601 last-update timestamp | +| `from_number` | string | E.164 sender phone number | +| `number` | string | E.164 recipient/counterparty phone number | +| `to_number` | string | E.164 destination phone number | +| `was_downgraded` | boolean | True if the recipient lacks iMessage support | +| `plan` | string | Account plan type | +| `message_type` | string | Message category \(e.g., message, group\) | +| `group_id` | string | Group identifier, empty for non-group messages | +| `participants` | array | Participant phone numbers for group messages | +| `send_style` | string | Expressive style if applied | +| `opted_out` | boolean | True if the recipient has opted out | +| `sendblue_number` | string | Sendblue phone number used | +| `service` | string | Messaging service \(iMessage or SMS\) | +| `group_display_name` | string | Group chat name, null for non-group messages | +| `sender_email` | string | Email of the user who sent the message | +| `seat_id` | string | Seat UUID, null if absent | +| `raw` | string | Complete raw webhook payload from Sendblue as a JSON string | + + +--- + +### Sendblue Message Status Updated + +Trigger when an outbound message status changes (SENT, DELIVERED, ERROR) in Sendblue + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `account_email` | string | Email of the Sendblue account | +| `content` | string | Message text content | +| `media_url` | string | CDN link to attached media, if any | +| `is_outbound` | boolean | True for outbound messages, false for inbound | +| `status` | string | Message status \(e.g., RECEIVED, QUEUED, SENT, DELIVERED, ERROR\) | +| `error_code` | number | Error identifier, null if none | +| `error_message` | string | Descriptive error text, null if none | +| `error_reason` | string | Additional error context, null if none | +| `error_detail` | string | Detailed error information, null if none | +| `message_handle` | string | Sendblue message identifier \(use to deduplicate\) | +| `date_sent` | string | ISO 8601 creation timestamp | +| `date_updated` | string | ISO 8601 last-update timestamp | +| `from_number` | string | E.164 sender phone number | +| `number` | string | E.164 recipient/counterparty phone number | +| `to_number` | string | E.164 destination phone number | +| `was_downgraded` | boolean | True if the recipient lacks iMessage support | +| `plan` | string | Account plan type | +| `message_type` | string | Message category \(e.g., message, group\) | +| `group_id` | string | Group identifier, empty for non-group messages | +| `participants` | array | Participant phone numbers for group messages | +| `send_style` | string | Expressive style if applied | +| `opted_out` | boolean | True if the recipient has opted out | +| `sendblue_number` | string | Sendblue phone number used | +| `service` | string | Messaging service \(iMessage or SMS\) | +| `group_display_name` | string | Group chat name, null for non-group messages | +| `sender_email` | string | Email of the user who sent the message | +| `seat_id` | string | Seat UUID, null if absent | +| `raw` | string | Complete raw webhook payload from Sendblue as a JSON string | + diff --git a/apps/docs/content/docs/en/tools/sendgrid.mdx b/apps/docs/content/docs/en/integrations/sendgrid.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sendgrid.mdx rename to apps/docs/content/docs/en/integrations/sendgrid.mdx index d5b9ea99922..0b32ebc50af 100644 --- a/apps/docs/content/docs/en/tools/sendgrid.mdx +++ b/apps/docs/content/docs/en/integrations/sendgrid.mdx @@ -40,7 +40,7 @@ Integrate SendGrid into your workflow. Send transactional emails, manage marketi -## Tools +## Actions ### `sendgrid_send_mail` diff --git a/apps/docs/content/docs/en/tools/sentry.mdx b/apps/docs/content/docs/en/integrations/sentry.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sentry.mdx rename to apps/docs/content/docs/en/integrations/sentry.mdx index 72642981dda..23bd02c3025 100644 --- a/apps/docs/content/docs/en/tools/sentry.mdx +++ b/apps/docs/content/docs/en/integrations/sentry.mdx @@ -43,7 +43,7 @@ Integrate Sentry into the workflow. Monitor issues, manage projects, track event -## Tools +## Actions ### `sentry_issues_list` diff --git a/apps/docs/content/docs/en/tools/serper.mdx b/apps/docs/content/docs/en/integrations/serper.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/serper.mdx rename to apps/docs/content/docs/en/integrations/serper.mdx index bcdf5279b3a..e850ed4b8ef 100644 --- a/apps/docs/content/docs/en/tools/serper.mdx +++ b/apps/docs/content/docs/en/integrations/serper.mdx @@ -31,7 +31,7 @@ Integrate Serper into the workflow. Can search the web. -## Tools +## Actions ### `serper_search` diff --git a/apps/docs/content/docs/en/triggers/servicenow.mdx b/apps/docs/content/docs/en/integrations/servicenow.mdx similarity index 61% rename from apps/docs/content/docs/en/triggers/servicenow.mdx rename to apps/docs/content/docs/en/integrations/servicenow.mdx index 9e9060e4b3d..647c71a7724 100644 --- a/apps/docs/content/docs/en/triggers/servicenow.mdx +++ b/apps/docs/content/docs/en/integrations/servicenow.mdx @@ -1,19 +1,134 @@ --- title: ServiceNow -description: Available ServiceNow triggers for automating workflows +description: Create, read, update, and delete ServiceNow records --- import { BlockInfoCard } from "@/components/ui/block-info-card" - -ServiceNow provides 5 triggers for automating workflows based on events. +{/* MANUAL-CONTENT-START:intro */} +[ServiceNow](https://www.servicenow.com/) is a powerful cloud platform designed to streamline and automate IT service management (ITSM), workflows, and business processes across your organization. ServiceNow enables you to manage incidents, requests, tasks, users, and more using its extensive API. + +With ServiceNow, you can: + +- **Automate IT workflows**: Create, read, update, and delete records in any ServiceNow table, such as incidents, tasks, change requests, and users. +- **Integrate systems**: Connect ServiceNow with your other tools and processes for seamless automation. +- **Maintain a single source of truth**: Keep all your service and operations data organized and accessible. +- **Drive operational efficiency**: Reduce manual work and improve service quality with customizable workflows and automation. + +In Sim, the ServiceNow integration enables your agents to interact directly with your ServiceNow instance as part of their workflows. Agents can create, read, update, or delete records in any ServiceNow table and leverage ticket or user data for sophisticated automation and decision-making. This integration bridges your workflow automation and IT operations, empowering your agents to manage service requests, incidents, users, and assets without manual intervention. By connecting Sim with ServiceNow, you can automate service management tasks, improve response times, and ensure consistent, secure access to your organization's vital service data. +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate ServiceNow into your workflow. Create, read, update, and delete records in any ServiceNow table including incidents, tasks, change requests, users, and more. + + + +## Actions + +### `servicenow_create_record` + +Create a new record in a ServiceNow table + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | +| `username` | string | Yes | ServiceNow username | +| `password` | string | Yes | ServiceNow password | +| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user\) | +| `fields` | json | Yes | Fields to set on the record as JSON object \(e.g., \{"short_description": "Issue title", "priority": "1"\}\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `record` | json | Created ServiceNow record with sys_id and other fields | +| `metadata` | json | Operation metadata | + +### `servicenow_read_record` + +Read records from a ServiceNow table + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | +| `username` | string | Yes | ServiceNow username | +| `password` | string | Yes | ServiceNow password | +| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | +| `sysId` | string | No | Specific record sys_id \(e.g., 6816f79cc0a8016401c5a33be04be441\) | +| `number` | string | No | Record number \(e.g., INC0010001\) | +| `query` | string | No | Encoded query string \(e.g., "active=true^priority=1"\) | +| `limit` | number | No | Maximum number of records to return \(e.g., 10, 50, 100\) | +| `offset` | number | No | Number of records to skip for pagination \(e.g., 0, 10, 20\) | +| `fields` | string | No | Comma-separated list of fields to return \(e.g., sys_id,number,short_description,state\) | +| `displayValue` | string | No | Return display values for reference fields: "true" \(display only\), "false" \(sys_id only\), or "all" \(both\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `records` | array | Array of ServiceNow records | +| `metadata` | json | Operation metadata | + +### `servicenow_update_record` + +Update an existing record in a ServiceNow table + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | +| `username` | string | Yes | ServiceNow username | +| `password` | string | Yes | ServiceNow password | +| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | +| `sysId` | string | Yes | Record sys_id to update \(e.g., 6816f79cc0a8016401c5a33be04be441\) | +| `fields` | json | Yes | Fields to update as JSON object \(e.g., \{"state": "2", "priority": "1"\}\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `record` | json | Updated ServiceNow record | +| `metadata` | json | Operation metadata | + +### `servicenow_delete_record` + +Delete a record from a ServiceNow table + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | +| `username` | string | Yes | ServiceNow username | +| `password` | string | Yes | ServiceNow password | +| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | +| `sysId` | string | Yes | Record sys_id to delete \(e.g., 6816f79cc0a8016401c5a33be04be441\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the deletion was successful | +| `metadata` | json | Operation metadata | + + ## Triggers +A **Trigger** is a block that starts a workflow when an event happens in this service. + ### ServiceNow Change Request Created Trigger workflow when a new change request is created in ServiceNow diff --git a/apps/docs/content/docs/en/tools/ses.mdx b/apps/docs/content/docs/en/integrations/ses.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/ses.mdx rename to apps/docs/content/docs/en/integrations/ses.mdx index 33248914c2a..71aab4dcb66 100644 --- a/apps/docs/content/docs/en/tools/ses.mdx +++ b/apps/docs/content/docs/en/integrations/ses.mdx @@ -31,7 +31,7 @@ Integrate AWS SES v2 into the workflow. Send simple, templated, and bulk emails. -## Tools +## Actions ### `ses_send_email` diff --git a/apps/docs/content/docs/en/tools/sharepoint.mdx b/apps/docs/content/docs/en/integrations/sharepoint.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sharepoint.mdx rename to apps/docs/content/docs/en/integrations/sharepoint.mdx index 7cb84dfb326..bb9bc4df74b 100644 --- a/apps/docs/content/docs/en/tools/sharepoint.mdx +++ b/apps/docs/content/docs/en/integrations/sharepoint.mdx @@ -31,7 +31,7 @@ Integrate SharePoint into the workflow. Read/create pages, list sites, and work -## Tools +## Actions ### `sharepoint_create_page` diff --git a/apps/docs/content/docs/en/tools/shopify.mdx b/apps/docs/content/docs/en/integrations/shopify.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/shopify.mdx rename to apps/docs/content/docs/en/integrations/shopify.mdx index 0502cf7ba5c..bae22da45f8 100644 --- a/apps/docs/content/docs/en/tools/shopify.mdx +++ b/apps/docs/content/docs/en/integrations/shopify.mdx @@ -30,7 +30,7 @@ Integrate Shopify into your workflow. Manage products, orders, customers, and in -## Tools +## Actions ### `shopify_create_product` diff --git a/apps/docs/content/docs/en/tools/similarweb.mdx b/apps/docs/content/docs/en/integrations/similarweb.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/similarweb.mdx rename to apps/docs/content/docs/en/integrations/similarweb.mdx index 57eb457ddf4..cbdf82ddc28 100644 --- a/apps/docs/content/docs/en/tools/similarweb.mdx +++ b/apps/docs/content/docs/en/integrations/similarweb.mdx @@ -30,7 +30,7 @@ Access comprehensive website analytics including traffic estimates, engagement m -## Tools +## Actions ### `similarweb_website_overview` diff --git a/apps/docs/content/docs/en/tools/sixtyfour.mdx b/apps/docs/content/docs/en/integrations/sixtyfour.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sixtyfour.mdx rename to apps/docs/content/docs/en/integrations/sixtyfour.mdx index aed853b33cc..cec9052552a 100644 --- a/apps/docs/content/docs/en/tools/sixtyfour.mdx +++ b/apps/docs/content/docs/en/integrations/sixtyfour.mdx @@ -16,7 +16,7 @@ Find emails, phone numbers, and enrich lead or company data with contact informa -## Tools +## Actions ### `sixtyfour_find_phone` diff --git a/apps/docs/content/docs/en/tools/slack.mdx b/apps/docs/content/docs/en/integrations/slack.mdx similarity index 94% rename from apps/docs/content/docs/en/tools/slack.mdx rename to apps/docs/content/docs/en/integrations/slack.mdx index c231b547b62..99e6a890876 100644 --- a/apps/docs/content/docs/en/tools/slack.mdx +++ b/apps/docs/content/docs/en/integrations/slack.mdx @@ -43,7 +43,7 @@ Integrate Slack into the workflow. Can send, update, and delete messages, send e -## Tools +## Actions ### `slack_message` @@ -1323,3 +1323,53 @@ Publish a static view to a user | ↳ `bot_id` | string | Bot identifier | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Slack Webhook + +Trigger workflow from Slack events like mentions, messages, and reactions + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | The signing secret from your Slack app to validate request authenticity. | +| `botToken` | string | No | The bot token from your Slack app. Required for downloading files attached to messages. | +| `includeFiles` | boolean | No | Download and include file attachments from messages. Requires a bot token with files:read scope. | +| `setupWizard` | modal | No | Walk through manifest creation, app install, and pasting credentials. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | object | Slack event data | +| ↳ `event_type` | string | Type of Slack payload: an Events API event \(e.g., app_mention, message\), an interactivity type \(e.g., block_actions\), or "slash_command" for slash commands | +| ↳ `subtype` | string | Message subtype \(e.g., channel_join, channel_leave, bot_message, file_share\). Null for regular user messages | +| ↳ `channel` | string | Slack channel ID where the event occurred | +| ↳ `channel_name` | string | Human-readable channel name | +| ↳ `channel_type` | string | Type of channel \(e.g., channel, group, im, mpim\). Useful for distinguishing DMs from public channels | +| ↳ `user` | string | User ID who triggered the event | +| ↳ `user_name` | string | Username who triggered the event | +| ↳ `bot_id` | string | Bot ID if the message was sent by a bot. Null for human users | +| ↳ `text` | string | Message text content. For slash commands, the text after the command. For interactivity, the source message text \(falls back to the triggering action value\) | +| ↳ `timestamp` | string | Message timestamp from the triggering event | +| ↳ `thread_ts` | string | Parent thread timestamp \(if message is in a thread\) | +| ↳ `team_id` | string | Slack workspace/team ID | +| ↳ `event_id` | string | Unique event identifier | +| ↳ `reaction` | string | Emoji reaction name \(e.g., thumbsup\). Present for reaction_added/reaction_removed events | +| ↳ `item_user` | string | User ID of the original message author. Present for reaction_added/reaction_removed events | +| ↳ `command` | string | Slash command name including the leading slash \(e.g., /deploy\). Present for slash commands | +| ↳ `action_id` | string | action_id of the first interactive element triggered. Present for block_actions \(button/select clicks\) | +| ↳ `action_value` | string | Value carried by the first interactive element \(button value, selected option, date, etc.\). Present for block_actions | +| ↳ `actions` | json | Full array of interactive actions from the payload, preserving every element and its value. Present for block_actions | +| ↳ `response_url` | string | Temporary URL to post a response back to the originating message or command. Present for interactivity and slash commands | +| ↳ `trigger_id` | string | Short-lived trigger ID used to open a modal in response. Present for interactivity and slash commands | +| ↳ `callback_id` | string | Callback ID of the shortcut or view. Present for shortcuts and modal submissions | +| ↳ `api_app_id` | string | Slack app ID. Present for interactivity and slash commands | +| ↳ `message_ts` | string | Timestamp of the message the interaction originated from. Present for block_actions | +| ↳ `hasFiles` | boolean | Whether the message has file attachments | +| ↳ `files` | file[] | File attachments downloaded from the message \(if includeFiles is enabled and bot token is provided\) | + diff --git a/apps/docs/content/docs/en/tools/sqs.mdx b/apps/docs/content/docs/en/integrations/sqs.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sqs.mdx rename to apps/docs/content/docs/en/integrations/sqs.mdx index bd90c95629b..b438a2d681e 100644 --- a/apps/docs/content/docs/en/tools/sqs.mdx +++ b/apps/docs/content/docs/en/integrations/sqs.mdx @@ -35,7 +35,7 @@ Integrate Amazon SQS into the workflow. Can send messages to SQS queues. -## Tools +## Actions ### `sqs_send` diff --git a/apps/docs/content/docs/en/tools/stagehand.mdx b/apps/docs/content/docs/en/integrations/stagehand.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/stagehand.mdx rename to apps/docs/content/docs/en/integrations/stagehand.mdx index c83d0cf5431..13f1f79f0b0 100644 --- a/apps/docs/content/docs/en/tools/stagehand.mdx +++ b/apps/docs/content/docs/en/integrations/stagehand.mdx @@ -36,7 +36,7 @@ Integrate Stagehand into the workflow. Can extract structured data from webpages -## Tools +## Actions ### `stagehand_extract` diff --git a/apps/docs/content/docs/en/tools/stripe.mdx b/apps/docs/content/docs/en/integrations/stripe.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/stripe.mdx rename to apps/docs/content/docs/en/integrations/stripe.mdx index f3667b1bc62..cf53193fcd8 100644 --- a/apps/docs/content/docs/en/tools/stripe.mdx +++ b/apps/docs/content/docs/en/integrations/stripe.mdx @@ -35,7 +35,7 @@ Integrates Stripe into the workflow. Manage payment intents, customers, subscrip -## Tools +## Actions ### `stripe_create_payment_intent` @@ -2809,3 +2809,33 @@ List all Events | ↳ `has_more` | boolean | Whether more items exist beyond this page | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Stripe Webhook + +Triggers when Stripe events occur (payments, subscriptions, invoices, etc.) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `eventTypes` | string | No | Select specific Stripe events to filter. Leave empty to receive all events from Stripe. | +| `webhookSecret` | string | No | Your webhook signing secret from Stripe Dashboard. Used to verify webhook authenticity. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Unique identifier for the event | +| `type` | string | Event type \(e.g., payment_intent.succeeded, customer.created, invoice.paid\) | +| `object` | string | Always "event" | +| `api_version` | string | Stripe API version used to render the event | +| `created` | number | Unix timestamp when the event was created | +| `data` | json | Event data containing the affected Stripe object. Structure varies by event type - access via data.object for the resource \(PaymentIntent, Customer, Invoice, etc.\) | +| `livemode` | boolean | Whether this event occurred in live mode \(true\) or test mode \(false\) | +| `pending_webhooks` | number | Number of webhooks yet to be delivered for this event | +| `request` | json | Information about the API request that triggered this event \(id, idempotency_key\) | + diff --git a/apps/docs/content/docs/en/tools/sts.mdx b/apps/docs/content/docs/en/integrations/sts.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/sts.mdx rename to apps/docs/content/docs/en/integrations/sts.mdx index 6c46a0ba784..89c741398f8 100644 --- a/apps/docs/content/docs/en/tools/sts.mdx +++ b/apps/docs/content/docs/en/integrations/sts.mdx @@ -30,7 +30,7 @@ Integrate AWS STS into the workflow. Assume roles, get temporary credentials, ve -## Tools +## Actions ### `sts_assume_role` diff --git a/apps/docs/content/docs/en/tools/supabase.mdx b/apps/docs/content/docs/en/integrations/supabase.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/supabase.mdx rename to apps/docs/content/docs/en/integrations/supabase.mdx index a076f4e5ee2..46cfa5a9bdb 100644 --- a/apps/docs/content/docs/en/tools/supabase.mdx +++ b/apps/docs/content/docs/en/integrations/supabase.mdx @@ -40,7 +40,7 @@ Integrate Supabase into the workflow. Supports database operations (query, inser -## Tools +## Actions ### `supabase_query` diff --git a/apps/docs/content/docs/en/blocks/table.mdx b/apps/docs/content/docs/en/integrations/table.mdx similarity index 78% rename from apps/docs/content/docs/en/blocks/table.mdx rename to apps/docs/content/docs/en/integrations/table.mdx index e7cf5993704..523d550a01e 100644 --- a/apps/docs/content/docs/en/blocks/table.mdx +++ b/apps/docs/content/docs/en/integrations/table.mdx @@ -1,11 +1,11 @@ --- title: Table -description: User-defined data tables for storing and querying structured data +description: User-defined data tables --- import { BlockInfoCard } from "@/components/ui/block-info-card" - @@ -27,7 +27,6 @@ Tables allow you to create and manage custom data tables directly within Sim. St - Batch operations for bulk inserts - Bulk updates and deletes by filter - Up to 10,000 rows per table, 100 tables per workspace -{/* MANUAL-CONTENT-END */} ## Creating Tables @@ -50,100 +49,77 @@ Tables are created from the **Tables** section in the sidebar. Each table requir - **Required**: Column must have a value (cannot be null) - **Unique**: Values must be unique across all rows (enables upsert matching) +{/* MANUAL-CONTENT-END */} + ## Usage Instructions Create and manage custom data tables. Store, query, and manipulate structured data within workflows. -## Tools - -### `table_query_rows` -Query rows from a table with filtering, sorting, and pagination -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `tableId` | string | Yes | Table ID | -| `filter` | object | No | Filter conditions using MongoDB-style operators | -| `sort` | object | No | Sort order as \{column: "asc"\|"desc"\} | -| `limit` | number | No | Maximum rows to return \(default: 100, max: 1000\) | -| `offset` | number | No | Number of rows to skip \(default: 0\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `success` | boolean | Whether query succeeded | -| `rows` | array | Query result rows | -| `rowCount` | number | Number of rows returned | -| `totalCount` | number | Total rows matching filter | -| `limit` | number | Limit used in query | -| `offset` | number | Offset used in query | +## Actions ### `table_insert_row` -Insert a new row into a table +Insert a new row into a table. IMPORTANT: You must use the #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | -| `data` | object | Yes | Row data as JSON object matching the table schema | +| `data` | object | Yes | Row data as JSON object | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `success` | boolean | Whether row was inserted | -| `row` | object | Inserted row data including generated ID | +| `row` | json | Inserted row data | | `message` | string | Status message | -### `table_upsert_row` - -Insert or update a row based on unique column constraints. If a row with matching unique field exists, update it; otherwise insert a new row. +### `table_batch_insert_rows` #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | -| `data` | object | Yes | Row data to insert or update | +| `rows` | array | Yes | Array of row data objects \(max $\{TABLE_LIMITS.MAX_BATCH_INSERT_SIZE\} rows\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `success` | boolean | Whether row was upserted | -| `row` | object | Upserted row data | -| `operation` | string | Operation performed: "insert" or "update" | +| `success` | boolean | Whether rows were inserted | +| `rows` | array | Inserted rows data | +| `insertedCount` | number | Number of rows inserted | | `message` | string | Status message | -### `table_batch_insert_rows` +### `table_upsert_row` -Insert multiple rows at once (up to 1000 rows per batch) +Insert or update a row based on unique column constraints. If a row with matching unique field exists, update it; otherwise insert a new row. IMPORTANT: You must use the #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | -| `rows` | array | Yes | Array of row data objects to insert | +| `data` | object | Yes | Row data to insert or update | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `success` | boolean | Whether batch insert succeeded | -| `rows` | array | Array of inserted rows with IDs | -| `insertedCount` | number | Number of rows inserted | +| `success` | boolean | Whether row was upserted | +| `row` | json | Upserted row data | +| `operation` | string | Operation performed: insert or update | | `message` | string | Status message | ### `table_update_row` -Update a specific row by its ID +Update an existing row in a table. Supports partial updates - only include the fields you want to change. IMPORTANT: You must use the #### Input @@ -151,41 +127,41 @@ Update a specific row by its ID | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | | `rowId` | string | Yes | Row ID to update | -| `data` | object | Yes | Data to update \(partial update supported\) | +| `data` | object | Yes | Updated row data | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `success` | boolean | Whether row was updated | -| `row` | object | Updated row data | +| `row` | json | Updated row data | | `message` | string | Status message | ### `table_update_rows_by_filter` -Update multiple rows matching a filter condition +Update multiple rows that match filter criteria. Data is merged with existing row data. #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | -| `filter` | object | Yes | Filter to match rows for update | -| `data` | object | Yes | Data to apply to matching rows | -| `limit` | number | No | Maximum rows to update \(default: 1000\) | +| `filter` | object | Yes | Filter criteria using operators like $eq, $ne, $gt, $lt, $contains, $ncontains, $startsWith, $endsWith, $in, $nin, $empty, etc. | +| `data` | object | Yes | Fields to update \(merged with existing data\) | +| `limit` | number | No | Maximum number of rows to update \(default: no limit, max: $\{TABLE_LIMITS.MAX_BULK_OPERATION_SIZE\}\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `success` | boolean | Whether update succeeded | +| `success` | boolean | Whether rows were updated | | `updatedCount` | number | Number of rows updated | | `updatedRowIds` | array | IDs of updated rows | | `message` | string | Status message | ### `table_delete_row` -Delete a specific row by its ID +Delete a row from a table #### Input @@ -199,33 +175,58 @@ Delete a specific row by its ID | Parameter | Type | Description | | --------- | ---- | ----------- | | `success` | boolean | Whether row was deleted | -| `deletedCount` | number | Number of rows deleted \(1 or 0\) | +| `deletedCount` | number | Number of rows deleted | | `message` | string | Status message | ### `table_delete_rows_by_filter` -Delete multiple rows matching a filter condition +Delete multiple rows that match filter criteria. Use with caution - supports optional limit for safety. #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `tableId` | string | Yes | Table ID | -| `filter` | object | Yes | Filter to match rows for deletion | -| `limit` | number | No | Maximum rows to delete \(default: 1000\) | +| `filter` | object | Yes | Filter criteria using operators like $eq, $ne, $gt, $lt, $contains, $ncontains, $startsWith, $endsWith, $in, $nin, $empty, etc. | +| `limit` | number | No | Maximum number of rows to delete \(default: no limit, max: $\{TABLE_LIMITS.MAX_BULK_OPERATION_SIZE\}\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `success` | boolean | Whether delete succeeded | +| `success` | boolean | Whether rows were deleted | | `deletedCount` | number | Number of rows deleted | | `deletedRowIds` | array | IDs of deleted rows | | `message` | string | Status message | +### `table_query_rows` + +Query rows from a table with filtering, sorting, and pagination + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `tableId` | string | Yes | Table ID | +| `filter` | object | No | Filter conditions \(MongoDB-style operators: $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $contains, $ncontains, $startsWith, $endsWith, $empty\) | +| `sort` | object | No | Sort order as \{field: "asc"\|"desc"\} | +| `limit` | number | No | Maximum rows to return \(default: $\{TABLE_LIMITS.DEFAULT_QUERY_LIMIT\}, max: $\{TABLE_LIMITS.MAX_QUERY_LIMIT\}\) | +| `offset` | number | No | Number of rows to skip \(default: 0\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether query succeeded | +| `rows` | array | Query result rows | +| `rowCount` | number | Number of rows returned | +| `totalCount` | number | Total rows matching filter | +| `limit` | number | Limit used in query | +| `offset` | number | Offset used in query | + ### `table_get_row` -Get a single row by its ID +Get a single row by ID #### Input @@ -238,13 +239,13 @@ Get a single row by its ID | Parameter | Type | Description | | --------- | ---- | ----------- | -| `success` | boolean | Whether row was found | -| `row` | object | Row data | +| `success` | boolean | Whether row was retrieved | +| `row` | json | Row data | | `message` | string | Status message | ### `table_get_schema` -Get the schema definition for a table +Get the schema configuration of a table #### Input @@ -258,9 +259,10 @@ Get the schema definition for a table | --------- | ---- | ----------- | | `success` | boolean | Whether schema was retrieved | | `name` | string | Table name | -| `columns` | array | Array of column definitions | +| `columns` | array | Column definitions | | `message` | string | Status message | +{/* MANUAL-CONTENT-START:notes */} ## Filter Operators Filters use MongoDB-style operators for flexible querying: @@ -355,3 +357,4 @@ These can be used in filters and sorting. - Data persists across workflow executions - Use unique constraints to enable upsert functionality - The visual filter/sort builder provides an easy way to construct queries without writing JSON +{/* MANUAL-CONTENT-END */} diff --git a/apps/docs/content/docs/en/tools/tailscale.mdx b/apps/docs/content/docs/en/integrations/tailscale.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/tailscale.mdx rename to apps/docs/content/docs/en/integrations/tailscale.mdx index aa03f5c9b04..e5e97f6b7fe 100644 --- a/apps/docs/content/docs/en/tools/tailscale.mdx +++ b/apps/docs/content/docs/en/integrations/tailscale.mdx @@ -49,7 +49,7 @@ Interact with the Tailscale API to manage devices, DNS, ACLs, auth keys, users, -## Tools +## Actions ### `tailscale_list_devices` diff --git a/apps/docs/content/docs/en/tools/tavily.mdx b/apps/docs/content/docs/en/integrations/tavily.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/tavily.mdx rename to apps/docs/content/docs/en/integrations/tavily.mdx index 1ad4697092b..8665df2415f 100644 --- a/apps/docs/content/docs/en/tools/tavily.mdx +++ b/apps/docs/content/docs/en/integrations/tavily.mdx @@ -31,7 +31,7 @@ Integrate Tavily into the workflow. Can search the web and extract content from -## Tools +## Actions ### `tavily_search` diff --git a/apps/docs/content/docs/en/tools/telegram.mdx b/apps/docs/content/docs/en/integrations/telegram.mdx similarity index 87% rename from apps/docs/content/docs/en/tools/telegram.mdx rename to apps/docs/content/docs/en/integrations/telegram.mdx index 14b61ff1759..d167edcea02 100644 --- a/apps/docs/content/docs/en/tools/telegram.mdx +++ b/apps/docs/content/docs/en/integrations/telegram.mdx @@ -57,7 +57,7 @@ Integrate Telegram into the workflow. Can send and delete messages. Can be used -## Tools +## Actions ### `telegram_message` @@ -377,3 +377,57 @@ Send documents (PDF, ZIP, DOC, etc.) to Telegram channels or users through the T | ↳ `file_size` | number | Size of document file in bytes | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Telegram Webhook + +Trigger workflow from Telegram bot messages and events + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `botToken` | string | Yes | Your Telegram Bot Token from BotFather | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `message` | object | Telegram message data | +| ↳ `id` | number | Telegram message ID | +| ↳ `text` | string | Message text content \(if present\) | +| ↳ `date` | number | Date the message was sent \(Unix timestamp\) | +| ↳ `messageType` | string | Detected content type: text, photo, document, audio, video, voice, sticker, location, contact, poll | +| ↳ `raw` | object | Raw Telegram message object | +| ↳ `message_id` | number | Original Telegram message_id | +| ↳ `date` | number | Original Telegram message date \(Unix timestamp\) | +| ↳ `text` | string | Original Telegram text \(if present\) | +| ↳ `caption` | string | Original Telegram caption \(if present\) | +| ↳ `chat` | object | Chat information | +| ↳ `id` | number | Chat identifier | +| ↳ `username` | string | Chat username \(if available\) | +| ↳ `first_name` | string | First name \(for private chats\) | +| ↳ `last_name` | string | Last name \(for private chats\) | +| ↳ `title` | string | Chat title \(for groups/channels\) | +| ↳ `from` | object | Sender information | +| ↳ `id` | number | Sender user ID | +| ↳ `is_bot` | boolean | Whether the sender is a bot | +| ↳ `first_name` | string | Sender first name | +| ↳ `last_name` | string | Sender last name | +| ↳ `username` | string | Sender username | +| ↳ `language_code` | string | Sender language code \(if available\) | +| ↳ `reply_to_message` | object | Original message being replied to | +| ↳ `entities` | array | Message entities \(mentions, hashtags, URLs, etc.\) | +| `sender` | object | Sender information | +| ↳ `id` | number | Sender user ID | +| ↳ `username` | string | Sender username \(if available\) | +| ↳ `firstName` | string | Sender first name | +| ↳ `lastName` | string | Sender last name | +| ↳ `languageCode` | string | Sender language code \(if available\) | +| ↳ `isBot` | boolean | Whether the sender is a bot | +| `updateId` | number | Update ID for this webhook delivery | +| `updateType` | string | Type of update: message, edited_message, channel_post, edited_channel_post, unknown | + diff --git a/apps/docs/content/docs/en/tools/textract.mdx b/apps/docs/content/docs/en/integrations/textract.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/textract.mdx rename to apps/docs/content/docs/en/integrations/textract.mdx index cd4ee99d6dc..de346ed1462 100644 --- a/apps/docs/content/docs/en/tools/textract.mdx +++ b/apps/docs/content/docs/en/integrations/textract.mdx @@ -31,7 +31,7 @@ Integrate AWS Textract into your workflow to extract text, tables, forms, and ke -## Tools +## Actions ### `textract_parser` diff --git a/apps/docs/content/docs/en/tools/tinybird.mdx b/apps/docs/content/docs/en/integrations/tinybird.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/tinybird.mdx rename to apps/docs/content/docs/en/integrations/tinybird.mdx index f67ac0c2ff0..4de04f0b281 100644 --- a/apps/docs/content/docs/en/tools/tinybird.mdx +++ b/apps/docs/content/docs/en/integrations/tinybird.mdx @@ -34,7 +34,7 @@ Interact with Tinybird: stream JSON or NDJSON events with the Events API, run SQ -## Tools +## Actions ### `tinybird_events` diff --git a/apps/docs/content/docs/en/tools/trello.mdx b/apps/docs/content/docs/en/integrations/trello.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/trello.mdx rename to apps/docs/content/docs/en/integrations/trello.mdx index 012041fed42..6354aa115ad 100644 --- a/apps/docs/content/docs/en/tools/trello.mdx +++ b/apps/docs/content/docs/en/integrations/trello.mdx @@ -41,7 +41,7 @@ Integrate with Trello to list board lists, list cards, create cards, update card -## Tools +## Actions ### `trello_list_lists` diff --git a/apps/docs/content/docs/en/tools/twilio_sms.mdx b/apps/docs/content/docs/en/integrations/twilio_sms.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/twilio_sms.mdx rename to apps/docs/content/docs/en/integrations/twilio_sms.mdx index 42bfc08cb85..4f9cf55dc3a 100644 --- a/apps/docs/content/docs/en/tools/twilio_sms.mdx +++ b/apps/docs/content/docs/en/integrations/twilio_sms.mdx @@ -31,7 +31,7 @@ Integrate Twilio into the workflow. Can send SMS messages. -## Tools +## Actions ### `twilio_send_sms` diff --git a/apps/docs/content/docs/en/tools/twilio_voice.mdx b/apps/docs/content/docs/en/integrations/twilio_voice.mdx similarity index 69% rename from apps/docs/content/docs/en/tools/twilio_voice.mdx rename to apps/docs/content/docs/en/integrations/twilio_voice.mdx index 35b70da38a1..8503857103a 100644 --- a/apps/docs/content/docs/en/tools/twilio_voice.mdx +++ b/apps/docs/content/docs/en/integrations/twilio_voice.mdx @@ -32,7 +32,7 @@ Integrate Twilio Voice into the workflow. Make outbound calls and retrieve call -## Tools +## Actions ### `twilio_voice_make_call` @@ -133,3 +133,58 @@ Retrieve call recording information and transcription (if enabled via TwiML). | `error` | string | Error message if retrieval failed | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Twilio Voice Webhook + +Trigger workflow when phone calls are received via Twilio Voice + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `accountSid` | string | Yes | Your Twilio Account SID from the Twilio Console | +| `authToken` | string | Yes | Your Twilio Auth Token for webhook signature verification | +| `twimlResponse` | string | No | TwiML instructions to return immediately to Twilio. Use square brackets instead of angle brackets \(e.g., \[Response\] instead of <Response>\). This controls what happens when the call comes in \(e.g., play a message, record, gather input\). Your workflow will execute in the background. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `callSid` | string | Unique identifier for this call | +| `accountSid` | string | Twilio Account SID | +| `from` | string | Caller's phone number \(E.164 format\) | +| `to` | string | Recipient phone number \(your Twilio number\) | +| `callStatus` | string | Status of the call \(queued, ringing, in-progress, completed, etc.\) | +| `direction` | string | Call direction: inbound or outbound | +| `apiVersion` | string | Twilio API version | +| `callerName` | string | Caller ID name if available | +| `forwardedFrom` | string | Phone number that forwarded this call | +| `digits` | string | DTMF digits entered by caller \(from <Gather>\) | +| `speechResult` | string | Speech recognition result \(if using <Gather> with speech\) | +| `recordingUrl` | string | URL of call recording if available | +| `recordingSid` | string | Recording SID if available | +| `called` | string | Phone number that was called \(same as "to"\) | +| `caller` | string | Phone number of the caller \(same as "from"\) | +| `toCity` | string | City of the called number | +| `toState` | string | State/province of the called number | +| `toZip` | string | Zip/postal code of the called number | +| `toCountry` | string | Country of the called number | +| `fromCity` | string | City of the caller | +| `fromState` | string | State/province of the caller | +| `fromZip` | string | Zip/postal code of the caller | +| `fromCountry` | string | Country of the caller | +| `calledCity` | string | City of the called number \(same as toCity\) | +| `calledState` | string | State of the called number \(same as toState\) | +| `calledZip` | string | Zip code of the called number \(same as toZip\) | +| `calledCountry` | string | Country of the called number \(same as toCountry\) | +| `callerCity` | string | City of the caller \(same as fromCity\) | +| `callerState` | string | State of the caller \(same as fromState\) | +| `callerZip` | string | Zip code of the caller \(same as fromZip\) | +| `callerCountry` | string | Country of the caller \(same as fromCountry\) | +| `callToken` | string | Twilio call token for authentication | +| `raw` | string | Complete raw webhook payload from Twilio as JSON string | + diff --git a/apps/docs/content/docs/en/tools/typeform.mdx b/apps/docs/content/docs/en/integrations/typeform.mdx similarity index 74% rename from apps/docs/content/docs/en/tools/typeform.mdx rename to apps/docs/content/docs/en/integrations/typeform.mdx index d3e97f913c3..634705632b0 100644 --- a/apps/docs/content/docs/en/tools/typeform.mdx +++ b/apps/docs/content/docs/en/integrations/typeform.mdx @@ -30,7 +30,7 @@ Integrate Typeform into the workflow. Can retrieve responses, download files, an -## Tools +## Actions ### `typeform_responses` @@ -238,3 +238,70 @@ Permanently delete a form and all its responses | `message` | string | Deletion confirmation message | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Typeform Webhook + +Trigger workflow when a Typeform submission is received + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `formId` | string | Yes | The unique identifier for your Typeform. Find it in the form URL or form settings. | +| `apiKey` | string | Yes | Required to automatically register the webhook with Typeform. Get yours at https://admin.typeform.com/account#/section/tokens | +| `secret` | string | No | A secret string used to verify webhook authenticity. Highly recommended for security. Generate a secure random string \(min 20 characters recommended\). | +| `includeDefinition` | boolean | No | Include the complete form structure \(questions, fields, endings\) in your workflow variables. Note: Typeform always sends this data, but enabling this makes it accessible in your workflow. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event_id` | string | Unique identifier for this webhook event | +| `event_type` | string | Type of event \(always "form_response" for form submissions\) | +| `form_id` | string | Typeform form identifier | +| `token` | string | Unique response/submission identifier | +| `submitted_at` | string | ISO timestamp when the form was submitted | +| `landed_at` | string | ISO timestamp when the user first landed on the form | +| `calculated` | object | Calculated values from the form | +| ↳ `score` | number | Calculated score value | +| `variables` | array | Array of dynamic variables | +| ↳ `key` | string | Variable key | +| ↳ `number` | number | Numeric value \(if type is number\) | +| ↳ `text` | string | Text value \(if type is text\) | +| `hidden` | object | Hidden fields passed to the form \(e.g., UTM parameters\) | +| `answers` | array | Array of respondent answers \(only includes answered questions\) | +| ↳ `text` | string | Text answer value | +| ↳ `email` | string | Email answer value | +| ↳ `number` | number | Number answer value | +| ↳ `boolean` | boolean | Boolean answer value | +| ↳ `date` | string | Date answer value \(ISO format\) | +| ↳ `url` | string | URL answer value | +| ↳ `file_url` | string | File URL answer value | +| ↳ `choice` | object | Single choice answer | +| ↳ `id` | string | Choice ID | +| ↳ `ref` | string | Choice reference | +| ↳ `label` | string | Choice label | +| ↳ `choices` | object | Multiple choices answer | +| ↳ `ids` | array | Array of choice IDs | +| ↳ `refs` | array | Array of choice refs | +| ↳ `labels` | array | Array of choice labels | +| ↳ `field` | object | Field reference | +| ↳ `id` | string | Field ID | +| ↳ `ref` | string | Field reference | +| `definition` | object | Form definition \(only included when "Include Form Definition" is enabled\) | +| ↳ `id` | string | Form ID | +| ↳ `title` | string | Form title | +| ↳ `fields` | array | Array of form fields | +| ↳ `id` | string | Field ID | +| ↳ `ref` | string | Field reference | +| ↳ `title` | string | Field title | +| ↳ `endings` | array | Array of form endings | +| `ending` | object | Ending screen information | +| ↳ `id` | string | Ending screen ID | +| ↳ `ref` | string | Ending screen reference | +| `raw` | object | Complete original webhook payload from Typeform | + diff --git a/apps/docs/content/docs/en/tools/upstash.mdx b/apps/docs/content/docs/en/integrations/upstash.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/upstash.mdx rename to apps/docs/content/docs/en/integrations/upstash.mdx index b67affe492e..af14be9fe6c 100644 --- a/apps/docs/content/docs/en/tools/upstash.mdx +++ b/apps/docs/content/docs/en/integrations/upstash.mdx @@ -32,7 +32,7 @@ Connect to Upstash Redis to perform key-value, hash, list, and utility operation -## Tools +## Actions ### `upstash_redis_get` diff --git a/apps/docs/content/docs/en/tools/vercel.mdx b/apps/docs/content/docs/en/integrations/vercel.mdx similarity index 81% rename from apps/docs/content/docs/en/tools/vercel.mdx rename to apps/docs/content/docs/en/integrations/vercel.mdx index 55a62145497..572a8af5626 100644 --- a/apps/docs/content/docs/en/tools/vercel.mdx +++ b/apps/docs/content/docs/en/integrations/vercel.mdx @@ -30,7 +30,7 @@ Integrate with Vercel to manage deployments, projects, domains, DNS records, env -## Tools +## Actions ### `vercel_list_deployments` @@ -1615,3 +1615,348 @@ Get information about the authenticated Vercel user | `hasTrialAvailable` | boolean | Whether a trial is available | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Vercel Deployment Canceled + +Trigger workflow when a deployment is canceled + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | +| `target` | string | Deployment target \(production, staging, or preview\) | +| `plan` | string | Account plan type | +| `domain` | object | domain output from the tool | +| ↳ `name` | string | Domain name | +| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | + + +--- + +### Vercel Deployment Created + +Trigger workflow when a new deployment is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | +| `target` | string | Deployment target \(production, staging, or preview\) | +| `plan` | string | Account plan type | +| `domain` | object | domain output from the tool | +| ↳ `name` | string | Domain name | +| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | + + +--- + +### Vercel Deployment Error + +Trigger workflow when a deployment fails + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | +| `target` | string | Deployment target \(production, staging, or preview\) | +| `plan` | string | Account plan type | +| `domain` | object | domain output from the tool | +| ↳ `name` | string | Domain name | +| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | + + +--- + +### Vercel Deployment Ready + +Trigger workflow when a deployment is ready to serve traffic + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | +| `target` | string | Deployment target \(production, staging, or preview\) | +| `plan` | string | Account plan type | +| `domain` | object | domain output from the tool | +| ↳ `name` | string | Domain name | +| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | + + +--- + +### Vercel Domain Created + +Trigger workflow when a domain is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `domain` | object | domain output from the tool | +| ↳ `name` | string | Domain name | +| ↳ `delegated` | boolean | Whether the domain was delegated/shared \(domain.created\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | + + +--- + +### Vercel Project Created + +Trigger workflow when a new project is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | + + +--- + +### Vercel Project Removed + +Trigger workflow when a project is removed + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `payload` | json | Raw event payload from Vercel | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `project` | object | project output from the tool | +| ↳ `id` | string | Project ID | +| ↳ `name` | string | Project name | +| `team` | object | team output from the tool | +| ↳ `id` | string | Team ID | +| `user` | object | user output from the tool | +| ↳ `id` | string | User ID | + + +--- + +### Vercel Webhook (Common Events) + +Trigger on a curated set of common Vercel events (deployments, projects, domains, edge config). Pick a specific trigger to listen to one event type only. + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Required to create the webhook in Vercel. | +| `teamId` | string | No | Scope webhook to a specific team | +| `filterProjectIds` | string | No | Limit webhook to specific projects | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., deployment.created\) | +| `id` | string | Unique webhook delivery ID \(string\) | +| `createdAt` | number | Event timestamp in milliseconds | +| `region` | string | Region where the event occurred | +| `links` | object | links output from the tool | +| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | +| ↳ `project` | string | Vercel Dashboard URL for the project | +| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | +| `deployment` | object | deployment output from the tool | +| ↳ `id` | string | Deployment ID | +| ↳ `url` | string | Deployment URL | +| ↳ `name` | string | Deployment name | +| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | +| `payload` | json | Full event payload | + diff --git a/apps/docs/content/docs/en/tools/wealthbox.mdx b/apps/docs/content/docs/en/integrations/wealthbox.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/wealthbox.mdx rename to apps/docs/content/docs/en/integrations/wealthbox.mdx index 0d62038f11f..bb16b1c38f2 100644 --- a/apps/docs/content/docs/en/tools/wealthbox.mdx +++ b/apps/docs/content/docs/en/integrations/wealthbox.mdx @@ -32,7 +32,7 @@ Integrate Wealthbox into the workflow. Can read and write notes, read and write -## Tools +## Actions ### `wealthbox_read_note` diff --git a/apps/docs/content/docs/en/tools/webflow.mdx b/apps/docs/content/docs/en/integrations/webflow.mdx similarity index 56% rename from apps/docs/content/docs/en/tools/webflow.mdx rename to apps/docs/content/docs/en/integrations/webflow.mdx index 4d43da96c46..c508d71c66b 100644 --- a/apps/docs/content/docs/en/tools/webflow.mdx +++ b/apps/docs/content/docs/en/integrations/webflow.mdx @@ -32,7 +32,7 @@ Integrates Webflow CMS into the workflow. Can create, get, list, update, or dele -## Tools +## Actions ### `webflow_list_items` @@ -143,3 +143,123 @@ Delete an item from a Webflow CMS collection | `metadata` | json | Metadata about the deletion | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Collection Item Changed + +Trigger workflow when an item is updated in a Webflow CMS collection (requires Webflow credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | +| `triggerSiteId` | string | Yes | The Webflow site to monitor | +| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `siteId` | string | The site ID where the event occurred | +| `collectionId` | string | The collection ID where the item was changed | +| `payload` | object | payload output from the tool | +| ↳ `id` | string | The ID of the changed item | +| ↳ `cmsLocaleId` | string | CMS locale ID | +| ↳ `lastPublished` | string | Last published timestamp | +| ↳ `lastUpdated` | string | Last updated timestamp | +| ↳ `createdOn` | string | Timestamp when the item was created | +| ↳ `isArchived` | boolean | Whether the item is archived | +| ↳ `isDraft` | boolean | Whether the item is a draft | +| ↳ `fieldData` | object | The updated field data of the item | + + +--- + +### Collection Item Created + +Trigger workflow when a new item is created in a Webflow CMS collection (requires Webflow credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | +| `triggerSiteId` | string | Yes | The Webflow site to monitor | +| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `siteId` | string | The site ID where the event occurred | +| `collectionId` | string | The collection ID where the item was created | +| `payload` | object | payload output from the tool | +| ↳ `id` | string | The ID of the created item | +| ↳ `cmsLocaleId` | string | CMS locale ID | +| ↳ `lastPublished` | string | Last published timestamp | +| ↳ `lastUpdated` | string | Last updated timestamp | +| ↳ `createdOn` | string | Timestamp when the item was created | +| ↳ `isArchived` | boolean | Whether the item is archived | +| ↳ `isDraft` | boolean | Whether the item is a draft | +| ↳ `fieldData` | object | The field data of the item | + + +--- + +### Collection Item Deleted + +Trigger workflow when an item is deleted from a Webflow CMS collection (requires Webflow credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | +| `triggerSiteId` | string | Yes | The Webflow site to monitor | +| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `siteId` | string | The site ID where the event occurred | +| `collectionId` | string | The collection ID where the item was deleted | +| `payload` | object | payload output from the tool | +| ↳ `id` | string | The ID of the deleted item | +| ↳ `deletedOn` | string | Timestamp when the item was deleted | + + +--- + +### Form Submission + +Trigger workflow when a form is submitted on a Webflow site (requires Webflow credentials) + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | +| `triggerSiteId` | string | Yes | The Webflow site to monitor | +| `formName` | string | No | The name of the specific form to monitor \(optional - leave empty for all forms\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `siteId` | string | The site ID where the form was submitted | +| `formId` | string | The form ID | +| `name` | string | The name of the form | +| `id` | string | The unique ID of the form submission | +| `submittedAt` | string | Timestamp when the form was submitted | +| `data` | object | The form submission field data \(keys are field names, values are submitted data\) | +| `schema` | array | Form schema describing each field | +| ↳ `fieldName` | string | Name of the form field | +| ↳ `fieldType` | string | Type of input \(e.g., FormTextInput, FormEmail\) | +| ↳ `fieldElementId` | string | Unique identifier for the form element \(UUID\) | +| `formElementId` | string | The form element ID | + diff --git a/apps/docs/content/docs/en/tools/whatsapp.mdx b/apps/docs/content/docs/en/integrations/whatsapp.mdx similarity index 56% rename from apps/docs/content/docs/en/tools/whatsapp.mdx rename to apps/docs/content/docs/en/integrations/whatsapp.mdx index be8015ba50e..d7db0f573a1 100644 --- a/apps/docs/content/docs/en/tools/whatsapp.mdx +++ b/apps/docs/content/docs/en/integrations/whatsapp.mdx @@ -30,7 +30,7 @@ Integrate WhatsApp into the workflow. Can send messages. -## Tools +## Actions ### `whatsapp_send_message` @@ -60,3 +60,41 @@ Send a text message through the WhatsApp Cloud API. | ↳ `wa_id` | string | WhatsApp user ID associated with the recipient | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### WhatsApp Webhook + +Trigger workflow from WhatsApp incoming messages and message status webhooks + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `verificationToken` | string | Yes | Enter any secure token here. You | +| `appSecret` | string | Yes | Required for WhatsApp POST signature verification. Sim uses it to validate the X-Hub-Signature-256 header on every webhook delivery. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventType` | string | Webhook classification such as incoming_message, message_status, or mixed | +| `messageId` | string | First WhatsApp message identifier \(wamid\) found in the webhook batch | +| `from` | string | Sender phone number from the first incoming message in the batch | +| `recipientId` | string | Recipient phone number from the first status update in the batch | +| `phoneNumberId` | string | Business phone number ID from the first message or status item in the batch | +| `displayPhoneNumber` | string | Business display phone number from the first message or status item in the batch | +| `text` | string | Text body from the first incoming text message in the batch | +| `timestamp` | string | Timestamp from the first message or status item in the batch | +| `messageType` | string | Type of the first incoming message in the batch \(text, image, system, etc.\) | +| `status` | string | First outgoing message status in the batch, such as sent, delivered, read, or failed | +| `contact` | json | First sender contact in the batch \(wa_id, profile.name\) | +| `webhookContacts` | json | All sender contact profiles from the webhook batch | +| `messages` | json | All incoming message objects from the webhook batch, flattened across entries/changes | +| `statuses` | json | All message status objects from the webhook batch, flattened across entries/changes | +| `conversation` | json | Conversation metadata from the first status update in the batch \(id, expiration_timestamp, origin.type\) | +| `pricing` | json | Pricing metadata from the first status update in the batch \(billable, pricing_model, category\) | +| `raw` | json | Complete structured webhook payload from WhatsApp | + diff --git a/apps/docs/content/docs/en/tools/wikipedia.mdx b/apps/docs/content/docs/en/integrations/wikipedia.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/wikipedia.mdx rename to apps/docs/content/docs/en/integrations/wikipedia.mdx index 919f54973c5..f3c0ce2245a 100644 --- a/apps/docs/content/docs/en/tools/wikipedia.mdx +++ b/apps/docs/content/docs/en/integrations/wikipedia.mdx @@ -30,7 +30,7 @@ Integrate Wikipedia into the workflow. Can get page summary, search pages, get p -## Tools +## Actions ### `wikipedia_summary` diff --git a/apps/docs/content/docs/en/tools/wiza.mdx b/apps/docs/content/docs/en/integrations/wiza.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/wiza.mdx rename to apps/docs/content/docs/en/integrations/wiza.mdx index dd077371433..38da4cfd839 100644 --- a/apps/docs/content/docs/en/tools/wiza.mdx +++ b/apps/docs/content/docs/en/integrations/wiza.mdx @@ -68,7 +68,7 @@ Integrates Wiza into the workflow. Search prospects, enrich companies, reveal ve -## Tools +## Actions ### `wiza_prospect_search` diff --git a/apps/docs/content/docs/en/tools/wordpress.mdx b/apps/docs/content/docs/en/integrations/wordpress.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/wordpress.mdx rename to apps/docs/content/docs/en/integrations/wordpress.mdx index 38f6688f005..32bdf1606ed 100644 --- a/apps/docs/content/docs/en/tools/wordpress.mdx +++ b/apps/docs/content/docs/en/integrations/wordpress.mdx @@ -33,7 +33,7 @@ Integrate with WordPress to create, update, and manage posts, pages, media, comm -## Tools +## Actions ### `wordpress_create_post` diff --git a/apps/docs/content/docs/en/tools/workday.mdx b/apps/docs/content/docs/en/integrations/workday.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/workday.mdx rename to apps/docs/content/docs/en/integrations/workday.mdx index 14feff6d9a7..35652e80e9b 100644 --- a/apps/docs/content/docs/en/tools/workday.mdx +++ b/apps/docs/content/docs/en/integrations/workday.mdx @@ -16,7 +16,7 @@ Integrate Workday HRIS into your workflow. Create pre-hires, hire employees, man -## Tools +## Actions ### `workday_get_worker` diff --git a/apps/docs/content/docs/en/tools/x.mdx b/apps/docs/content/docs/en/integrations/x.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/x.mdx rename to apps/docs/content/docs/en/integrations/x.mdx index 7ab8a64d080..b4a22a8654a 100644 --- a/apps/docs/content/docs/en/tools/x.mdx +++ b/apps/docs/content/docs/en/integrations/x.mdx @@ -33,7 +33,7 @@ Integrate X into the workflow. Search tweets, manage bookmarks, follow/block/mut -## Tools +## Actions ### `x_create_tweet` diff --git a/apps/docs/content/docs/en/tools/youtube.mdx b/apps/docs/content/docs/en/integrations/youtube.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/youtube.mdx rename to apps/docs/content/docs/en/integrations/youtube.mdx index dd89c95bbb8..8d7351d3180 100644 --- a/apps/docs/content/docs/en/tools/youtube.mdx +++ b/apps/docs/content/docs/en/integrations/youtube.mdx @@ -30,7 +30,7 @@ Integrate YouTube into the workflow. Can search for videos, get trending videos, -## Tools +## Actions ### `youtube_channel_info` diff --git a/apps/docs/content/docs/en/tools/zendesk.mdx b/apps/docs/content/docs/en/integrations/zendesk.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/zendesk.mdx rename to apps/docs/content/docs/en/integrations/zendesk.mdx index 3c3708e3727..dd534df6134 100644 --- a/apps/docs/content/docs/en/tools/zendesk.mdx +++ b/apps/docs/content/docs/en/integrations/zendesk.mdx @@ -49,7 +49,7 @@ Integrate Zendesk into the workflow. Can get tickets, get ticket, create ticket, -## Tools +## Actions ### `zendesk_get_tickets` diff --git a/apps/docs/content/docs/en/tools/zep.mdx b/apps/docs/content/docs/en/integrations/zep.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/zep.mdx rename to apps/docs/content/docs/en/integrations/zep.mdx index 27c29b88625..9e99d07455f 100644 --- a/apps/docs/content/docs/en/tools/zep.mdx +++ b/apps/docs/content/docs/en/integrations/zep.mdx @@ -34,7 +34,7 @@ Integrate Zep for long-term memory management. Create threads, add messages, ret -## Tools +## Actions ### `zep_create_thread` diff --git a/apps/docs/content/docs/en/tools/zerobounce.mdx b/apps/docs/content/docs/en/integrations/zerobounce.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/zerobounce.mdx rename to apps/docs/content/docs/en/integrations/zerobounce.mdx index fd212b281de..6deb7ee53f5 100644 --- a/apps/docs/content/docs/en/tools/zerobounce.mdx +++ b/apps/docs/content/docs/en/integrations/zerobounce.mdx @@ -21,7 +21,7 @@ Integrate ZeroBounce to validate email deliverability in real time — detect in -## Tools +## Actions ### `zerobounce_verify_email` diff --git a/apps/docs/content/docs/en/tools/zoom.mdx b/apps/docs/content/docs/en/integrations/zoom.mdx similarity index 83% rename from apps/docs/content/docs/en/tools/zoom.mdx rename to apps/docs/content/docs/en/integrations/zoom.mdx index 4926fd24973..3010e9f611e 100644 --- a/apps/docs/content/docs/en/tools/zoom.mdx +++ b/apps/docs/content/docs/en/integrations/zoom.mdx @@ -39,7 +39,7 @@ Integrate Zoom into workflows. Create, list, update, and delete Zoom meetings. G -## Tools +## Actions ### `zoom_create_meeting` @@ -418,3 +418,141 @@ List participants from a past Zoom meeting | ↳ `nextPageToken` | string | Token for next page of results | + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Zoom Meeting Ended + +Trigger workflow when a Zoom meeting ends + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(e.g., meeting.started\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | object | payload output from the tool | +| ↳ `account_id` | string | Zoom account ID | +| ↳ `object` | object | Meeting details \(shape aligns with Zoom Meetings webhook object fields\) | + + +--- + +### Zoom Meeting Started + +Trigger workflow when a Zoom meeting starts + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(e.g., meeting.started\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | object | payload output from the tool | +| ↳ `account_id` | string | Zoom account ID | +| ↳ `object` | object | Meeting details \(shape aligns with Zoom Meetings webhook object fields\) | + + +--- + +### Zoom Participant Joined + +Trigger workflow when a participant joins a Zoom meeting + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(e.g., meeting.participant_joined\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | object | payload output from the tool | +| ↳ `account_id` | string | Zoom account ID | +| ↳ `object` | object | Meeting and participant details | + + +--- + +### Zoom Participant Left + +Trigger workflow when a participant leaves a Zoom meeting + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(e.g., meeting.participant_joined\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | object | payload output from the tool | +| ↳ `account_id` | string | Zoom account ID | +| ↳ `object` | object | Meeting and participant details | + + +--- + +### Zoom Recording Completed + +Trigger workflow when a Zoom cloud recording is completed + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(recording.completed\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | object | payload output from the tool | +| ↳ `account_id` | string | Zoom account ID | +| ↳ `object` | object | Cloud recording details \(aligns with Zoom cloud recording objects\) | + + +--- + +### Zoom Webhook (All Events) + +Trigger workflow on any Zoom webhook event + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretToken` | string | Yes | Found in your Zoom app | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | string | The webhook event type \(e.g., meeting.started, recording.completed\) | +| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | +| `payload` | json | Complete webhook payload \(structure varies by event type\) | + diff --git a/apps/docs/content/docs/en/tools/zoominfo.mdx b/apps/docs/content/docs/en/integrations/zoominfo.mdx similarity index 99% rename from apps/docs/content/docs/en/tools/zoominfo.mdx rename to apps/docs/content/docs/en/integrations/zoominfo.mdx index 7383d782bd9..b0a394272f4 100644 --- a/apps/docs/content/docs/en/tools/zoominfo.mdx +++ b/apps/docs/content/docs/en/integrations/zoominfo.mdx @@ -40,7 +40,7 @@ Integrates ZoomInfo into the workflow. Search companies and contacts, enrich fir -## Tools +## Actions ### `zoominfo_search_companies` diff --git a/apps/docs/content/docs/en/introduction/index.mdx b/apps/docs/content/docs/en/introduction/index.mdx index b9e783df711..066a22845ba 100644 --- a/apps/docs/content/docs/en/introduction/index.mdx +++ b/apps/docs/content/docs/en/introduction/index.mdx @@ -1,5 +1,6 @@ --- title: Introduction +description: Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. --- import { Card, Cards } from 'fumadocs-ui/components/card' @@ -8,112 +9,88 @@ import { Image } from '@/components/ui/image' import { Video } from '@/components/ui/video' import { FAQ } from '@/components/ui/faq' -Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Create agents visually with the workflow builder, conversationally through Mothership, or programmatically with the API. Connect AI models, databases, APIs, and 1,000+ business tools to build agents that automate real work — from chatbots and compliance agents to data pipelines and ITSM automation. +Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. You build by describing what you want to **Mothership**, the natural-language control plane, or visually in the workflow builder, or programmatically with the API. Connect AI models, databases, APIs, and 1,000+ business tools to build agents that automate real work.
Sim visual workflow canvas
-## What You Can Build +## How you build -**AI Assistants & Chatbots** -Build intelligent conversational agents that integrate with your tools and data. Enable capabilities like web search, calendar management, email automation, and seamless interaction with business systems. +When you open Sim, the first thing you meet is **Mothership**, a chat box over your whole workspace. You describe the system you want, and Mothership scaffolds it: workflows, tables, knowledge bases, and the wiring between them. You then open what it built, run it, and refine it. -**Business Process Automation** -Eliminate manual tasks across your organization. Automate data entry, generate reports, respond to customer inquiries, and streamline content creation workflows. +- **Mothership.** Describe a system in natural language and it creates and edits the resources for you. The fastest way to start. +- **Workflow builder.** Design agent logic visually by connecting blocks in the builder. The clearest way to see and fine-tune what runs. +- **API and SDK.** Build and trigger agents programmatically. -**Data Processing & Analysis** -Transform raw data into actionable insights. Extract information from documents, perform dataset analysis, generate automated reports, and synchronize data across platforms. +You can mix these on one system, scaffolding with Mothership and then fine-tuning in the builder. -**API Integration Workflows** -Orchestrate complex multi-service interactions. Create unified API endpoints, implement sophisticated business logic, and build event-driven automation systems. + +Mothership generates the architecture, and you verify the execution. Even when you build conversationally, it helps to understand the resources Mothership creates, so you can inspect, run, and improve them. + -
-
- -## How It Works - -**Visual Workflow Builder** -Design agent logic using an intuitive drag-and-drop canvas. Connect AI models, databases, APIs, and third-party services through a visual interface that makes complex automation easy to understand and maintain. - -**Modular Block System** -Build with specialized components: processing blocks (AI agents, API calls, custom functions), logic blocks (conditional branching, loops, routers), and output blocks (responses, evaluators). Each block handles a specific task in your workflow. +## The anatomy of a workspace -**Flexible Execution Triggers** -Launch workflows through multiple channels including chat interfaces, REST APIs, webhooks, scheduled cron jobs, or external events from platforms like Slack and GitHub. +A Sim system is not a single chat response. It is a set of resources that live in a **workspace** and connect to each other. The sidebar mirrors that anatomy, and these are its parts. -**Real-time Collaboration** -Enable your team to build together. Multiple users can edit workflows simultaneously with live updates and granular permission controls. +- **[Mothership](/mothership)** is the natural-language control plane. You describe what you want, and it builds and edits the resources for you. +- **[Workflows](/workflows)** are visual programs made of blocks, where your logic runs. Most other resources become useful through a workflow. +- **[Agents and tools](/building-agents)** are how a workflow acts. An agent reasons with a model, and tools let it take actions like sending an email or querying an API. +- **[Tables](/tables)** hold structured rows your workflows read, write, and process. +- **[Knowledge bases](/knowledgebase)** are searchable memory. An agent retrieves relevant passages from your documents to ground its answers. +- **[Files](/files)** are the documents and media your workflows store, read, and produce. +- **[Deployments](/deployment)** expose a workflow to the outside world as an API, a chat, or an MCP server. +- **[Logs](/logs-debugging)** record every run, block by block, so you can verify what happened.
-## Integrations - -Sim provides native integrations with 1,000+ services across multiple categories: - -- **AI Models**: OpenAI, Anthropic, Google Gemini, Groq, Cerebras, local models via Ollama or VLLM -- **Communication**: Gmail, Slack, Microsoft Teams, Telegram, WhatsApp -- **Productivity**: Notion, Google Workspace, Airtable -- **Development**: GitHub, Jira, Linear, automated browser testing -- **Search & Data**: Google Search, Perplexity, Firecrawl, Exa AI -- **Databases**: PostgreSQL, MySQL, Supabase, Pinecone, Qdrant - -For custom integrations, leverage our [MCP (Model Context Protocol) support](/mcp) to connect any external service or tool. - -
-
- -## Copilot - -**Ask Questions & Get Guidance** -Copilot answers questions about Sim, explains your workflows, and provides suggestions for improvements. Use the `@` symbol to reference workflows, blocks, documentation, knowledge, and logs for contextual assistance. +## What you can build -**Build & Edit Workflows** -Switch to Agent mode to let Copilot propose and apply changes directly to your canvas. Add blocks, configure settings, wire variables, and restructure workflows with natural language commands. +- **AI assistants and chatbots.** Conversational agents that search the web, manage calendars, send email, and act on your business systems. +- **Business process automation.** Data entry, report generation, customer responses, and content workflows. +- **Data processing and analysis.** Extract from documents, analyze datasets, and sync data across platforms. +- **API integration workflows.** Unified endpoints that orchestrate multi-service logic and event-driven automation. -**Adaptive Reasoning Levels** -Choose from Fast, Auto, Advanced, or Behemoth modes depending on task complexity. Start with Fast for simple questions, scale up to Behemoth for complex architectural changes and deep debugging. - -Learn more about [Copilot capabilities](/copilot) and how to maximize productivity with AI assistance. +## Integrations -
-
+Sim provides native integrations with 1,000+ services: -## Deployment Options +- **AI models.** OpenAI, Anthropic, Google Gemini, Groq, Cerebras, and local models via Ollama or VLLM. +- **Communication.** Gmail, Slack, Microsoft Teams, Telegram, WhatsApp. +- **Productivity.** Notion, Google Workspace, Airtable. +- **Development.** GitHub, Jira, Linear, automated browser testing. +- **Search and data.** Google Search, Perplexity, Firecrawl, Exa AI. +- **Databases.** PostgreSQL, MySQL, Supabase, Pinecone, Qdrant. -**Cloud-Hosted** -Launch immediately at [sim.ai](https://sim.ai) with fully managed infrastructure, automatic scaling, and built-in observability. Focus on building workflows while we handle the operations. +For anything not built in, [MCP support](/mcp) connects any external service or tool. -**Self-Hosted** -Deploy on your own infrastructure using Docker Compose or Kubernetes. Maintain complete control over your data with support for local AI models through Ollama integration. +## Deployment options -## Next Steps +- **Cloud-hosted.** Launch immediately at [sim.ai](https://sim.ai) with managed infrastructure, scaling, and observability. +- **Self-hosted.** Deploy on your own infrastructure with Docker Compose or Kubernetes, with support for local models. -Ready to build your first AI agent? +## Next steps - + Build your first agent in 10 minutes - - Learn about the building blocks + + Create and operate your workspace in natural language - - Explore 1,000+ integrations + + The executable center, and the blocks it's built from - - Set up workspace roles and permissions + + The building blocks of a workflow @@ -121,9 +98,9 @@ Ready to build your first AI agent? { question: "Is Sim free to use?", answer: "Sim offers a free Community plan with 1,000 one-time credits to get started. Paid plans start at $25/month (Pro) with 5,000 credits and go up to $100/month (Max) with 20,000 credits. Annual billing is available at a 15% discount. You can also self-host Sim for free on your own infrastructure." }, { question: "Is Sim open source?", answer: "Yes. Sim is open source under the Apache 2.0 license. The full source code is available on GitHub and you can self-host it, contribute to development, or modify it for your own needs. Enterprise features (SSO, access control) have a separate license that requires a subscription for production use." }, { question: "Which AI models and providers are supported?", answer: "Sim supports 15+ providers including OpenAI, Anthropic, Google Gemini, Groq, Cerebras, DeepSeek, Mistral, xAI, and OpenRouter. You can also run local models through Ollama or VLLM at no API cost. Bring Your Own Key (BYOK) is supported so you can use your own API keys at base provider pricing with no markup." }, - { question: "Do I need coding experience to use Sim?", answer: "No. Sim lets you build agents visually by dragging blocks onto a canvas and connecting them, or conversationally through Mothership using natural language. For advanced use cases, the Function block lets you write custom JavaScript, and the full API/SDK is available for programmatic access." }, + { question: "Do I need coding experience to use Sim?", answer: "No. Sim lets you build agents conversationally through Mothership using natural language, or visually by connecting blocks in the workflow builder. For advanced use cases, the Function block lets you write custom JavaScript, and the full API/SDK is available for programmatic access." }, { question: "Can I self-host Sim?", answer: "Yes. Sim provides Docker Compose configurations for self-hosted deployments. The stack includes the Sim application, a PostgreSQL database with pgvector, and a realtime collaboration server. You can also integrate local AI models via Ollama for a fully offline setup." }, { question: "Is there a limit on how many workflows I can create?", answer: "There is no limit on the number of workflows you can create on any plan. Usage limits apply to execution credits, rate limits, and file storage, which vary by plan tier." }, { question: "What integrations are available?", answer: "Sim offers 1,000+ native integrations across categories including AI models, communication tools (Gmail, Slack, Teams, Telegram), productivity apps (Notion, Google Workspace, Airtable), development tools (GitHub, Jira, Linear), search services (Google Search, Perplexity, Exa), and databases (PostgreSQL, Supabase, Pinecone). For anything not built in, you can use the MCP (Model Context Protocol) support to connect custom services." }, - { question: "How does Sim compare to other AI agent builders?", answer: "Sim is an AI workspace — not just a workflow tool or an agent framework. It combines a visual workflow builder, Mothership for natural-language agent creation, knowledge bases, tables, and full observability in one environment. Teams build agents visually, conversationally, or with code, then deploy and manage them with enterprise governance, real-time collaboration, and staging-to-production workflows." }, + { question: "How does Sim compare to other AI agent builders?", answer: "Sim is an AI workspace, not just a workflow tool or an agent framework. It combines Mothership for natural-language agent creation, a visual workflow builder, knowledge bases, tables, and full observability in one environment. Teams build agents visually, conversationally, or with code, then deploy and manage them with enterprise governance, real-time collaboration, and staging-to-production workflows." }, ]} /> diff --git a/apps/docs/content/docs/en/keyboard-shortcuts/index.mdx b/apps/docs/content/docs/en/keyboard-shortcuts/index.mdx index c5459d6369b..c22f4e3d1e2 100644 --- a/apps/docs/content/docs/en/keyboard-shortcuts/index.mdx +++ b/apps/docs/content/docs/en/keyboard-shortcuts/index.mdx @@ -1,65 +1,94 @@ --- title: Keyboard Shortcuts -description: Master the workflow canvas with keyboard shortcuts and mouse controls +description: Keyboard and mouse shortcuts for the workflow editor and for tables. --- import { Callout } from 'fumadocs-ui/components/callout' -Speed up your workflow building with these keyboard shortcuts and mouse controls. All shortcuts work when the canvas is focused (not when typing in an input field). +Sim has keyboard shortcuts for the workflow editor and for tables. Each set works when that surface is focused and you are not typing in a field. - **Mod** refers to `Cmd` on macOS and `Ctrl` on Windows/Linux. + **Mod** is `Cmd` on macOS and `Ctrl` on Windows and Linux. -## Canvas Controls +## Workflow editor -### Mouse Controls +### Mouse | Action | Control | |--------|---------| -| Pan/move canvas | Left-drag on empty space | -| Pan/move canvas | Scroll or trackpad | -| Select multiple blocks | Right-drag to draw selection box | -| Drag block | Left-drag on block header | +| Pan the canvas | Left-drag on empty space, or scroll / trackpad | +| Select multiple blocks | Right-drag to draw a selection box | +| Drag a block | Left-drag on the block header | | Add to selection | `Mod` + click on blocks | -### Workflow Actions +### Actions | Shortcut | Action | |----------|--------| -| `Mod` + `Enter` | Run workflow (or cancel if running) | +| `Mod` + `Enter` | Run the workflow (or cancel if running) | | `Mod` + `Z` | Undo | | `Mod` + `Shift` + `Z` | Redo | -| `Mod` + `C` | Copy selected blocks | -| `Mod` + `X` | Cut selected blocks | -| `Mod` + `V` | Paste blocks | +| `Mod` + `C` / `X` / `V` | Copy / cut / paste selected blocks | | `Delete` or `Backspace` | Delete selected blocks or edges | -| `Shift` + `L` | Auto-layout canvas | +| `Shift` + `L` | Auto-layout the canvas | | `Mod` + `Shift` + `F` | Fit to view | -| `Mod` + `F` | Open workflow search and replace | +| `Mod` + `F` | Search and replace in the workflow | | `Mod` + `Shift` + `Enter` | Accept Copilot changes | +| `Mod` + `Alt` + `F` | Focus the Toolbar search | -## Panel Navigation +## Tables -These shortcuts switch between panel tabs on the right side of the canvas. +These work when a table is focused and no cell is being edited. + +### Navigation | Shortcut | Action | |----------|--------| -| `Mod` + `Alt` + `F` | Focus Toolbar search | +| Arrow keys | Move one cell | +| `Mod` + Arrow keys | Jump to the edge of the table | +| `Tab` / `Shift` + `Tab` | Move to the next / previous cell | +| `Escape` | Clear the selection | -## Global Navigation +### Selection | Shortcut | Action | |----------|--------| -| `Mod` + `K` | Open search | -| `Mod` + `Shift` + `A` | Add new agent workflow | -| `Mod` + `Y` | Go to templates | -| `Mod` + `L` | Go to logs | +| `Shift` + Arrow keys | Extend the selection by one cell | +| `Mod` + `Shift` + Arrow keys | Extend the selection to the edge | +| `Mod` + `A` | Select all rows | +| `Shift` + `Space` | Toggle the current row's selection | -## Utility +### Editing | Shortcut | Action | |----------|--------| -| `Mod` + `D` | Clear terminal console | -| `Mod` + `E` | Clear notifications | +| `Enter` or `F2` | Start editing the selected cell | +| Any character | Start editing with that character | +| `Escape` | Cancel editing | +| `Shift` + `Enter` | Insert a new row below | +| `Space` | Expand row details | + +### Clipboard +| Shortcut | Action | +|----------|--------| +| `Mod` + `C` / `X` / `V` | Copy / cut / paste cells | +| `Delete` or `Backspace` | Clear the selected cells | + +### History + +| Shortcut | Action | +|----------|--------| +| `Mod` + `Z` | Undo | +| `Mod` + `Shift` + `Z` or `Mod` + `Y` | Redo | + +## Global + +| Shortcut | Action | +|----------|--------| +| `Mod` + `K` | Open search | +| `Mod` + `Shift` + `A` | Add a new agent workflow | +| `Mod` + `L` | Go to logs | +| `Mod` + `D` | Clear the terminal console | +| `Mod` + `E` | Clear notifications | diff --git a/apps/docs/content/docs/en/knowledgebase/chunking-strategies.mdx b/apps/docs/content/docs/en/knowledgebase/chunking-strategies.mdx index 159b636edc3..efe2f689898 100644 --- a/apps/docs/content/docs/en/knowledgebase/chunking-strategies.mdx +++ b/apps/docs/content/docs/en/knowledgebase/chunking-strategies.mdx @@ -1,24 +1,25 @@ --- -title: Chunking Strategies -description: How Sim splits documents into searchable chunks, and which strategy to pick for your content +title: Chunking strategies +description: The chunking settings and strategies, for the rare case you need to override Auto. +pageType: reference --- +import { Callout } from 'fumadocs-ui/components/callout' import { FAQ } from '@/components/ui/faq' -Sim splits every uploaded document into chunks before generating embeddings. The strategy controls *where* those splits happen. + +**Advanced.** Leave the strategy on **Auto** and the settings on their defaults unless you have a specific reason to change them and know how chunk boundaries affect retrieval. Auto inspects each file and routes it to the right chunker on its own. The rest of this page is for the case where you've confirmed Auto isn't producing the chunks you want. + -## How chunking works +If you do override Auto, the short version: -Every chunker follows a two-phase pattern: +- Sentence integrity matters (Q&A, legal text) → **[Sentence](#sentence)** +- Content has structural markers Text misses (code, custom formats) → **[Recursive](#recursive)** +- You need uniform chunk sizes → **[Token](#token)** +- Content has explicit delimiters → **[Regex](#regex)** +- Each record must be its own chunk → **[convert to JSONL](#one-record-per-chunk)** -1. **Split** — break the document at boundaries (paragraphs, sentences, tokens, or a custom regex) -2. **Pack** — merge adjacent splits up to the maximum chunk size - -This is documented in [LangChain's text splitter guide](https://python.langchain.com/docs/concepts/text_splitters/), which states the principle: *"no resulting merged split should exceed the designated chunk size."* LlamaIndex, Chonkie, and Unstructured follow the same convention. - -The packing step is what keeps chunks roughly uniform. It also means a chunk usually spans multiple splits — a precise split boundary is not the same as a chunk boundary. Most "why is my regex not producing one chunk per match" surprises trace back to this. - -## Configuration shared by all strategies +## Settings | Setting | Unit | Default | Range | Description | |---------|------|---------|-------|-------------| @@ -26,7 +27,9 @@ The packing step is what keeps chunks roughly uniform. It also means a chunk usu | Min Chunk Size | characters | 100 | 100–2,000 | Tiny fragments below this are dropped. | | Overlap | tokens | 200 | 0–500 | Tokens repeated between adjacent chunks to preserve context. | -[Pinecone's chunking guide](https://www.pinecone.io/learn/chunking-strategies/) covers the tradeoffs in size and overlap. +[Pinecone's chunking guide](https://www.pinecone.io/learn/chunking-strategies/) covers the size and overlap tradeoffs. + +Every strategy splits the document at boundaries, then packs adjacent splits together up to the max chunk size, so a chunk usually spans several splits and a split boundary is not a chunk boundary. This is why a precise [Regex](#regex) can still produce chunks containing multiple matches. ## Strategies @@ -91,18 +94,6 @@ This matches the `join=False` knob in [txtai](https://neuml.github.io/txtai/) an Turn it on when each match is a discrete record (one QA pair, one log entry) and you need each isolated for retrieval. -## How to choose - -Pick **Auto** unless you have a reason not to. - -If Auto isn't right: - -- Sentence integrity matters → **Sentence** -- Your content has structural markers Text doesn't know about → **Recursive** -- You need uniform chunk sizes → **Token** -- You have explicit delimiters → **Regex** -- Each record must be its own chunk → see below - ## One record per chunk Each record (each QA pair, each log line, each row) as its own chunk is structural chunking, not regex chunking. Two paths: diff --git a/apps/docs/content/docs/en/knowledgebase/connectors.mdx b/apps/docs/content/docs/en/knowledgebase/connectors.mdx index 2f9de16cfa2..af47da0818f 100644 --- a/apps/docs/content/docs/en/knowledgebase/connectors.mdx +++ b/apps/docs/content/docs/en/knowledgebase/connectors.mdx @@ -1,6 +1,7 @@ --- title: Connectors description: Automatically sync documents from external sources into your knowledge base +pageType: guide --- import { Callout } from 'fumadocs-ui/components/callout' diff --git a/apps/docs/content/docs/en/knowledgebase/debugging-retrieval.mdx b/apps/docs/content/docs/en/knowledgebase/debugging-retrieval.mdx new file mode 100644 index 00000000000..bfada4d3845 --- /dev/null +++ b/apps/docs/content/docs/en/knowledgebase/debugging-retrieval.mdx @@ -0,0 +1,95 @@ +--- +title: Debugging retrieval +description: Why a Knowledge block search returns no results, wrong results, or duplicates, and how to fix each one. +pageType: guide +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' + +A [Knowledge block](/integrations/knowledge) search reads a query, embeds it as a vector, and returns the chunks of your documents that are closest to it. When the search misbehaves, it does so in one of three ways: it returns nothing, it returns the wrong chunks, or it returns the same content twice. Each one has a short list of causes you can check in the search results, in the document list, and in your tag filters. + +## What a result looks like + +A search returns a `results` array. Each entry is one chunk of one document, with the fields you use to diagnose retrieval: + +| Field | What it is | +| --- | --- | +| `documentName` | The source document the chunk came from. | +| `sourceUrl` | Where the document was uploaded or synced from (`null` for manual uploads). | +| `content` | The chunk text that matched. | +| `chunkIndex` | The chunk's position in the document (`0` is the first chunk). | +| `similarity` | How close the chunk is to your query, `0` to `1` (higher is closer). | +| `rerankerScore` | An optional relevance score, present only when [Cohere reranking](/integrations/knowledge) is on. | +| `metadata` | The chunk's tag values, by their display names. | + +{/* VISUAL: two result panels side by side. Left: empty `results: []`. Right: one populated result object with documentName, content, chunkIndex, similarity 0.92, metadata, sourceUrl annotated. */} + +The **similarity score** is the first thing to read. As a rough guide: above `0.8` is usually relevant, `0.6` to `0.8` is marginal, and below `0.6` is often noise. A search with a query always scores chunks this way. A tag-only search (filters, no query) returns every matching chunk with `similarity: 1`, because there's no query to measure distance against. + +## Empty results + +An empty `results` array means no chunk matched. There are three causes, listed here in the order worth checking. + +### The documents aren't ready + +Only documents that finished processing are searchable. Every document carries a `processingStatus`, and the Knowledge block silently skips anything that isn't `completed`. A knowledge base full of half-processed documents looks empty even though the upload succeeded. + +| `processingStatus` | Meaning | Searchable | +| --- | --- | --- | +| `pending` | Queued, not started. | No | +| `processing` | Being chunked and embedded. | No | +| `completed` | Ready. | Yes | +| `failed` | Chunking or embedding errored. | No | + +{/* VISUAL: the four processingStatus states in a row, with a checkmark only on `completed`. */} + +Run the block's **List Documents** operation and check the status of each document. If a document is `pending` or `processing`, wait for it to finish. If it's `failed`, read its `processingError` (via **Get Document**) and re-upload. See [chunking strategies](/knowledgebase/chunking-strategies) for what happens during processing. + +### The query doesn't match the content + +If your documents are `completed` but the search still returns nothing, the query may not be close to anything stored. Confirm the content actually exists: run **List Chunks** and read what's in the knowledge base. If the answer is there but the search misses it, the problem is wording, not data. Try a simpler query, or use a term that appears in the content. See [wrong results](#wrong-results-or-low-relevance) below for the deeper version of this. + +### Tag filters exclude everything + +[Tag filters](/knowledgebase/tags) restrict the document set before the vector search runs, and they combine with AND logic: a document must match every filter to be searched. A filter like `Department equals 'engineering'` returns nothing if no document carries that tag value. + +Check the tag values actually set on your documents (**Get Document** shows them), and confirm the filter value matches exactly. To rule filters out as the cause, remove them and search by query alone. + +## Wrong results or low relevance + +Wrong results are chunks that come back but don't answer the query, even though better content exists in the knowledge base. The vector search found something semantically near the query, but it wasn't near enough to be a good match. Read the `similarity` scores: a top result at `0.65` is the search telling you nothing good matched. + +Common causes: + +- **The query and the content use different words.** A search for `LLM` won't sit close to content written entirely as `language model`. Reword the query toward the content's own terms. +- **Chunks are too large.** A 1,024-token chunk blends many topics into one embedding, so its score is diluted across all of them. Smaller chunks (256 to 512 tokens) often retrieve more precisely. See [chunking strategies](/knowledgebase/chunking-strategies). +- **Context is split across a chunk boundary.** The sentence that answers the query sits in one chunk and the subject it refers to sits in the previous one, so neither chunk scores well on its own. Overlap during chunking reduces this. + +Two fixes that don't require re-chunking: narrow the search with a tag filter first so the vector search runs over fewer, more relevant documents, or turn on **Cohere reranking**. Reranking re-scores the initial vector results with a model tuned for relevance and adds a `rerankerScore` to each result. It's worth enabling when you see marginal results (`0.6` to `0.75`) that a human would call relevant. It costs one search unit per call and adds latency, and if the reranker is unavailable the search falls back to vector ordering automatically. + + +A high `similarity` score is not a guarantee the chunk answers the query, only that it's close in meaning. Vet the top results yourself, or use reranking, before trusting a search to ground an agent's answer. + + +## Duplicates + +Duplicates are the same or near-identical content appearing more than once in `results`. Read the `documentName` and `chunkIndex` of the repeated entries to tell which case you have. + +- **Same document, adjacent `chunkIndex` values.** This is overlap. Chunking repeats some tokens between consecutive chunks (200 by default) to preserve context, so neighboring chunks share text and can both match. Lowering overlap reduces the repetition, at the cost of context at chunk boundaries. See [chunking strategies](/knowledgebase/chunking-strategies). +- **Different `documentName`, identical content.** The same material was uploaded as two documents, or [synced from a connector](/knowledgebase/connectors) that holds it in more than one place. Consolidate the duplicate documents, or check the connector's source. + +## Disabled chunks and claimed tag slots + +A chunk can be disabled with the **Update Chunk** operation (`enabled: false`), which removes it from all searches without deleting it. A disabled chunk never appears in results, even when it's the best match. If a chunk you know is relevant is missing from a search, confirm it isn't disabled. + +The same goes for tag slots when you use [connectors](/knowledgebase/connectors). Synced documents auto-populate tag values (a repository name, a last-modified date), and those occupy the same slots manual tags would. A filter that returns nothing can be filtering on a slot the connector already claimed. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/knowledgebase/index.mdx b/apps/docs/content/docs/en/knowledgebase/index.mdx index 45b109349d9..f0d14803755 100644 --- a/apps/docs/content/docs/en/knowledgebase/index.mdx +++ b/apps/docs/content/docs/en/knowledgebase/index.mdx @@ -1,133 +1,58 @@ --- title: Overview -description: Upload, process, and search through your documents with intelligent vector search and chunking +description: A store of documents your agents can search by meaning. +pageType: concept --- import { Video } from '@/components/ui/video' -import { Image } from '@/components/ui/image' +import { Card, Cards } from 'fumadocs-ui/components/card' import { FAQ } from '@/components/ui/faq' -The knowledgebase allows you to upload, process, and search through your documents with intelligent vector search and chunking. Documents of various types are automatically processed, embedded, and made searchable. Your documents are intelligently chunked, and you can view, edit, and search through them using natural language queries. +A **knowledge base** is a store of documents your agents can search by meaning. You upload files, Sim splits them into chunks and indexes them, and a [Knowledge block](/knowledgebase/using-in-workflows) retrieves the chunks most relevant to a query. This is how an agent answers from your own content instead of the model's general training. -## Upload and Processing - -Simply upload your documents to get started. Sim automatically processes them in the background, extracting text, creating embeddings, and breaking them into searchable chunks. - -
+
-The system handles the entire processing pipeline for you: - -1. **Text Extraction**: Content is extracted from your documents using specialized parsers for each file type -2. **Intelligent Chunking**: Documents are broken into meaningful chunks with configurable size and overlap -3. **Embedding Generation**: Vector embeddings are created for semantic search capabilities -4. **Processing Status**: Track the progress as your documents are processed - -## Supported File Types - -Sim supports PDF, Word (DOC/DOCX), plain text (TXT), Markdown (MD), HTML, HTM, Excel (XLS/XLSX), PowerPoint (PPT/PPTX), CSV, JSON, and YAML/YML files. Files can be up to 100MB each, with optimal performance for files under 50MB. You can upload multiple documents simultaneously, and PDF files include OCR processing for scanned documents. - -## Viewing and Editing Chunks - -Once your documents are processed, you can view and edit the individual chunks. This gives you full control over how your content is organized and searched. - -Document chunks view showing processed content - -### Chunk Configuration - -When creating a knowledge base, you can configure how documents are split into chunks: - -| Setting | Unit | Default | Range | Description | -|---------|------|---------|-------|-------------| -| **Max Chunk Size** | tokens | 1,024 | 100-4,000 | Maximum size of each chunk (1 token ≈ 4 characters) | -| **Min Chunk Size** | characters | 100 | 100-2,000 | Minimum chunk size to avoid tiny fragments | -| **Overlap** | tokens | 200 | 0-500 | Context overlap between consecutive chunks | - -You can also pick a chunking strategy (Auto, Text, Recursive, Sentence, Token, or Regex) to control where splits happen. See [Chunking Strategies](/docs/knowledgebase/chunking-strategies) for a breakdown of when to use each. - -- **Hierarchical splitting**: Respects document structure (sections, paragraphs, sentences) - -### Editing Capabilities -- **Edit chunk content**: Modify the text content of individual chunks -- **Adjust chunk boundaries**: Merge or split chunks as needed -- **Add metadata**: Enhance chunks with additional context -- **Bulk operations**: Manage multiple chunks efficiently - -## Advanced PDF Processing - -For PDF documents, Sim offers enhanced processing capabilities: - -### OCR Support -When configured with Azure or [Mistral OCR](https://docs.mistral.ai/ocr/): -- **Scanned document processing**: Extract text from image-based PDFs -- **Mixed content handling**: Process PDFs with both text and images -- **High accuracy**: Advanced AI models ensure accurate text extraction - -## Using The Knowledge Block in Workflows - -Once your documents are processed, you can use them in your AI workflows through the Knowledge block. This enables Retrieval-Augmented Generation (RAG), allowing your AI agents to access and reason over your document content to provide more accurate, contextual responses. - -Using Knowledge Block in Workflows - -### Knowledge Block Features -- **Semantic search**: Find relevant content using natural language queries -- **Context integration**: Automatically include relevant chunks in agent prompts -- **Dynamic retrieval**: Search happens in real-time during workflow execution -- **Relevance scoring**: Results ranked by semantic similarity +## How a document becomes searchable -### Integration Options -- **System prompts**: Provide context to your AI agents -- **Dynamic context**: Search and include relevant information during conversations -- **Multi-document search**: Query across your entire knowledgebase -- **Filtered search**: Combine with tags for precise content retrieval +When you upload a document, Sim processes it in the background: -## Vector Search Technology +1. **Extract** the text, with a parser for each file type and OCR for scanned PDFs. +2. **Chunk** it into passages, with a size and overlap you can tune. +3. **Embed** each chunk as a vector so it can be matched by meaning, not just keywords. -Sim uses vector search powered by [pgvector](https://github.com/pgvector/pgvector) to understand the meaning and context of your content: +A document is searchable once its status reads `completed`. Open any document to view, edit, merge, or split its chunks. -### Semantic Understanding -- **Contextual search**: Finds relevant content even when exact keywords don't match -- **Concept-based retrieval**: Understands relationships between ideas -- **Multi-language support**: Works across different languages -- **Synonym recognition**: Finds related terms and concepts +## What you can upload -### Search Capabilities -- **Natural language queries**: Ask questions in plain English -- **Similarity search**: Find conceptually similar content -- **Hybrid search**: Combines vector and traditional keyword search -- **Configurable results**: Control the number and relevance threshold of results +Sim accepts PDF, Word, text, Markdown, HTML, Excel, PowerPoint, CSV, JSON, and YAML files, up to 100 MB each (best under 50 MB). Scanned PDFs work too: with Azure or [Mistral OCR](https://docs.mistral.ai/ocr/) configured, Sim extracts text from image-based pages. -## Document Management +## Shaping what a search returns -### Organization Features -- **Bulk upload**: Upload multiple files at once via the asynchronous API -- **Processing status**: Real-time updates on document processing -- **Search and filter**: Find documents quickly in large collections -- **Metadata tracking**: Automatic capture of file information and processing details +Two things control retrieval quality, and each has its own page: -### Security and Privacy -- **Secure storage**: Documents stored with enterprise-grade security -- **Access control**: Workspace-based permissions -- **Processing isolation**: Each workspace has isolated document processing -- **Data retention**: Configure document retention policies +- **Chunking** decides how a document is split. Smaller chunks are more precise; larger ones keep more context. See [chunking strategies](/knowledgebase/chunking-strategies). +- **Tags** label documents so a search can filter to a subset. See [tags and filtering](/knowledgebase/tags). -## Getting Started +To keep a base in sync with an outside source like Google Drive, use a [connector](/knowledgebase/connectors). -1. **Navigate to your knowledgebase**: Access from your workspace sidebar -2. **Upload documents**: Drag and drop or select files to upload -3. **Monitor processing**: Watch as documents are processed and chunked -4. **Explore chunks**: View and edit the processed content -5. **Add to workflows**: Use the Knowledge block to integrate with your AI agents +## Next -The knowledgebase transforms your static documents into an intelligent, searchable resource that your AI workflows can leverage for more informed and contextual responses. + + + + + + + \ No newline at end of file + { question: "What file types are supported?", answer: "PDF, Word (DOC/DOCX), plain text (TXT), Markdown (MD), HTML, Excel (XLS/XLSX), PowerPoint (PPT/PPTX), CSV, JSON, and YAML files." }, + { question: "Is there a file size limit?", answer: "Files can be up to 100 MB each, with best performance under 50 MB." }, + { question: "Can I edit chunks after processing?", answer: "Yes. You can view, edit, merge, split, and add metadata to individual chunks once a document is processed." }, + { question: "How does semantic search work?", answer: "Documents are embedded as vectors. When you search, your query is embedded too and compared against the document vectors to find conceptually similar content, even when the exact keywords don't match." }, + { question: "Does it support scanned PDFs?", answer: "Yes. With Azure or Mistral OCR configured, Sim extracts text from image-based and scanned PDF pages." }, + { question: "Can I search across multiple knowledge bases?", answer: "Each Knowledge block searches one knowledge base. Use multiple Knowledge blocks in a workflow to search across several." }, + { question: "How do I control chunk size?", answer: "When you create a knowledge base, you can set the max chunk size (100 to 4,000 tokens), min chunk size (100 to 2,000 characters), and overlap (0 to 500 tokens). See chunking strategies for details." }, +]} /> diff --git a/apps/docs/content/docs/en/knowledgebase/meta.json b/apps/docs/content/docs/en/knowledgebase/meta.json index 6c42e7be3eb..d04a13a433b 100644 --- a/apps/docs/content/docs/en/knowledgebase/meta.json +++ b/apps/docs/content/docs/en/knowledgebase/meta.json @@ -1,4 +1,11 @@ { "title": "Knowledge Base", - "pages": ["index", "chunking-strategies", "connectors", "tags"] + "pages": [ + "index", + "using-in-workflows", + "connectors", + "tags", + "debugging-retrieval", + "chunking-strategies" + ] } diff --git a/apps/docs/content/docs/en/knowledgebase/tags.mdx b/apps/docs/content/docs/en/knowledgebase/tags.mdx index 420efbceda0..4cccaa5387f 100644 --- a/apps/docs/content/docs/en/knowledgebase/tags.mdx +++ b/apps/docs/content/docs/en/knowledgebase/tags.mdx @@ -1,5 +1,5 @@ --- -title: Tags and Filtering +title: Tags and filtering --- import { Callout } from 'fumadocs-ui/components/callout' diff --git a/apps/docs/content/docs/en/knowledgebase/using-in-workflows.mdx b/apps/docs/content/docs/en/knowledgebase/using-in-workflows.mdx new file mode 100644 index 00000000000..a82357c4f24 --- /dev/null +++ b/apps/docs/content/docs/en/knowledgebase/using-in-workflows.mdx @@ -0,0 +1,108 @@ +--- +title: Using a knowledge base in a workflow +description: How the Knowledge block searches a knowledge base and what it returns, so an agent can ground its answers in your documents. +pageType: concept +--- + +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, OutputBundle, SUPPORT_KB_WORKFLOW } from '@/components/workflow-preview' + +A **Knowledge block** searches a [knowledge base](/knowledgebase) and hands the matching passages to a later block, so an [Agent](/blocks/agent) can answer from your documents instead of the model's memory alone. It works like asking a librarian for the most relevant excerpts on a topic: you give it a question and get back a ranked, source-labeled list. This page covers searching, narrowing with tags, reranking, and reading the results. + + + +In this workflow, the Knowledge block searches a base of product docs for the customer's question, and the Agent answers from the passages it returns. + +## Search + +A **Knowledge block** set to **Search** takes a query, compares it against the chunks in a base, and returns the closest matches. (The block can also manage documents and chunks, but Search is what a workflow uses to retrieve context.) You point it at a knowledge base and give it a query; in our example the query is ``, the customer's question. + +Search is semantic, not keyword matching. The block turns the query into a vector and finds the chunks whose meaning is closest, so "refund timelines" can match a passage that says "we process returns within 14 days" with no shared words. + +**Number of Results** (topK) sets how many chunks come back, 10 by default. Fewer give the agent a tight, focused set; more widen the net at the cost of noise and tokens. + +You can also search by tags, instead of or alongside a query: + +| What you provide | What it does | +| --- | --- | +| Query only | Semantic search across every document in the base. The default. | +| Tags only | Returns documents that match the tags, with no ranking by meaning. | +| Query and tags | Tags narrow the document set first, then semantic search runs within it. The most precise. | + +## Tag Filters + +**Tag Filters** restrict a search to documents carrying specific [tags](/knowledgebase/tags). Each filter has three parts: a **Tag** (a tag defined on the base, like `Department`), an **Operator** (`equals`, `contains`, `greater than`, and others depending on the tag's type), and a **Value** to match. + +In our example, adding `Department equals "Billing"` makes the search consider only billing documents. Add more filters with the **+** button; multiple filters combine with AND, so a document must match all of them. A filter value can be a fixed string or a reference like ``, so the scope can change per run. + +Filters run before the vector comparison, so they make a search both more precise and cheaper. See [Tags and filtering](/knowledgebase/tags) for the full operator list by tag type. + +## Rerank Results + +**Rerank Results** is an optional second pass. Vector search ranks by raw similarity; reranking re-scores the top matches with a dedicated relevance model (Cohere's rerank models) and reorders them, which sharpens the ordering when the best answer isn't the literal closest vector. + +Leave it off for most searches. Turn it on when retrieval returns roughly the right documents but in the wrong order. When enabled, you pick a **Rerank Model**; self-hosted deployments also supply a Cohere API key. + +## Retrieved chunks + +The Search operation produces an **output** stored under the block's name, the same as any other block. Its main value is `results`: an array of the matched chunks, ranked best first. A later block reads it by reference, for example ``. + + + +Each result in the array is an object with these fields: + +| Field | What it is | +| --- | --- | +| `content` | The chunk's text. This is what the agent reads. | +| `documentName` | The source document's filename, for citation. | +| `sourceUrl` | A link to the original, if the document came from a [connector](/knowledgebase/connectors). `null` for uploaded files. | +| `chunkIndex` | The chunk's position within its document. | +| `similarity` | How close the chunk is to the query, higher is better. For example `0.92`. | +| `metadata` | The document's attributes, including its tags. | +| `documentId` | The source document's identifier. | + +The output also carries `query` (the text that was searched) and `totalResults` (the count). + +To ground an answer, wire the Knowledge block before an [Agent](/blocks/agent) block and reference the chunks in the Agent's prompt with ``. The agent reads the `content` of each result and can cite `documentName` and `sourceUrl`. See [how blocks reference output](/workflows/data-flow) for how one block reads another's output by name. + +## When retrieval looks wrong + +When the agent's answer is off, the cause is usually in retrieval, not the agent. Read the Knowledge block's output in the [run logs](/logs-debugging) and check the chunks it actually returned: + +- **No results, or wrong documents.** A tag filter may be excluding what you want, or the documents may not be indexed yet. A document is only searchable once its processing status is `completed`; while it is `pending`, `processing`, or `failed`, its chunks won't appear. +- **Low similarity scores across the board.** The query is too vague, or the information simply isn't in the base. Rewrite the query to match how the documents phrase things. +- **Right documents, wrong order.** Turn on Rerank Results, or raise Number of Results so the relevant chunk is included. + +See [debugging retrieval](/knowledgebase/debugging-retrieval) for the full diagnostic path, and [chunking strategies](/knowledgebase/chunking-strategies) for how chunk boundaries shape what a search can return. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/logs-debugging/alerts.mdx b/apps/docs/content/docs/en/logs-debugging/alerts.mdx new file mode 100644 index 00000000000..144c28264ba --- /dev/null +++ b/apps/docs/content/docs/en/logs-debugging/alerts.mdx @@ -0,0 +1,108 @@ +--- +title: Alerts +description: Get notified when a workflow fails, slows down, costs too much, or goes quiet. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' + +An **alert** tells you when your workflows behave in a way you want to know about: repeated failures, a slow run, an expensive run, or no activity at all. You set up an alert once on a workspace, choose the condition that triggers it, and pick how you want to be told. + +## Alert rules + +An **alert rule** is the condition that fires the alert. Each alert has one rule, configured with its own thresholds. + +| Rule | Fires when | Key settings | +| --- | --- | --- | +| **Consecutive failures** | the last N runs all errored | count (1 to 100, default 3) | +| **Failure rate** | the error rate over a window crosses a threshold | percent (1 to 100), window hours (1 to 168) | +| **Error count** | the number of errors in a window crosses a threshold | count (1 to 1000), window hours | +| **Latency threshold** | a run takes longer than a fixed time | duration in ms (1s to 1h, default 30s) | +| **Latency spike** | a run is much slower than the recent average | percent slower (10 to 1000), window hours | +| **Cost threshold** | a single run costs more than a set amount | dollars (0.01 to 1000, default $1) | +| **No activity** | no runs happen within a window | hours (1 to 168, default 24) | + +The rate-based rules (failure rate, latency spike) need at least 5 runs in the window before they evaluate. No-activity is checked by a background poll rather than on each run. After an alert fires, that alert stays quiet for **1 hour** so a single problem doesn't flood you. + +You can scope a rule to all workflows or specific ones, and filter by level (info or error) and by trigger type. + +## Delivery channels + +An alert can reach you three ways: + +- **Webhook** posts a signed JSON payload to a URL you provide. +- **Email** sends to a list of recipients, up to 10. +- **Slack** posts to a channel through a connected Slack account. + +## Webhook payload + +A webhook alert is an HTTP POST with a JSON body: + +```json +{ + "id": "evt_...", + "type": "workflow.execution.completed", + "timestamp": 1719907200000, + "data": { + "workflowId": "wf_...", + "workflowName": "Lead scorer", + "executionId": "exec_...", + "status": "error", + "level": "error", + "trigger": "api", + "startedAt": "2026-06-01T12:00:00.000Z", + "endedAt": "2026-06-01T12:00:01.200Z", + "totalDurationMs": 1200, + "cost": { "total": 0.0042 } + } +} +``` + +You can also include the run's `finalOutput`, its `traceSpans` (webhook only), rate-limit status, and usage data by turning those options on for the alert. + +## Verifying a webhook + +Each delivery is signed so you can confirm it came from Sim. The signature is in the `sim-signature` header: + +``` +sim-signature: t=1719907200000,v1= +``` + +To verify, compute an HMAC-SHA256 over `{t}.{raw_body}` using your webhook secret, and compare the result to `v1`: + +```javascript +import { createHmac } from 'node:crypto' + +function verify(rawBody, signatureHeader, secret) { + const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('='))) + const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex') + return expected === parts.v1 +} +``` + +Sim also sends `sim-event`, `sim-timestamp`, and an `Idempotency-Key` header on each delivery, so a receiver can dedupe retries. + +## Retries + +If your endpoint does not return a 2xx, Sim retries up to 5 times with increasing delays of 5s, 15s, 60s, 3m, then 10m, each with a little jitter. After the fifth failure the delivery is marked failed. + +## Setting up an alert + +Configure alerts in your workspace notification settings, or through the workspace notifications API: + +- `GET /api/workspaces/{id}/notifications` lists alerts. +- `POST /api/workspaces/{id}/notifications` creates one. +- `PUT /api/workspaces/{id}/notifications/{notificationId}` updates one. +- `DELETE /api/workspaces/{id}/notifications/{notificationId}` removes one. +- `POST /api/workspaces/{id}/notifications/{notificationId}/test` sends a test. + +Creating or changing an alert needs Write or Admin access to the workspace. A workspace can have up to 10 alerts of each channel type. + +## Next + + + + + + diff --git a/apps/docs/content/docs/en/logs-debugging/index.mdx b/apps/docs/content/docs/en/logs-debugging/index.mdx new file mode 100644 index 00000000000..71f4e81c40f --- /dev/null +++ b/apps/docs/content/docs/en/logs-debugging/index.mdx @@ -0,0 +1,91 @@ +--- +title: Overview +description: A log is the recorded trace of one workflow run, and debugging is reading that trace backward from the block that failed. +pageType: concept +--- + +import { Card, Cards } from 'fumadocs-ui/components/card' + +A **log** is the recorded trace of one workflow run. Every time a workflow runs, Sim writes down what triggered it, which blocks ran in what order, and for each block its exact input, its output, and any error. That trace is the ground truth for debugging: it replays what each block received, what it did, and what it returned, so you can find where something went wrong. + +Think of it like a video replay of the run, where you read what actually happened one block at a time. + +The **Logs page** lists every run across your workspace, one row per run. The [Logging reference](/logs-debugging/logging) covers the page itself: the columns, filters, and sidebar. This page covers what a log captures and how to trace a failure back to its cause. + +{/* VISUAL: the Logs page as a list of run rows (Workflow, Date, Status, Cost, Trigger, Duration), one row expanded into its sidebar trace. */} + +## What a log records + +### The run + +Each row on the Logs page is one **run**. It records the **trigger** that started it (manual, api, schedule, chat, webhook, mcp, mothership, copilot, workflow, or a2a), a **status**, a **duration**, and the total **cost**. It also carries an **execution ID** that uniquely names the run. + +The status is the run's outcome at a glance: **success**, **error**, **running**, **pending**, or **cancelled**. When you are hunting a failure, you filter the list to **error** and start there. + +{/* VISUAL: one run row broken out into its parts, each labeled: trigger badge, status badge, duration, cost, execution ID. */} + +### The blocks + +Open a run and the sidebar shows its blocks in the order they ran. Each **block execution** records the [block](/workflows#blocks)'s name and type, its own status (**success**, **error**, or **skipped**), its timing, its **input**, its **output**, and an error message if it failed. + +This is the level you debug at, because a run fails when one of its blocks fails, and a block usually fails because of the input it received. + +{/* VISUAL: the sidebar trace, a vertical list of block executions with status dots, one expanded to show its Input/Output tabs. */} + +### Input and output + +Each block in the sidebar has two tabs. The **Input** tab shows the resolved values the block actually ran with: the literal values you typed, and the earlier outputs it read by reference (with API keys redacted). The **Output** tab shows what the block produced, formatted as an object, with markdown rendered for agent-generated text. + +The input tab is the important one. A block reads earlier outputs by name, written ``, and the input tab shows what those references resolved to at run time. If a reference pointed at a value that was not there, you see it here as missing or wrong, not as the tag you wrote. See [how blocks pass data](/workflows/data-flow) for how those references resolve. + +{/* VISUAL: the Input tab of an Agent block showing a resolved reference, e.g. the prompt with filled in with its actual value. */} + +### The snapshot + +A workflow changes over time. A log does not. Clicking **View Snapshot** opens a frozen copy of the workflow exactly as it was when that run happened: the blocks, the connections, the configuration. This matters when a run failed last week and you have edited the workflow since. The snapshot shows the version that actually ran, not today's version. + +## Tracing a failure backward + +Debugging follows the same repeatable loop each time. You start at the block that failed and walk back to the block that caused it. + +1. **Find the failed block.** Open the errored run. The sidebar marks the block whose status is **error**. Read its error message. +2. **Read its input.** Open the block's Input tab. This is what it actually ran with, after every reference resolved. +3. **Verify the input.** Ask whether that input is what the block expected. An empty field, a value of the wrong type, a missing nested key: the mismatch is usually visible here. +4. **Walk back to the source.** A bad input came from somewhere. Find the earlier block whose output the failed block referenced, and open that block's Output tab. Either it produced the wrong value, or it never ran. +5. **Fix and rerun.** Correct the reference, the configuration, or the upstream block, then run the workflow again. +6. **Compare the traces.** Open the new run's log next to the old one. The block that was **error** is now **success**, and its input is the value you expected. That confirms the fix. + +{/* VISUAL: the debugging loop as a flowchart: failed block → read input → verify expectation → walk back to source block → fix → rerun → compare logs. */} + +{/* VISUAL: side-by-side of a failed run and a successful run, same blocks, highlighting the one input/output that changed between them. */} + +### Common failures + +Most errors come down to a handful of input mismatches. Knowing the shape speeds up step 3. + +- **Missing input.** A field the block needs was left empty, or its reference resolved to nothing. +- **Wrong reference.** The tag names an output that does not exist, or uses the wrong field name. +- **Type mismatch.** A string where an object was expected, or the reverse. +- **Missing nested key.** The referenced object exists, but the specific field inside it does not. +- **Empty agent message.** An [Agent](/blocks/agent) returned nothing, so the next block had nothing to read. +- **External error.** A tool or API the block called returned an error of its own, surfaced in the block's error message. + +When a value is the wrong shape, reshape it in a [Function](/blocks/function) block, whose result becomes its own output that later blocks can read. + +## AI-assisted debugging + +Mothership and Copilot can read a run's logs and propose a fix from the trace: the error message, the input the block received, and the output the upstream block produced. The logs stay the ground truth. You confirm a proposed fix the same way you confirm your own: rerun the workflow and compare the new trace against the failed one. + +## Retention + +Logs are kept so you can debug a run after it happened. Free plans retain logs for **7 days**, after which they are archived to cloud storage and removed from the database. Pro, Team, and Enterprise plans retain logs indefinitely. + +## Next + + + + + + + + diff --git a/apps/docs/content/docs/en/logs-debugging/logging.mdx b/apps/docs/content/docs/en/logs-debugging/logging.mdx new file mode 100644 index 00000000000..204a64161d0 --- /dev/null +++ b/apps/docs/content/docs/en/logs-debugging/logging.mdx @@ -0,0 +1,102 @@ +--- +title: Logging +description: Where run logs live — the real-time console, the Logs page, and what each entry records. +pageType: reference +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Image } from '@/components/ui/image' + +Every workflow run is logged. There are two places to read them: the **Console** for the run you're watching, and the **Logs page** for everything. + +## Real-time Console + +During manual or chat runs, the Console panel in the editor shows each block as it runs — active-block highlighting, outputs as they complete, per-block timing, and success/error status. + +
+ Real-time Console Panel +
+ +## Logs page + +Every run from every trigger — manual, API, chat, schedule, webhook — lands on the Logs page, with filtering by time range, status, trigger type, folder, and workflow, full-text search, and a **Live mode** that streams new entries in as they're recorded. + +
+ Logs Page +
+ +## Log details + +Click any entry to open its sidebar: the run's timeline (start/end, total duration, per-block timing) and each block's data flow. + +
+ Logs Sidebar Details +
+ + + + The block's result — JSON-formatted structured data, markdown rendering for AI content, and a copy button. + + + What the block received — resolved variable values, referenced outputs, and environment variables. API keys are automatically redacted. + + + +## Workflow snapshots + +**View Snapshot** opens a frozen copy of the workflow exactly as it was at run time — structure, block states, connections — and each block is clickable to its inputs and outputs. This is how you debug a run of a workflow you've since changed. + +
+ Workflow Snapshot +
+ + +Snapshots exist for runs after the enhanced logging system was introduced. Older migrated logs show "Logged State Not Found". + + +## Retention + +- **Free**: 7 days — logs are archived to cloud storage, then deleted. +- **Pro / Team / Enterprise**: retained indefinitely. + +## Next + +- [Alerts](/logs-debugging/alerts) for notifications on failures and slow runs +- [Cost calculation](/costs) for what each run costs +- [External API](/api-reference/getting-started) for programmatic log access + +import { FAQ } from '@/components/ui/faq' + + diff --git a/apps/docs/content/docs/en/mailer/index.mdx b/apps/docs/content/docs/en/mailer/index.mdx index 420e481d688..06951f9db9b 100644 --- a/apps/docs/content/docs/en/mailer/index.mdx +++ b/apps/docs/content/docs/en/mailer/index.mdx @@ -8,8 +8,6 @@ import { FAQ } from '@/components/ui/faq' Sim Mailer gives your workspace a dedicated email address. Forward or send emails to it and Sim will process them as tasks — reading the subject, body, and any attachments, then replying to the thread with the result. -This means you can interact with Sim directly from your email client without switching apps. - ## Getting Started 1. Navigate to **Settings** → **Inbox** @@ -27,7 +25,7 @@ If you skip the custom prefix, one is generated automatically. Write your email like you would to a colleague. The subject and body become the task prompt. -**Attachments are fully supported.** Images, PDFs, and documents (up to 10 MB each) are read by Sim and displayed inline in the conversation — image attachments show as previews, just like when you upload them directly in the chat. +**Attachments are fully supported.** Images, PDFs, and documents (up to 10 MB each) are read by Sim and displayed inline in the conversation; images show as previews. | Good email | Why it works | |------------|-------------| diff --git a/apps/docs/content/docs/en/mcp/index.mdx b/apps/docs/content/docs/en/mcp/index.mdx index 50b731e0d26..2f1d2a5a508 100644 --- a/apps/docs/content/docs/en/mcp/index.mdx +++ b/apps/docs/content/docs/en/mcp/index.mdx @@ -1,22 +1,14 @@ --- -title: Using MCP Tools +title: Using MCP tools description: Connect external tools and services using the Model Context Protocol +pageType: guide --- import { Image } from '@/components/ui/image' import { Video } from '@/components/ui/video' import { Callout } from 'fumadocs-ui/components/callout' -The Model Context Protocol ([MCP](https://modelcontextprotocol.com/)) allows you to connect external tools and services using a standardized protocol, enabling you to integrate APIs and services directly into your workflows. With MCP, you can extend Sim's capabilities by adding custom integrations that work seamlessly with your agents and workflows. - -## What is MCP? - -MCP is an open standard that enables AI assistants to securely connect to external data sources and tools. It provides a standardized way to: - -- Connect to databases, APIs, and file systems -- Access real-time data from external services -- Execute custom tools and scripts -- Maintain secure, controlled access to external resources +The Model Context Protocol ([MCP](https://modelcontextprotocol.com/)) is an open standard for connecting AI to external tools and data. Add an MCP server to your workspace and its tools become available to your agents — a way to integrate services Sim doesn't have a built-in integration for. ## Adding an MCP Server as a Tool @@ -92,10 +84,6 @@ Tool validation badges appear on servers with issues — for example, if a tool Self-hosted deployments can restrict which MCP server domains are allowed by setting the `ALLOWED_MCP_DOMAINS` environment variable (comma-separated list). When set, only servers on approved domains can be added. When unset, all domains are allowed. -### Refresh Tools - -To auto-refresh an MCP tool already in use by an agent, go to **Settings → MCP Tools**, open the server's details, and click **Refresh**. This fetches the latest tool schemas and automatically updates any agent blocks using those tools with the new parameter definitions. - ## Using MCP Tools in Agents Once MCP servers are configured, their tools become available within your agent blocks: @@ -145,11 +133,7 @@ For more granular control, you can use the dedicated MCP Tool block to execute s />
-The MCP Tool block allows you to: -- Execute any configured MCP tool directly -- Pass specific parameters to the tool -- Use the tool's output in subsequent workflow steps -- Chain multiple MCP tools together +The MCP Tool block runs one configured tool with parameters you set explicitly, and its output is readable by later blocks like any other. ## When to Use MCP Tool vs Agent @@ -172,46 +156,9 @@ MCP functionality requires specific workspace permissions: | View available MCP tools | **Read**, **Write**, or **Admin** | | Execute MCP Tool blocks | **Read**, **Write**, or **Admin** | -## Common Use Cases - -### Database Integration -Connect to databases to query, insert, or update data within your workflows. - -### API Integrations -Access external APIs and web services that don't have built-in Sim integrations. - -### File System Access -Read, write, and manipulate files on local or remote file systems. - -### Custom Business Logic -Execute custom scripts or tools specific to your organization's needs. - -### Real-time Data Access -Fetch live data from external systems during workflow execution. - -## Security Considerations - -- MCP servers run with the permissions of the user who configured them -- Always verify MCP server sources before installation -- Use environment variables for sensitive configuration data -- Review MCP server capabilities before granting access to agents - -## Troubleshooting - -### MCP Server Not Appearing -- Verify the server configuration is correct -- Check that you have the required permissions -- Ensure the MCP server is running and accessible - -### Tool Execution Failures -- Verify tool parameters are correctly formatted -- Check MCP server logs for error messages -- Ensure required authentication is configured - -### Permission Errors -- Confirm your workspace permission level -- Check if the MCP server requires additional authentication -- Verify the server is properly configured for your workspace + +MCP servers run with the permissions of the user who configured them — only connect servers you trust, and review a server's tools before handing them to agents. + import { FAQ } from '@/components/ui/faq' diff --git a/apps/docs/content/docs/en/meta.json b/apps/docs/content/docs/en/meta.json index b0446caab8f..6e02950ae60 100644 --- a/apps/docs/content/docs/en/meta.json +++ b/apps/docs/content/docs/en/meta.json @@ -1,32 +1,68 @@ { "title": "Sim Documentation", "pages": [ - "---Getting Started---", + "---Get Started---", "./introduction/index", "./getting-started/index", - "./quick-reference/index", - "---Building Workflows---", + "---Workflows---", + "./workflows/index", + "./workflows/how-it-runs", + "./workflows/data-flow", + "./workflows/connections", + "./workflows/variables", + "deployment", "triggers", "blocks", - "tools", - "connections", - "---Features---", - "mothership", - "mcp", - "copilot", - "mailer", + "---Building agents---", + "./building-agents/index", + "./building-agents/choosing", + "./building-agents/custom-tools", + "./mcp/index", "skills", - "knowledgebase", - "tables", - "variables", - "integrations", - "credentials", + "./integrations/knowledge", + "./integrations/memory", + "---Tables---", + "./tables/index", + "./tables/using-in-workflows", + "./tables/workflow-columns", + "---Files---", + "./files/index", + "./files/using-in-workflows", + "./files/generating", + "./files/passing-files", + "---Knowledge Bases---", + "./knowledgebase/index", + "./knowledgebase/using-in-workflows", + "./knowledgebase/connectors", + "./knowledgebase/tags", + "./knowledgebase/debugging-retrieval", + "./knowledgebase/chunking-strategies", + "---Logs & Debugging---", + "./logs-debugging/index", + "./logs-debugging/logging", + "./logs-debugging/alerts", + "---Mothership---", + "./mothership/index", + "./mothership/workflows", + "./mothership/research", + "./mothership/files", + "./mothership/tables", + "./mothership/tasks", + "./mothership/knowledge", + "mailer", + "---Workspaces & Access---", + "./workspaces/fundamentals", + "./permissions/roles-and-permissions", + "./credentials/index", + "./workspaces/organization", "---Platform---", - "execution", - "permissions", + "./costs", "self-hosting", "enterprise", - "./keyboard-shortcuts/index" + "---Reference---", + "./quick-reference/index", + "./keyboard-shortcuts/index", + "integrations" ], "defaultOpen": false } diff --git a/apps/docs/content/docs/en/mothership/files.mdx b/apps/docs/content/docs/en/mothership/files.mdx index 8c6ecae0862..64eb36960e1 100644 --- a/apps/docs/content/docs/en/mothership/files.mdx +++ b/apps/docs/content/docs/en/mothership/files.mdx @@ -1,5 +1,5 @@ --- -title: Files & Documents +title: Files & documents description: Upload, create, edit, and generate files — documents, presentations, images, and more. --- diff --git a/apps/docs/content/docs/en/mothership/index.mdx b/apps/docs/content/docs/en/mothership/index.mdx index e241a9a3467..3f61f20df5a 100644 --- a/apps/docs/content/docs/en/mothership/index.mdx +++ b/apps/docs/content/docs/en/mothership/index.mdx @@ -1,5 +1,5 @@ --- -title: Mothership +title: Building with Mothership description: Your AI command center. Build and manage your entire workspace in natural language. --- diff --git a/apps/docs/content/docs/en/mothership/knowledge.mdx b/apps/docs/content/docs/en/mothership/knowledge.mdx index 008c050b5c2..41c1edbb5d8 100644 --- a/apps/docs/content/docs/en/mothership/knowledge.mdx +++ b/apps/docs/content/docs/en/mothership/knowledge.mdx @@ -1,5 +1,5 @@ --- -title: Knowledge Bases +title: Knowledge bases description: Create, populate, and query knowledge bases from Mothership. --- diff --git a/apps/docs/content/docs/en/mothership/tables.mdx b/apps/docs/content/docs/en/mothership/tables.mdx index 59add7b2e2d..dfe97a7f2a6 100644 --- a/apps/docs/content/docs/en/mothership/tables.mdx +++ b/apps/docs/content/docs/en/mothership/tables.mdx @@ -51,7 +51,7 @@ Export a full table or a filtered subset as a CSV. The file is saved to your wor ## Using Tables in Workflows -Tables created in Mothership are immediately available in workflows via the [Table block](/blocks/table). Reference a table by name — no additional configuration needed. +Tables created in Mothership are immediately available in workflows via the [Table tool](/integrations/table). Reference a table by name — no additional configuration needed. Add environment variable - Settings → **Environment Variables** → **Add** + Settings → **Secrets** → **Add** diff --git a/apps/docs/content/docs/en/skills/index.mdx b/apps/docs/content/docs/en/skills/index.mdx index 73a01f9ad4f..027ae0def9c 100644 --- a/apps/docs/content/docs/en/skills/index.mdx +++ b/apps/docs/content/docs/en/skills/index.mdx @@ -1,5 +1,7 @@ --- -title: Agent Skills +title: Agent skills +description: Reusable instruction packages your agents load on demand, managed from the Skills tab. +pageType: guide --- import { Callout } from 'fumadocs-ui/components/callout' @@ -14,15 +16,15 @@ Skills use **progressive disclosure** to keep agent context lean: 2. **Activation** — When the agent decides a skill is relevant, it calls the `load_skill` tool to load the full instructions into context 3. **Execution** — The agent follows the loaded instructions to complete the task -This means you can attach many skills to an agent without bloating its context window. The agent only loads what it needs. - ## Creating Skills -Go to **Settings** and select **Skills** under the Tools section. +Skills live on the **Integrations** page: click **Integrations** in the workspace sidebar, then switch to the **Skills** tab. It lists every skill in the workspace, searchable by name. + +![The Skills tab on the Integrations page](/static/skills/skills-tab.png) -![Manage Skills](/static/skills/manage-skills.png) +Click **+ Add to Sim** to open the **Add Skill** dialog. The **Create** tab takes three fields: -Click **Add** to create a new skill with three fields: +![The Add Skill dialog, Create tab](/static/skills/add-skill-create.png) | Field | Description | |-------|-------------| @@ -34,6 +36,18 @@ Click **Add** to create a new skill with three fields: The description is critical — it's the only thing the agent sees before deciding to load a skill. Be specific about when and why the skill should be used. +### Importing skills + +The **Import** tab brings in an existing skill in the open [SKILL.md](https://agentskills.io/specification) format, three ways: + +![The Add Skill dialog, Import tab](/static/skills/add-skill-import.png) + +- **Upload a file** — a `.md` file with YAML frontmatter, or a `.zip` containing a `SKILL.md`. +- **Import from GitHub** — paste a GitHub URL to a `SKILL.md` and click **Fetch**. +- **Paste content** — paste the `SKILL.md` directly. The frontmatter carries the `name` and `description`; the markdown body is the content. + +Integration pages suggest **curated skills** for their service — open one (HubSpot, for example) and add a suggested skill with one click. + ### Writing Good Skill Content Skill content follows the same conventions as [SKILL.md files](https://agentskills.io/specification): @@ -142,5 +156,5 @@ import { FAQ } from '@/components/ui/faq' { question: "When should I use skills vs. agent instructions?", answer: "Use skills for knowledge that applies across multiple workflows or changes frequently. Skills are reusable packages that can be attached to any agent. Use agent instructions for task-specific context that is unique to a single agent and workflow. If you find yourself copying the same instructions into multiple agents, that content should be a skill instead." }, { question: "Can permission groups disable skills for certain users?", answer: "Yes. On Enterprise-entitled workspaces, any workspace admin can create a permission group with the disableSkills option enabled. When a user is assigned to such a group in a workspace, the skills dropdown in agent blocks is disabled and they cannot add or use skills in workflows belonging to that workspace." }, { question: "What is the recommended maximum length for skill content?", answer: "Keep skills focused and under 500 lines. If a skill grows too large, split it into multiple specialized skills. Shorter, focused skills are more effective because the agent can load exactly what it needs. A broad skill with too much content can overwhelm the agent and reduce the quality of its responses." }, - { question: "Where do I create and manage skills?", answer: "Go to Settings and select Skills under the Tools section. From there you can add new skills with a name (kebab-case identifier, max 64 characters), description (max 1024 characters), and content (full instructions in markdown). You can also edit or delete existing skills from this page." }, + { question: "Where do I create and manage skills?", answer: "Click Integrations in the workspace sidebar and switch to the Skills tab. Add Skill creates one from a name (kebab-case, max 64 characters), description (max 1024 characters), and markdown content — or imports an existing SKILL.md from a file, a GitHub URL, or pasted content. Existing skills are edited and deleted from the same tab." }, ]} /> diff --git a/apps/docs/content/docs/en/tables/index.mdx b/apps/docs/content/docs/en/tables/index.mdx index 3ba1f7b515d..ae70683af65 100644 --- a/apps/docs/content/docs/en/tables/index.mdx +++ b/apps/docs/content/docs/en/tables/index.mdx @@ -1,158 +1,55 @@ --- -title: Tables -description: Store, query, and manage structured data directly within your workspace +title: Overview +description: A grid of typed columns and rows in your workspace, for data your workflows read and write. +pageType: concept --- -import { Callout } from 'fumadocs-ui/components/callout' import { Image } from '@/components/ui/image' +import { Card, Cards } from 'fumadocs-ui/components/card' import { FAQ } from '@/components/ui/faq' -Tables let you store and manage structured data directly in your workspace. Use them to maintain reference data, collect workflow outputs, or build lightweight databases — all without leaving Sim. +A **table** is a grid of typed columns in your workspace, like a spreadsheet with a schema. Use one to hold reference data, collect what your workflows produce, or store the structured records your agents read and write. -Tables view showing structured data with typed columns for name, title, company, role, and more +
+ A table of typed columns: name, title, company, role +
-Each table has a schema of typed columns, supports filtering and sorting, and is fully accessible through the [Tables API](/docs/en/api-reference/(generated)/tables). +## Column types -## Creating a Table +Every column has a type, which decides how its values are stored and validated. -1. Open the **Tables** section from your workspace sidebar -2. Click **New table** -3. Name your table and start adding columns +| Type | Holds | Example | +| --- | --- | --- | +| **Text** | A free-form string | `"Acme Corp"` | +| **Number** | A numeric value | `42` | +| **Boolean** | `true` or `false` | `true` | +| **Date** | A date | `2026-03-16` | +| **JSON** | An object or array | `{ "tier": "pro" }` | -Tables start with a single text column. Add more columns by clicking **New column** in the column header area. +Types are enforced as you enter values, so a Number column only takes numbers. -## Column Types +## Editing a table -Each column has a type that determines how values are stored and validated. +Open the **Tables** section in the sidebar and click **New table** to create one. Add columns from the column header, type into a cell to edit it, and paste rows from a spreadsheet to bulk-load. Filter and sort from the toolbar without changing the underlying data. The editor has full keyboard support; see [keyboard shortcuts](/keyboard-shortcuts). -| Type | Description | Example Values | -|------|-------------|----------------| -| **Text** | Free-form string | `"Acme Corp"`, `"hello@example.com"` | -| **Number** | Numeric value | `42`, `3.14`, `-100` | -| **Boolean** | True or false | `true`, `false` | -| **Date** | Date value | `2026-03-16` | -| **JSON** | Structured object or array | `{"key": "value"}`, `[1, 2, 3]` | +## Tables in workflows - -Column types are enforced on input. For example, typing into a Number column is restricted to digits, dots, and minus signs. Non-numeric values entered via paste are coerced to `0`. - +A [Table block](/tables/using-in-workflows) reads and writes rows from inside a workflow: query rows for reference data, write results back, or process a batch. A [workflow column](/tables/workflow-columns) goes a step further and runs a workflow against each row on its own. Everything in a table is also available over the [REST API](/api-reference/getting-started). -## Working with Rows +## Next -### Adding Rows - -- Click **New row** below the last row to append a new row -- Press **Shift + Enter** while a cell is selected to insert a row below -- Paste tabular data (from a spreadsheet or TSV) to bulk-create rows - -### Editing Cells - -Click a cell to select it, then press **Enter**, **F2**, or start typing to edit. Press **Escape** to cancel, or **Tab** to save and move to the next cell. - -### Selecting Rows - -Click a row's checkbox to select it. Selecting additional checkboxes adds to the selection without clearing previous selections. - -| Action | Behavior | -|--------|----------| -| Click checkbox | Toggle that row's selection | -| Shift + click checkbox | Select range from last clicked to current | -| Click header checkbox | Select all / deselect all | -| Shift + Space | Toggle row selection from keyboard | - -### Deleting Rows - -Right-click a selected row (or group of selected rows) and choose **Delete row** from the context menu. - -## Filtering and Sorting - -Use the toolbar above the table to filter and sort your data. - -- **Filter**: Set conditions on any column (e.g., "Name contains Acme"). Multiple filters are combined with AND logic. -- **Sort**: Order rows by any column, ascending or descending. - -Filters and sorts are applied in real time and do not modify the underlying data. - -## Keyboard Shortcuts - -All shortcuts work when the table is focused and no cell is being edited. - - -**Mod** refers to `Cmd` on macOS and `Ctrl` on Windows/Linux. - - -### Navigation - -| Shortcut | Action | -|----------|--------| -| Arrow keys | Move one cell | -| `Mod` + Arrow keys | Jump to edge of table | -| `Tab` / `Shift` + `Tab` | Move to next / previous cell | -| `Escape` | Clear selection | - -### Selection - -| Shortcut | Action | -|----------|--------| -| `Shift` + Arrow keys | Extend selection by one cell | -| `Mod` + `Shift` + Arrow keys | Extend selection to edge | -| `Mod` + `A` | Select all rows | -| `Shift` + `Space` | Toggle current row selection | - -### Editing - -| Shortcut | Action | -|----------|--------| -| `Enter` or `F2` | Start editing selected cell | -| `Escape` | Cancel editing | -| Type any character | Start editing with that character | -| `Shift` + `Enter` | Insert new row below | -| `Space` | Expand row details | - -### Clipboard - -| Shortcut | Action | -|----------|--------| -| `Mod` + `C` | Copy selected cells | -| `Mod` + `X` | Cut selected cells | -| `Mod` + `V` | Paste | -| `Delete` / `Backspace` | Clear selected cells (all columns when using checkbox selection) | - -### History - -| Shortcut | Action | -|----------|--------| -| `Mod` + `Z` | Undo | -| `Mod` + `Shift` + `Z` | Redo | -| `Mod` + `Y` | Redo (alternative) | - -## Using Tables in Workflows - -Tables can be read from and written to within your workflows using the **Table** block. Common patterns include: - -- **Lookup**: Query a table for reference data (e.g., pricing rules, customer metadata) -- **Write-back**: Store workflow outputs in a table for later review or reporting -- **Iteration**: Process each row in a table as part of a batch workflow - -## API Access - -Tables are fully accessible through the REST API. You can create, read, update, and delete both tables and rows programmatically. - -See the [Tables API Reference](/docs/en/api-reference/(generated)/tables) for endpoints, parameters, and examples. - -## Best Practices - -- **Use typed columns** to enforce data integrity — prefer Number and Boolean over storing everything as Text -- **Name columns descriptively** so they are self-documenting when referenced in workflows -- **Use JSON columns sparingly** — they are flexible but harder to filter and sort against -- **Leverage the API** for bulk imports rather than manually entering large datasets + + + + + diff --git a/apps/docs/content/docs/en/tables/using-in-workflows.mdx b/apps/docs/content/docs/en/tables/using-in-workflows.mdx new file mode 100644 index 00000000000..5472fc100cd --- /dev/null +++ b/apps/docs/content/docs/en/tables/using-in-workflows.mdx @@ -0,0 +1,142 @@ +--- +title: Using tables in workflows +description: How a workflow reads, writes, and updates table rows with the Table block. +pageType: guide +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, OutputBundle, TABLE_ENRICH_WORKFLOW, TABLE_ROUNDTRIP_WORKFLOW } from '@/components/workflow-preview' + +A [table](/tables) is a resource: structured rows your workflows read and write. A [Table block](/integrations/table) is the step that does the reading and writing inside a workflow. You pick an operation on the block (query rows, insert a row, update rows), point it at a table, and its result is remembered under the block's name for later blocks to use. + +A workflow uses whichever Table operations its task needs. It might read rows to work on, write rows produced elsewhere, update rows in place, or just look something up mid-run. This page covers the operations and shows a few ways to combine them. + +Throughout this page the running example is a `leads` table with columns `company`, `email`, `description`, and `status`. The goal is to find unprocessed leads, have an Agent classify each one, and write the category back. + + + +## The Table block + +A **Table block** performs one operation against one table. The **Operation** dropdown picks the action; the **Table** selector picks the target. The fields below those two change based on the operation you choose. + +{/* VISUAL: Table block UI showing the Operation dropdown open, plus the conditional fields that appear for Query Rows (Filter Conditions, Sort Order, Limit, Offset). */} + +The operations fall into three groups: + +- **Read:** Query Rows, Get Row by ID, Get Schema. +- **Write:** Insert Row, Batch Insert Rows, Upsert Row. +- **Update and delete:** Update Row by ID, Update Rows by Filter, Delete Row by ID, Delete Rows by Filter. + +Every row carries three built-in columns alongside your own: `id` (the row's unique identifier), `createdAt`, and `updatedAt`. Sim manages these for you, so you never include them when inserting. You can still filter and sort on them. + +## Reading rows + +**Query Rows** retrieves rows from a table, with optional filtering, sorting, and pagination. It's how a workflow gets its input from a table. + +For our example, the block queries `leads` where `status` equals `unprocessed`. Its output holds the matching rows plus counts: + +``` +{ success: true, rows: [ { id: "row_...", company: "Acme", ... } ], rowCount: 5, totalCount: 42 } +``` + +Later blocks read these by name: `` is the array, `` is how many came back, `` is how many matched the filter before the limit. (For more on reading outputs by reference, see [how blocks pass data](/workflows/data-flow).) + + + +**Filter Conditions** narrow the result. In the default **Builder** input mode you add rules visually: pick a column, an operator, and a value. Switch the **Input Mode** to **Editor** to write the filter as an object instead, using operators like `$eq`, `$gt`, `$contains`, and `$in`: + +``` +{ status: "unprocessed", createdAt: { $gte: "2026-06-01" } } +``` + +**Sort Order** orders the result, again visually in Builder mode or as an object in Editor mode, for example `{ createdAt: "desc" }`. **Limit** caps how many rows come back (default 100, max 1000) and **Offset** skips rows for pagination. + +{/* VISUAL: Filter Conditions and Sort Order builders, showing a status = unprocessed rule and a createdAt descending sort, with the equivalent Editor-mode object beside them. */} + +For a one-off point lookup, use **Get Row by ID** with a single `Row ID`. **Get Schema** returns the table's column definitions, useful when a workflow needs to inspect structure before writing. The full operator list lives in the [Table block reference](/integrations/table). + +## Writing rows + +**Insert Row** adds one row. Its **Row Data** is an object whose keys match your column names: + +``` +{ company: "Acme", email: "deals@acme.com", description: "...", status: "unprocessed" } +``` + +The output is the inserted row, including the `id` and timestamps Sim generated for it. + +**Batch Insert Rows** adds many rows in one operation (up to 1000) from a **Rows Data** array. Use it instead of looping Insert Row when you have a set of results to load at once. Its output reports `insertedCount`. + +**Upsert Row** inserts a row, or updates the existing one if it matches a unique column. Its output includes an `operation` field set to `insert` or `update`, so a later block can tell which happened. + + +Row data must match the table's columns and types. A `number` column rejects `"twenty"`; a `boolean` column wants `true`, not `"true"`. If an Agent produces the value, give it a [structured output](/blocks/agent) so the shape is predictable before it reaches the table. + + +## Updating rows + +To change an existing row you either name it or filter for it. + +**Update Row by ID** modifies one row. It takes a `Row ID`, often `` from an earlier query, and **Row Data** with only the fields you want to change. Unlisted fields stay as they were. + +**Update Rows by Filter** changes every row that matches a filter, which is the right tool when you don't know the IDs. In our example, after the Agent classifies leads, the workflow sets `status` to `qualified` on all rows where `status` is `unprocessed`. The output reports `updatedCount` and the list of `updatedRowIds`. + +{/* VISUAL: before/after of the leads table. Left shows rows with status "unprocessed" and an empty category column; right shows the same rows with category filled in and status "qualified". */} + +**Delete Row by ID** and **Delete Rows by Filter** remove rows the same two ways, by ID or by filter, and report a `deletedCount`. Deletes are mostly for cleanup, not part of the everyday read-process-write loop. + +## Example: enriching rows + +One way to combine the operations is to query rows, process them, and write the results back. Here, the workflow classifies unprocessed leads: + +1. **Table (Query Rows)** reads `leads` where `status` is `unprocessed`. +2. **Agent** reads a row's fields, classifies it, and returns a [structured output](/blocks/agent) like `{ category: "enterprise", score: 0.9 }`. +3. **Table (Update Rows by Filter)** writes the category back and flips `status` to `qualified`. + +After the run, the table holds the enriched rows. The next run queries them again, and the `status` column keeps the workflow from reprocessing what it already handled. So the table serves as both the queue the workflow pulls from and the record of what it has already done. + + + +## Variations + +**Lookup mid-run.** A Table block doesn't have to be the first or last step. Place a Query Rows in the middle to fetch reference data while processing: query a `pricing` table by the order's currency, then let the Agent use the result to compute a total. + +**Iterate row by row.** Wrap a Query → process → update cycle in a [Loop block](/blocks/loop) to handle one row at a time. This runs sequentially, slower than a batch update but useful when each row needs its own multi-step logic. Inside the loop the Agent reads the current row and an Update Row by ID writes its result. + +**Paginate large reads.** Query Rows returns at most 1000 rows. When `totalCount` exceeds your **Limit**, increase **Offset** on each pass (0, then 100, then 200) to walk through the whole table, typically inside a Loop. + +## Inspecting reads and writes + +Every Table block's input and output is recorded in [logs](/logs-debugging). For a Query block, the log shows the filter and sort it sent and the rows it received. For an Update or Insert, it shows the row data written and the count affected. When a write does nothing or a query comes back empty, the log is where you check the filter and the data shape before looking anywhere else. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/tables/workflow-columns.mdx b/apps/docs/content/docs/en/tables/workflow-columns.mdx new file mode 100644 index 00000000000..fd077eb98b2 --- /dev/null +++ b/apps/docs/content/docs/en/tables/workflow-columns.mdx @@ -0,0 +1,152 @@ +--- +title: Workflow columns +description: A column backed by a workflow that runs once per row, reading chosen columns as inputs and writing its results back into result columns. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { Image } from '@/components/ui/image' + +A [table](/tables) is a grid of typed columns. Usually you type a column's values in. A **workflow column** is different: its values come from a [workflow](/workflows) that runs once per row. For each row, the workflow reads the columns you choose as input, runs its blocks, and writes its results back into columns on that same row. + +This is what makes a table active. Instead of running a workflow by hand and pasting the results in, you attach the workflow to the table and it fills each row on its own — a bit like a spreadsheet macro that runs on every row, except each step is a full workflow. + +The running example is a table of AI startups, `ai_startup_customers`. The company is typed in; three workflow groups fill everything else: + +The ai_startup_customers table with three workflow groups — Company Domain, Company Info, and Lead Score Enrichment — filling their output columns per row, 21 rows running + +- **Company Domain** finds each company's `domain`. +- **Company Info** reads the domain and fills `employee_count` and `description`. +- **Lead Score Enrichment** reads the info and writes `lead_score`, `priority`, and `score_reasoning`. + +Each group's header spans the columns it owns, every row has a run button (▷), and the toolbar shows the work in flight: here, **21 running**, with **Stop all** beside it. + +``` +domain │ employee_count │ lead_score │ priority +──────────────────┼────────────────┼────────────┼───────── +openai.com │ 5K-10K │ 75 │ Warm +gominimal.ai │ Not found │ 92 │ Hot +genspark.net │ 51-250 │ 20 │ Cold +``` + +## The parts of a workflow column + +### Workflow group + +A **workflow group** is the unit you configure: one workflow, plus how its inputs and outputs map to columns, plus what makes it run. One group can produce several result columns from a single run per row: Lead Score Enrichment fills `lead_score`, `priority`, and `score_reasoning` together. + +A group's **Configure workflow** panel holds everything that defines it, with a preview of the workflow it will run: + +The Configure workflow panel for Lead Score Enrichment: a preview of the LeadScorer workflow, the workflow picker, three output columns selected, Auto-run on, and six Run after dependencies + +- **Workflow** picks which workflow runs per row; here, *Lead Score Enrichment*. +- **Add column inputs** maps columns to the workflow's inputs. +- **Output columns** picks which workflow outputs to write back; here, 3 are selected. +- **Auto-run workflow** and **Run after** control when rows run (both below). + +### Input columns + +**Input columns** feed the workflow. Each mapping binds one column to one input field on the workflow's [Start](/triggers/start) trigger. In the Company Info group, the workflow's required `Company domain` input is bound to the `domain` column: + +The Company Info group's mapping: the required Company domain input bound to the domain column, and the employee count and description outputs bound to their column names + +When the group runs a row, that row's `domain` value becomes the workflow's input, read from its [Start](/triggers/start) trigger like any other input. The workflow only sees the columns you mapped; the rest of the row is untouched, and inputs are read-only during the run. + +### Output columns + +**Output columns** receive the workflow's results. Each one binds a workflow output to a column name — in the panel above, the workflow's `employee count` output writes to the `employee_count_0` column and `description` writes to `description`. The workflow runs once per row; every output you selected is written to its column, and outputs you didn't select are discarded. + +### Run after + +**Run after** is the set of columns that must be filled before the group runs on a row. Company Info runs after `domain`: a row with an empty `domain` waits, and the moment Company Domain fills it, that row becomes eligible. Lead Score Enrichment runs after the info columns, the six dependencies in the panel above. + +A dependency can be a typed column or another group's output column. That second case is what makes cascades work (below). At least one dependency is required when auto-run is on. + +### Auto-run + +**Auto-run** decides whether the group fires on its own. With auto-run on, a group runs a row as soon as that row's Run-after columns are filled, no click needed; that's how 21 rows end up running at once in the example. With it off, the group is manual: it runs only when you trigger it. + +You trigger a group by hand from its column header menu: + +- **Run this row** runs the one row. +- **Run all rows** runs every row, and re-runs rows that already finished. +- **Run empty rows** runs only rows whose output columns are still empty. +- **Run selected rows** runs the rows you've checked. + +Auto-run only ever runs rows it hasn't attempted yet. To re-run a single row, use **Re-run cell** from the cell's menu; to re-run everything, use **Run all rows**. + +### Execution status + +While a group works a row, its output cells show their state instead of a value: + +| State | Meaning | +| --- | --- | +| **Pending** | Waiting on a Run-after column that isn't filled yet. | +| **Queued** | Eligible and waiting to start. | +| **Running** | The workflow is executing for this row. | +| **Error** | A block failed. The cell links to which block and why. | +| **Cancelled** | The run was stopped before it finished. | +| **Not found** | An enrichment finished but matched nothing for this row. | + +When a value arrives, it replaces the badge, and cells that finish stay filled even while other columns on the row are still running. You can see this in the example table: most rows are fully scored, while a few show **Not found** where an enrichment came up empty. The lead scorer still ran on those rows, working with what it had. + + +On error, the row stays in the **Error** state. Auto-run skips errored rows, so a failure doesn't loop. To retry, fix the input and re-run the cell. A row is only ever worked by one run at a time, so re-running doesn't race. + + +### Inspecting a row's run + +Every value in a workflow column comes from a real workflow run, and each one is inspectable. Open a cell's menu to act on that row: + +A lead_score cell's menu: View execution, Re-run cell, insert and duplicate row actions, and Delete row + +**View execution** opens the run's trace: each block with its status, timing, and credit cost, the same view as the [Logs](/logs-debugging) page. Here, the row's score came from a 1.86s run of the LeadScorer workflow: + +The Log Details trace for one row's run: Workflow Execution at 1.86s with Start and LeadScorer spans, marked Success + +**Re-run cell** runs the group again for just that row, replacing its values when the run finishes. + +## Cascades + +Because a group can run after another group's output column, you can chain groups across the table. The example is a three-stage **cascade**: Company Domain fills `domain` from the company name, Company Info runs after `domain` and fills the info columns, and Lead Score Enrichment runs after those and writes the score. Each row advances through the stages independently: the moment its own Run-after columns are filled, it becomes eligible for the next group. That's why some rows in the screenshot are fully scored while others are still mid-pipeline. + +## When to use a workflow column + +Reach for a workflow column when you have a row-by-row job: enrich each record, classify each entry, score each lead. The work is the same shape on every row, and you want the results to live next to the source data. + +Use a [workflow on its own](/workflows) instead when the job isn't per-row: a one-off transform, an aggregation across many rows, or a real-time decision tied to a single request. To pull table data into a workflow rather than push workflow results into a table, see [using tables in workflows](/tables/using-in-workflows). + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/tools/emailbison.mdx b/apps/docs/content/docs/en/tools/emailbison.mdx deleted file mode 100644 index d1cdeba8475..00000000000 --- a/apps/docs/content/docs/en/tools/emailbison.mdx +++ /dev/null @@ -1,435 +0,0 @@ ---- -title: Email Bison -description: Manage Email Bison leads, campaigns, replies, and tags ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -## Usage Instructions - -Integrate Email Bison into workflows. Create and update leads, manage campaigns, attach leads to campaigns, list replies, and organize leads with tags. - - - -## Tools - -### `emailbison_list_leads` - -Retrieves leads from Email Bison with optional search and tag filters. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `search` | string | No | Search term for filtering leads | -| `campaignStatus` | string | No | Lead campaign status filter: in_sequence, sequence_finished, sequence_stopped, never_contacted, or replied | -| `tagIds` | array | No | Tag IDs to include | -| `excludedTagIds` | array | No | Tag IDs to exclude | -| `withoutTags` | boolean | No | Only return leads without tags | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_get_lead` - -Retrieves a lead by Email Bison lead ID or email address. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `leadId` | string | Yes | Lead ID or email address | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_create_lead` - -Creates a single lead in Email Bison. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `firstName` | string | Yes | Lead first name | -| `lastName` | string | Yes | Lead last name | -| `email` | string | Yes | Lead email address | -| `title` | string | No | Lead job title | -| `company` | string | No | Lead company | -| `notes` | string | No | Additional notes about the lead | -| `customVariables` | array | No | Custom variables to store on the lead | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_update_lead` - -Updates an existing Email Bison lead. Fields omitted from a PUT update may be cleared by Email Bison. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `leadId` | string | Yes | Lead ID or email address | -| `firstName` | string | Yes | Lead first name | -| `lastName` | string | Yes | Lead last name | -| `email` | string | Yes | Lead email address | -| `title` | string | No | Lead job title | -| `company` | string | No | Lead company | -| `notes` | string | No | Additional notes about the lead | -| `customVariables` | array | No | Custom variables to store on the lead | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_list_campaigns` - -Retrieves Email Bison campaigns. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_create_campaign` - -Creates a new Email Bison campaign. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `name` | string | Yes | Campaign name | -| `campaignType` | string | No | Campaign type: outbound or reply_followup | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_update_campaign` - -Updates Email Bison campaign settings. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `campaignId` | number | Yes | Campaign ID | -| `name` | string | No | Campaign name | -| `maxEmailsPerDay` | number | No | Maximum emails per day | -| `maxNewLeadsPerDay` | number | No | Maximum new leads per day | -| `plainText` | boolean | No | Send plain text emails | -| `openTracking` | boolean | No | Enable open tracking | -| `reputationBuilding` | boolean | No | Enable reputation building | -| `canUnsubscribe` | boolean | No | Enable unsubscribe link | -| `includeAutoRepliesInStats` | boolean | No | Include auto replies in campaign stats | -| `sequencePrioritization` | string | No | Sequence prioritization: followups or new_leads | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_update_campaign_status` - -Pauses, resumes, or archives an Email Bison campaign. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `campaignId` | number | Yes | Campaign ID | -| `action` | string | Yes | Status action: pause, resume, or archive | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_attach_leads_to_campaign` - -Adds existing Email Bison leads to a campaign. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `campaignId` | number | Yes | Campaign ID | -| `leadIds` | array | Yes | Lead IDs to add to the campaign | -| `allowParallelSending` | boolean | No | Force add leads already in sequence in other campaigns | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_list_replies` - -Retrieves Email Bison replies with optional status, folder, campaign, sender, lead, and tag filters. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `search` | string | No | Search term for replies | -| `status` | string | No | Reply status: interested, automated_reply, or not_automated_reply | -| `folder` | string | No | Reply folder: inbox, sent, spam, bounced, or all | -| `read` | boolean | No | Filter by read state | -| `campaignId` | number | No | Campaign ID | -| `senderEmailId` | number | No | Sender email ID | -| `leadId` | number | No | Lead ID | -| `tagIds` | array | No | Tag IDs to filter replies by | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_list_tags` - -Retrieves all Email Bison tags for the authenticated workspace. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_create_tag` - -Creates a new Email Bison tag. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `name` | string | Yes | Tag name | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - -### `emailbison_attach_tags_to_leads` - -Attaches Email Bison tags to one or more leads. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `tagIds` | array | Yes | Tag IDs to attach | -| `leadIds` | array | Yes | Lead IDs to tag | -| `skipWebhooks` | boolean | No | Skip Email Bison webhooks for this action | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `leads` | array | List of leads | -| `campaigns` | array | List of campaigns | -| `replies` | array | List of replies | -| `tags` | array | List of tags | -| `count` | number | Number of returned records | -| `id` | number | Record ID | -| `uuid` | string | Record UUID | -| `name` | string | Campaign or tag name | -| `first_name` | string | Lead first name | -| `last_name` | string | Lead last name | -| `email` | string | Lead email address | -| `status` | string | Record status | -| `success` | boolean | Whether the action succeeded | -| `message` | string | Action message | - - diff --git a/apps/docs/content/docs/en/tools/index.mdx b/apps/docs/content/docs/en/tools/index.mdx deleted file mode 100644 index deeb2a74064..00000000000 --- a/apps/docs/content/docs/en/tools/index.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Overview -description: Powerful tools to enhance your agentic workflows ---- - -import { Card, Cards } from "fumadocs-ui/components/card"; -import { Step, Steps } from "fumadocs-ui/components/steps"; -import { Video } from '@/components/ui/video'; -import { FAQ } from '@/components/ui/faq'; - -Tools are powerful components in Sim that allow your workflows to interact with external services, process data, and perform specialized tasks. They extend the capabilities of your agents and workflows by providing access to various APIs and services. - -
-
- -## What is a Tool? - -A tool is a specialized component that provides a specific functionality or integration with external services. Tools can be used to search the web, interact with databases, process images, generate text or images, communicate via messaging platforms, and much more. - -## Using Tools in Workflows - -There are two primary ways to use tools in your Sim workflows: - - - - As Standalone Blocks: Tools can be added as individual - blocks on the canvas when you need deterministic, direct access to their - functionality. This gives you precise control over when and how the tool is - called. - - - As Agent Tools: Tools can be added to Agent blocks by - clicking "Add tools" and configuring the required parameters. This allows - agents to dynamically choose which tools to use based on the context and - requirements of the task. - - - -## Tool Configuration - -Each tool requires specific configuration to function properly. Common configuration elements include: - -- **API Keys**: Many tools require authentication through API keys -- **Connection Parameters**: Endpoints, database identifiers, etc. -- **Input Formatting**: How data should be structured for the tool -- **Output Handling**: How to process the results from the tool - -## Available Tools - -Sim provides a diverse collection of tools for various purposes, including: - -- **AI and Language Processing**: OpenAI, ElevenLabs, Google Translate -- **Search and Research**: Google Search, Tavily, Exa, Perplexity -- **Document Manipulation**: Google Docs, Google Sheets, Notion, Confluence -- **Media Processing**: Vision -- **Communication**: Slack, WhatsApp, Twilio SMS, Gmail -- **Data Storage**: Pinecone, Supabase, Airtable -- **Development**: GitHub - -Each tool has its own dedicated documentation page with detailed instructions on configuration and usage. - -## Tool Outputs - -Tools typically return structured data that can be processed by subsequent blocks in your workflow. The format of this data varies depending on the tool and operation but generally includes: - -- The main content or result -- Metadata about the operation -- Status information - -Refer to each tool's specific documentation to understand its exact output format. - - - diff --git a/apps/docs/content/docs/en/tools/lemlist.mdx b/apps/docs/content/docs/en/tools/lemlist.mdx deleted file mode 100644 index c2ed048f496..00000000000 --- a/apps/docs/content/docs/en/tools/lemlist.mdx +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Lemlist -description: Manage outreach activities, leads, and send emails via Lemlist ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -{/* MANUAL-CONTENT-START:intro */} -Supercharge your sales outreach and engagement with [Lemlist](https://lemlist.com) – the personalized outreach automation platform trusted by thousands of sales teams. With Lemlist, you can automate multi-channel campaigns, nurture leads, and boost reply rates, all while keeping your communication highly personalized and authentic. - -With the Lemlist integration, you can: - -- **Automate outreach sequences:** Launch personalized email, LinkedIn, and calling campaigns at scale, tailored to each recipient. -- **Track campaign activity:** Instantly monitor opens, clicks, replies, bounces, and every lead interaction for granular campaign insights. -- **Centralize engagement data:** Fetch real-time activity and replies for each campaign or lead, and sync it directly into your workflow automation. -- **Get lead details automatically:** Retrieve enriched lead information by email or ID to keep your CRM and processes up to date without manual data entry. -- **Send targeted emails from your inbox:** Trigger bespoke emails to leads directly from the workflow, using up-to-date templates and data. -- **Boost team collaboration and follow-up:** Assign leads, track outcomes, and ensure no prospect is lost thanks to Lemlist’s built-in tools—all accessible via automation. - -Lemlist empowers sales, marketing, and outbound teams to save time, personalize at scale, and convert more prospects. Automate and optimize your campaigns, integrate with your stack, and never miss a valuable opportunity. - -Drive more replies, book more meetings, and grow your pipeline by connecting Lemlist to your automated workflows today! -{/* MANUAL-CONTENT-END */} - - -## Usage Instructions - -Integrate Lemlist into your workflow. Retrieve campaign activities and replies, get lead information, and send emails through the Lemlist inbox. - - - -## Tools - -### `lemlist_get_activities` - -Retrieves campaign activities and steps performed, including email opens, clicks, replies, and other events. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Lemlist API key | -| `type` | string | No | Filter by activity type \(e.g., emailOpened, emailClicked, emailReplied, paused\) | -| `campaignId` | string | No | Filter by campaign ID \(e.g., "cam_abc123def456"\) | -| `leadId` | string | No | Filter by lead ID \(e.g., "lea_abc123def456"\) | -| `isFirst` | boolean | No | Filter for first activity only | -| `limit` | number | No | Number of results per request \(e.g., 50\). Max 100, default 100 | -| `offset` | number | No | Number of records to skip for pagination \(e.g., 0, 100, 200\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `activities` | array | List of activities | -| ↳ `_id` | string | Activity ID | -| ↳ `type` | string | Activity type | -| ↳ `leadId` | string | Associated lead ID | -| ↳ `campaignId` | string | Campaign ID | -| ↳ `sequenceId` | string | Sequence ID | -| ↳ `stepId` | string | Step ID | -| ↳ `createdAt` | string | When the activity occurred | -| `count` | number | Number of activities returned | - -### `lemlist_get_lead` - -Retrieves lead information by email address or lead ID. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Lemlist API key | -| `leadIdentifier` | string | Yes | Lead email address \(e.g., "john@example.com"\) or lead ID \(e.g., "lea_abc123def456"\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `_id` | string | Lead ID | -| `email` | string | Lead email address | -| `firstName` | string | Lead first name | -| `lastName` | string | Lead last name | -| `companyName` | string | Company name | -| `jobTitle` | string | Job title | -| `companyDomain` | string | Company domain | -| `isPaused` | boolean | Whether the lead is paused | -| `campaignId` | string | Campaign ID the lead belongs to | -| `contactId` | string | Contact ID | -| `emailStatus` | string | Email deliverability status | - -### `lemlist_send_email` - -Sends an email to a contact through the Lemlist inbox. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Lemlist API key | -| `sendUserId` | string | Yes | Identifier for the user sending the message \(e.g., "usr_abc123def456"\) | -| `sendUserEmail` | string | Yes | Email address of the sender \(e.g., "sales@company.com"\) | -| `sendUserMailboxId` | string | Yes | Mailbox identifier for the sender \(e.g., "mbx_abc123def456"\) | -| `contactId` | string | Yes | Recipient contact identifier \(e.g., "con_abc123def456"\) | -| `leadId` | string | Yes | Associated lead identifier \(e.g., "lea_abc123def456"\) | -| `subject` | string | Yes | Email subject line | -| `message` | string | Yes | Email message body in HTML format | -| `cc` | json | No | Array of CC email addresses | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `ok` | boolean | Whether the email was sent successfully | - - diff --git a/apps/docs/content/docs/en/tools/meta.json b/apps/docs/content/docs/en/tools/meta.json deleted file mode 100644 index c2edcceb166..00000000000 --- a/apps/docs/content/docs/en/tools/meta.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "pages": [ - "index", - "agentmail", - "agentphone", - "agiloft", - "ahrefs", - "airtable", - "airweave", - "algolia", - "amplitude", - "apify", - "apollo", - "appconfig", - "arxiv", - "asana", - "ashby", - "athena", - "attio", - "azure_devops", - "box", - "brandfetch", - "brightdata", - "browser_use", - "calcom", - "calendly", - "clay", - "clerk", - "clickhouse", - "cloudflare", - "cloudformation", - "cloudwatch", - "confluence", - "crowdstrike", - "cursor", - "dagster", - "databricks", - "datadog", - "devin", - "discord", - "docusign", - "dropbox", - "dspy", - "dub", - "duckduckgo", - "dynamodb", - "elasticsearch", - "elevenlabs", - "emailbison", - "enrich", - "enrichment", - "evernote", - "exa", - "extend", - "fathom", - "findymail", - "firecrawl", - "fireflies", - "gamma", - "github", - "gitlab", - "gmail", - "gong", - "google_ads", - "google_bigquery", - "google_books", - "google_calendar", - "google_contacts", - "google_docs", - "google_drive", - "google_forms", - "google_groups", - "google_maps", - "google_meet", - "google_pagespeed", - "google_search", - "google_sheets", - "google_slides", - "google_tasks", - "google_translate", - "google_vault", - "grafana", - "grain", - "granola", - "greenhouse", - "greptile", - "hex", - "hubspot", - "huggingface", - "hunter", - "iam", - "identity_center", - "incidentio", - "infisical", - "instantly", - "intercom", - "jina", - "jira", - "jira_service_management", - "kalshi", - "ketch", - "langsmith", - "launchdarkly", - "lemlist", - "linear", - "linkedin", - "linkup", - "linq", - "loops", - "luma", - "mailchimp", - "mailgun", - "mem0", - "microsoft_ad", - "microsoft_dataverse", - "microsoft_excel", - "microsoft_planner", - "microsoft_teams", - "millionverifier", - "mistral_parse", - "monday", - "mongodb", - "neo4j", - "neverbounce", - "new_relic", - "notion", - "obsidian", - "okta", - "onedrive", - "onepassword", - "openai", - "outlook", - "pagerduty", - "parallel_ai", - "peopledatalabs", - "perplexity", - "pinecone", - "pipedrive", - "polymarket", - "posthog", - "profound", - "prospeo", - "pulse", - "qdrant", - "quiver", - "railway", - "rb2b", - "rds", - "reddit", - "redis", - "reducto", - "resend", - "revenuecat", - "rippling", - "rootly", - "s3", - "salesforce", - "sap_concur", - "sap_s4hana", - "secrets_manager", - "sendblue", - "sendgrid", - "sentry", - "serper", - "servicenow", - "ses", - "sharepoint", - "shopify", - "similarweb", - "sixtyfour", - "slack", - "sqs", - "stagehand", - "stripe", - "sts", - "supabase", - "tailscale", - "tavily", - "telegram", - "textract", - "tinybird", - "trello", - "twilio_sms", - "twilio_voice", - "typeform", - "upstash", - "vercel", - "wealthbox", - "webflow", - "whatsapp", - "wikipedia", - "wiza", - "wordpress", - "workday", - "x", - "youtube", - "zendesk", - "zep", - "zerobounce", - "zoom", - "zoominfo" - ] -} diff --git a/apps/docs/content/docs/en/tools/notion.mdx b/apps/docs/content/docs/en/tools/notion.mdx deleted file mode 100644 index 392a52d685b..00000000000 --- a/apps/docs/content/docs/en/tools/notion.mdx +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: Notion -description: Manage Notion pages ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -{/* MANUAL-CONTENT-START:intro */} -The Notion tool integration enables your agents to read, create, and manage Notion pages and databases directly within your workflows. This allows you to automate the retrieval and updating of structured content, notes, documents, and more from your Notion workspace. - -With the Notion tool, you can: - -- **Read pages or databases**: Extract rich content or metadata from specified Notion pages or entire databases -- **Create new content**: Programmatically create new pages or databases for dynamic content generation -- **Append content**: Add new blocks or properties to existing pages and databases -- **Query databases**: Run advanced filters and searches on structured Notion data for custom workflows -- **Search your workspace**: Locate pages and databases across your Notion workspace automatically - -This tool is ideal for scenarios where agents need to synchronize information, generate reports, or maintain structured notes within Notion. By bringing Notion's capabilities into automated workflows, you empower your agents to interface with knowledge, documentation, and project management data programmatically and seamlessly. -{/* MANUAL-CONTENT-END */} - - -## Usage Instructions - -Integrate with Notion into the workflow. Can read page, read database, create page, create database, append content, query database, and search workspace. - - - -## Tools - -### `notion_read` - -Read content from a Notion page - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `pageId` | string | Yes | The UUID of the Notion page to read | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `url` | string | Notion page URL | -| `created_time` | string | ISO 8601 creation timestamp | -| `last_edited_time` | string | ISO 8601 last edit timestamp | -| `content` | string | Page content in markdown format | -| `title` | string | Page title | - -### `notion_read_database` - -Read database information and structure from Notion - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `databaseId` | string | Yes | The UUID of the Notion database to read | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Database UUID | -| `url` | string | Notion database URL | -| `created_time` | string | ISO 8601 creation timestamp | -| `last_edited_time` | string | ISO 8601 last edit timestamp | -| `properties` | object | Database properties schema | -| `title` | string | Database title | - -### `notion_write` - -Append content to a Notion page - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `pageId` | string | Yes | The UUID of the Notion page to append content to | -| `content` | string | Yes | The content to append to the page | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `appended` | boolean | Whether content was successfully appended | - -### `notion_create_page` - -Create a new page in Notion - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `parentId` | string | Yes | The UUID of the parent Notion page where this page will be created | -| `title` | string | No | Title of the new page | -| `content` | string | No | Optional content to add to the page upon creation | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Page UUID | -| `url` | string | Notion page URL | -| `created_time` | string | ISO 8601 creation timestamp | -| `last_edited_time` | string | ISO 8601 last edit timestamp | -| `title` | string | Page title | - -### `notion_update_page` - -Update properties of a Notion page - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `pageId` | string | Yes | The UUID of the Notion page to update | -| `properties` | json | Yes | JSON object of properties to update | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Page UUID | -| `url` | string | Notion page URL | -| `last_edited_time` | string | ISO 8601 last edit timestamp | -| `title` | string | Page title | - -### `notion_query_database` - -Query and filter Notion database entries with advanced filtering - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `databaseId` | string | Yes | The UUID of the Notion database to query | -| `filter` | string | No | Filter conditions as JSON \(optional\) | -| `sorts` | string | No | Sort criteria as JSON array \(optional\) | -| `pageSize` | number | No | Number of results to return \(default: 100, max: 100\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `results` | array | Array of page objects from the database | -| ↳ `object` | string | Always "page" | -| ↳ `id` | string | Page UUID | -| ↳ `created_time` | string | ISO 8601 creation timestamp | -| ↳ `last_edited_time` | string | ISO 8601 last edit timestamp | -| ↳ `created_by` | object | Partial user object | -| ↳ `object` | string | Always "user" | -| ↳ `id` | string | User UUID | -| ↳ `last_edited_by` | object | Partial user object | -| ↳ `object` | string | Always "user" | -| ↳ `id` | string | User UUID | -| ↳ `archived` | boolean | Whether the page is archived | -| ↳ `in_trash` | boolean | Whether the page is in trash | -| ↳ `url` | string | Notion page URL | -| ↳ `public_url` | string | Public web URL if shared, null otherwise | -| ↳ `parent` | object | Parent object specifying hierarchical relationship | -| ↳ `type` | string | Parent type: "database_id", "data_source_id", "page_id", "workspace", or "block_id" | -| ↳ `database_id` | string | Parent database UUID \(if type is database_id\) | -| ↳ `data_source_id` | string | Parent data source UUID \(if type is data_source_id\) | -| ↳ `page_id` | string | Parent page UUID \(if type is page_id\) | -| ↳ `workspace` | boolean | True if parent is workspace \(if type is workspace\) | -| ↳ `block_id` | string | Parent block UUID \(if type is block_id\) | -| ↳ `icon` | object | Page/database icon \(emoji, custom_emoji, or file\) | -| ↳ `url` | string | Authenticated URL valid for one hour | -| ↳ `expiry_time` | string | ISO 8601 timestamp when URL expires | -| ↳ `cover` | object | Page/database cover image | -| ↳ `type` | string | File type: "file", "file_upload", or "external" | -| ↳ `file` | object | Notion-hosted file object \(when type is "file"\) | -| ↳ `url` | string | Authenticated URL valid for one hour | -| ↳ `expiry_time` | string | ISO 8601 timestamp when URL expires | -| ↳ `file_upload` | object | API-uploaded file object \(when type is "file_upload"\) | -| ↳ `id` | string | File upload UUID | -| ↳ `external` | object | External file object \(when type is "external"\) | -| ↳ `url` | string | External file URL \(never expires\) | -| ↳ `properties` | object | Page property values \(structure depends on parent type - database properties or title only\) | -| `has_more` | boolean | Whether more results are available | -| `next_cursor` | string | Cursor for next page of results | -| `total_results` | number | Number of results returned | - -### `notion_search` - -Search across all pages and databases in Notion workspace - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `query` | string | No | Search terms to find pages and databases \(leave empty to get all pages\) | -| `filterType` | string | No | Filter by object type: "page", "database", or leave empty for all | -| `pageSize` | number | No | Number of results to return \(default: 100, max: 100\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `results` | array | Array of search results \(pages and/or databases\) | -| ↳ `object` | string | Object type: "page" or "database" | -| ↳ `id` | string | Object UUID | -| ↳ `created_time` | string | ISO 8601 creation timestamp | -| ↳ `last_edited_time` | string | ISO 8601 last edit timestamp | -| ↳ `created_by` | object | Partial user object | -| ↳ `object` | string | Always "user" | -| ↳ `id` | string | User UUID | -| ↳ `last_edited_by` | object | Partial user object | -| ↳ `object` | string | Always "user" | -| ↳ `id` | string | User UUID | -| ↳ `archived` | boolean | Whether the object is archived | -| ↳ `in_trash` | boolean | Whether the object is in trash | -| ↳ `url` | string | Object URL | -| ↳ `public_url` | string | Public web URL if shared | -| ↳ `parent` | object | Parent object specifying hierarchical relationship | -| ↳ `type` | string | Parent type: "database_id", "data_source_id", "page_id", "workspace", or "block_id" | -| ↳ `database_id` | string | Parent database UUID \(if type is database_id\) | -| ↳ `data_source_id` | string | Parent data source UUID \(if type is data_source_id\) | -| ↳ `page_id` | string | Parent page UUID \(if type is page_id\) | -| ↳ `workspace` | boolean | True if parent is workspace \(if type is workspace\) | -| ↳ `block_id` | string | Parent block UUID \(if type is block_id\) | -| ↳ `properties` | object | Object properties | -| `has_more` | boolean | Whether more results are available | -| `next_cursor` | string | Cursor for next page of results | -| `total_results` | number | Number of results returned | - -### `notion_create_database` - -Create a new database in Notion with custom properties - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `parentId` | string | Yes | ID of the parent page where the database will be created | -| `title` | string | Yes | Title for the new database | -| `properties` | json | No | Database properties as JSON object \(optional, will create a default "Name" property if empty\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Database UUID | -| `url` | string | Notion database URL | -| `created_time` | string | ISO 8601 creation timestamp | -| `properties` | object | Database properties schema | -| `title` | string | Database title | - -### `notion_add_database_row` - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `databaseId` | string | Yes | ID of the database to add the row to | -| `properties` | json | Yes | Row properties as JSON object matching the database schema \(e.g., \{"Name": \{"title": \[\{"text": \{"content": "Task 1"\}\}\]\}, "Status": \{"select": \{"name": "Done"\}\}\}\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Page UUID | -| `url` | string | Notion page URL | -| `created_time` | string | ISO 8601 creation timestamp | -| `last_edited_time` | string | ISO 8601 last edit timestamp | -| `title` | string | Row title | - - diff --git a/apps/docs/content/docs/en/tools/resend.mdx b/apps/docs/content/docs/en/tools/resend.mdx deleted file mode 100644 index 83057efc0fe..00000000000 --- a/apps/docs/content/docs/en/tools/resend.mdx +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: Resend -description: Send emails and manage contacts with Resend. ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -{/* MANUAL-CONTENT-START:intro */} -[Resend](https://resend.com/) is a modern email service designed for developers to send transactional and marketing emails with ease. It provides a simple, reliable API and dashboard for managing email delivery, templates, and analytics, making it a popular choice for integrating email functionality into applications and workflows. - -With Resend, you can: - -- **Send transactional emails**: Deliver password resets, notifications, confirmations, and more with high deliverability -- **Manage templates**: Create and update email templates for consistent branding and messaging -- **Track analytics**: Monitor delivery, open, and click rates to optimize your email performance -- **Integrate easily**: Use a straightforward API and SDKs for seamless integration with your applications -- **Ensure security**: Benefit from robust authentication and domain verification to protect your email reputation - -In Sim, the Resend integration allows your agents to programmatically send emails as part of your automated workflows. This enables use cases such as sending notifications, alerts, or custom messages directly from your Sim-powered agents. By connecting Sim with Resend, you can automate communication tasks, ensuring timely and reliable email delivery without manual intervention. The integration leverages your Resend API key, keeping your credentials secure while enabling powerful email automation scenarios. -{/* MANUAL-CONTENT-END */} - - -## Usage Instructions - -Integrate Resend into your workflow. Send emails, retrieve email status, manage contacts, and view domains. Requires API Key. - - - -## Tools - -### `resend_send` - -Send an email using your own Resend API key and from address - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `fromAddress` | string | Yes | Email address to send from \(e.g., "sender@example.com" or "Sender Name <sender@example.com>"\) | -| `to` | string | Yes | Recipient email address \(e.g., "recipient@example.com" or "Recipient Name <recipient@example.com>"\) | -| `subject` | string | Yes | Email subject line | -| `body` | string | Yes | Email body content \(plain text or HTML based on contentType\) | -| `contentType` | string | No | Content type for the email body: "text" for plain text or "html" for HTML content | -| `cc` | string | No | Carbon copy recipient email address | -| `bcc` | string | No | Blind carbon copy recipient email address | -| `replyTo` | string | No | Reply-to email address | -| `scheduledAt` | string | No | Schedule email to be sent later in ISO 8601 format | -| `tags` | string | No | Comma-separated key:value pairs for email tags \(e.g., "category:welcome,type:onboarding"\) | -| `resendApiKey` | string | Yes | Resend API key for sending emails | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `success` | boolean | Whether the email was sent successfully | -| `id` | string | Email ID returned by Resend | -| `to` | string | Recipient email address | -| `subject` | string | Email subject | -| `body` | string | Email body content | - -### `resend_get_email` - -Retrieve details of a previously sent email by its ID - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `emailId` | string | Yes | The ID of the email to retrieve | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Email ID | -| `from` | string | Sender email address | -| `to` | array | Recipient email addresses | -| `subject` | string | Email subject | -| `html` | string | HTML email content | -| `text` | string | Plain text email content | -| `cc` | array | CC email addresses | -| `bcc` | array | BCC email addresses | -| `replyTo` | array | Reply-to email addresses | -| `lastEvent` | string | Last event status \(e.g., delivered, bounced\) | -| `createdAt` | string | Email creation timestamp | -| `scheduledAt` | string | Scheduled send timestamp | -| `tags` | array | Email tags as name-value pairs | -| ↳ `name` | string | Tag name | -| ↳ `value` | string | Tag value | - -### `resend_create_contact` - -Create a new contact in Resend - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `email` | string | Yes | Email address of the contact | -| `firstName` | string | No | First name of the contact | -| `lastName` | string | No | Last name of the contact | -| `unsubscribed` | boolean | No | Whether the contact is unsubscribed from all broadcasts | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Created contact ID | - -### `resend_list_contacts` - -List all contacts in Resend - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `contacts` | array | Array of contacts | -| ↳ `id` | string | Contact ID | -| ↳ `email` | string | Contact email address | -| ↳ `first_name` | string | Contact first name | -| ↳ `last_name` | string | Contact last name | -| ↳ `created_at` | string | Contact creation timestamp | -| ↳ `unsubscribed` | boolean | Whether the contact is unsubscribed | -| `hasMore` | boolean | Whether there are more contacts to retrieve | - -### `resend_get_contact` - -Retrieve details of a contact by ID or email - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contactId` | string | Yes | The contact ID or email address to retrieve | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Contact ID | -| `email` | string | Contact email address | -| `firstName` | string | Contact first name | -| `lastName` | string | Contact last name | -| `createdAt` | string | Contact creation timestamp | -| `unsubscribed` | boolean | Whether the contact is unsubscribed | - -### `resend_update_contact` - -Update an existing contact in Resend - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contactId` | string | Yes | The contact ID or email address to update | -| `firstName` | string | No | Updated first name | -| `lastName` | string | No | Updated last name | -| `unsubscribed` | boolean | No | Whether the contact should be unsubscribed from all broadcasts | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Updated contact ID | - -### `resend_delete_contact` - -Delete a contact from Resend by ID or email - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contactId` | string | Yes | The contact ID or email address to delete | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Deleted contact ID | -| `deleted` | boolean | Whether the contact was successfully deleted | - -### `resend_list_domains` - -List all verified domains in your Resend account - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `resendApiKey` | string | Yes | Resend API key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `domains` | array | Array of domains | -| ↳ `id` | string | Domain ID | -| ↳ `name` | string | Domain name | -| ↳ `status` | string | Domain verification status | -| ↳ `region` | string | Region the domain is configured in | -| ↳ `createdAt` | string | Domain creation timestamp | -| `hasMore` | boolean | Whether there are more domains to retrieve | - - diff --git a/apps/docs/content/docs/en/tools/servicenow.mdx b/apps/docs/content/docs/en/tools/servicenow.mdx deleted file mode 100644 index 420fe6aee01..00000000000 --- a/apps/docs/content/docs/en/tools/servicenow.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: ServiceNow -description: Create, read, update, and delete ServiceNow records ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -{/* MANUAL-CONTENT-START:intro */} -[ServiceNow](https://www.servicenow.com/) is a powerful cloud platform designed to streamline and automate IT service management (ITSM), workflows, and business processes across your organization. ServiceNow enables you to manage incidents, requests, tasks, users, and more using its extensive API. - -With ServiceNow, you can: - -- **Automate IT workflows**: Create, read, update, and delete records in any ServiceNow table, such as incidents, tasks, change requests, and users. -- **Integrate systems**: Connect ServiceNow with your other tools and processes for seamless automation. -- **Maintain a single source of truth**: Keep all your service and operations data organized and accessible. -- **Drive operational efficiency**: Reduce manual work and improve service quality with customizable workflows and automation. - -In Sim, the ServiceNow integration enables your agents to interact directly with your ServiceNow instance as part of their workflows. Agents can create, read, update, or delete records in any ServiceNow table and leverage ticket or user data for sophisticated automation and decision-making. This integration bridges your workflow automation and IT operations, empowering your agents to manage service requests, incidents, users, and assets without manual intervention. By connecting Sim with ServiceNow, you can automate service management tasks, improve response times, and ensure consistent, secure access to your organization's vital service data. -{/* MANUAL-CONTENT-END */} - - -## Usage Instructions - -Integrate ServiceNow into your workflow. Create, read, update, and delete records in any ServiceNow table including incidents, tasks, change requests, users, and more. - - - -## Tools - -### `servicenow_create_record` - -Create a new record in a ServiceNow table - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | -| `username` | string | Yes | ServiceNow username | -| `password` | string | Yes | ServiceNow password | -| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user\) | -| `fields` | json | Yes | Fields to set on the record as JSON object \(e.g., \{"short_description": "Issue title", "priority": "1"\}\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `record` | json | Created ServiceNow record with sys_id and other fields | -| `metadata` | json | Operation metadata | - -### `servicenow_read_record` - -Read records from a ServiceNow table - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | -| `username` | string | Yes | ServiceNow username | -| `password` | string | Yes | ServiceNow password | -| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | -| `sysId` | string | No | Specific record sys_id \(e.g., 6816f79cc0a8016401c5a33be04be441\) | -| `number` | string | No | Record number \(e.g., INC0010001\) | -| `query` | string | No | Encoded query string \(e.g., "active=true^priority=1"\) | -| `limit` | number | No | Maximum number of records to return \(e.g., 10, 50, 100\) | -| `offset` | number | No | Number of records to skip for pagination \(e.g., 0, 10, 20\) | -| `fields` | string | No | Comma-separated list of fields to return \(e.g., sys_id,number,short_description,state\) | -| `displayValue` | string | No | Return display values for reference fields: "true" \(display only\), "false" \(sys_id only\), or "all" \(both\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `records` | array | Array of ServiceNow records | -| `metadata` | json | Operation metadata | - -### `servicenow_update_record` - -Update an existing record in a ServiceNow table - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | -| `username` | string | Yes | ServiceNow username | -| `password` | string | Yes | ServiceNow password | -| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | -| `sysId` | string | Yes | Record sys_id to update \(e.g., 6816f79cc0a8016401c5a33be04be441\) | -| `fields` | json | Yes | Fields to update as JSON object \(e.g., \{"state": "2", "priority": "1"\}\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `record` | json | Updated ServiceNow record | -| `metadata` | json | Operation metadata | - -### `servicenow_delete_record` - -Delete a record from a ServiceNow table - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `instanceUrl` | string | Yes | ServiceNow instance URL \(e.g., https://instance.service-now.com\) | -| `username` | string | Yes | ServiceNow username | -| `password` | string | Yes | ServiceNow password | -| `tableName` | string | Yes | Table name \(e.g., incident, task, sys_user, change_request\) | -| `sysId` | string | Yes | Record sys_id to delete \(e.g., 6816f79cc0a8016401c5a33be04be441\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `success` | boolean | Whether the deletion was successful | -| `metadata` | json | Operation metadata | - - diff --git a/apps/docs/content/docs/en/triggers/airtable.mdx b/apps/docs/content/docs/en/triggers/airtable.mdx deleted file mode 100644 index 72821490bdc..00000000000 --- a/apps/docs/content/docs/en/triggers/airtable.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Airtable -description: Available Airtable triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Airtable provides 1 trigger for automating workflows based on events. - -## Triggers - -### Airtable Webhook - -Trigger workflow from Airtable record changes like create, update, and delete events (requires Airtable credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires airtable credentials to access your account. | -| `baseId` | string | Yes | The ID of the Airtable Base this webhook will monitor. | -| `tableId` | string | Yes | The ID of the table within the Base that the webhook will monitor. | -| `includeCellValues` | boolean | No | Enable to receive the complete record data in the payload, not just changes. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `payloads` | array | The payloads of the Airtable changes | -| ↳ `timestamp` | string | Timestamp of the change | -| ↳ `baseTransactionNumber` | number | Transaction number | -| `latestPayload` | object | The most recent payload from Airtable | -| ↳ `timestamp` | string | ISO 8601 timestamp of the change | -| ↳ `baseTransactionNumber` | number | Transaction number | -| ↳ `payloadFormat` | string | Payload format version \(e.g., v0\) | -| ↳ `actionMetadata` | object | Metadata about who made the change | -| ↳ `source` | string | Source of the change \(e.g., client, publicApi\) | -| ↳ `sourceMetadata` | object | Source metadata including user info | -| ↳ `user` | object | User who made the change | -| ↳ `id` | string | User ID | -| ↳ `email` | string | User email | -| ↳ `name` | string | User name | -| ↳ `permissionLevel` | string | User permission level | -| ↳ `changedTablesById` | object | Tables that were changed \(keyed by table ID\) | -| ↳ `changedRecordsById` | object | Changed records keyed by record ID | -| ↳ `current` | object | Current state of the record | -| ↳ `cellValuesByFieldId` | object | Cell values keyed by field ID | -| ↳ `createdRecordsById` | object | Created records by ID | -| ↳ `destroyedRecordIds` | array | Array of destroyed record IDs | -| `airtableChanges` | array | Changes made to the Airtable table | -| ↳ `tableId` | string | Table ID | -| ↳ `recordId` | string | Record ID | -| ↳ `changeType` | string | Type of change \(created, changed, destroyed\) | -| ↳ `cellValuesByFieldId` | object | Cell values by field ID | - diff --git a/apps/docs/content/docs/en/triggers/ashby.mdx b/apps/docs/content/docs/en/triggers/ashby.mdx deleted file mode 100644 index b4f557d05f3..00000000000 --- a/apps/docs/content/docs/en/triggers/ashby.mdx +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: Ashby -description: Available Ashby triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Ashby provides 6 triggers for automating workflows based on events. - -## Triggers - -### Ashby Application Submitted - -Trigger workflow when a new application is submitted - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `application` | object | application output from the tool | -| ↳ `id` | string | Application UUID | -| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | -| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | -| ↳ `status` | string | Application status \(Active, Hired, Archived, Lead\) | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | string | Candidate UUID | -| ↳ `name` | string | Candidate name | -| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | -| ↳ `id` | string | Current interview stage UUID | -| ↳ `title` | string | Current interview stage title | -| ↳ `job` | object | job output from the tool | -| ↳ `id` | string | Job UUID | -| ↳ `title` | string | Job title | - - ---- - -### Ashby Candidate Deleted - -Trigger workflow when a candidate is deleted - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `candidate` | object | candidate output from the tool | -| ↳ `id` | string | Deleted candidate UUID | - - ---- - -### Ashby Candidate Hired - -Trigger workflow when a candidate is hired - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `application` | object | application output from the tool | -| ↳ `id` | string | Application UUID | -| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | -| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | -| ↳ `status` | string | Application status \(Hired\) | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | string | Candidate UUID | -| ↳ `name` | string | Candidate name | -| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | -| ↳ `id` | string | Current interview stage UUID | -| ↳ `title` | string | Current interview stage title | -| ↳ `job` | object | job output from the tool | -| ↳ `id` | string | Job UUID | -| ↳ `title` | string | Job title | -| `offer` | object | offer output from the tool | -| ↳ `id` | string | Accepted offer UUID | -| ↳ `applicationId` | string | Associated application UUID | -| ↳ `acceptanceStatus` | string | Offer acceptance status | -| ↳ `offerStatus` | string | Offer process status | -| ↳ `decidedAt` | string | Offer decision timestamp \(ISO 8601\) | -| ↳ `latestVersion` | object | latestVersion output from the tool | -| ↳ `id` | string | Latest offer version UUID | - - ---- - -### Ashby Candidate Stage Change - -Trigger workflow when a candidate changes interview stages - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `application` | object | application output from the tool | -| ↳ `id` | string | Application UUID | -| ↳ `createdAt` | string | Application creation timestamp \(ISO 8601\) | -| ↳ `updatedAt` | string | Application last update timestamp \(ISO 8601\) | -| ↳ `status` | string | Application status \(Active, Hired, Archived, Lead\) | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | string | Candidate UUID | -| ↳ `name` | string | Candidate name | -| ↳ `currentInterviewStage` | object | currentInterviewStage output from the tool | -| ↳ `id` | string | Current interview stage UUID | -| ↳ `title` | string | Current interview stage title | -| ↳ `job` | object | job output from the tool | -| ↳ `id` | string | Job UUID | -| ↳ `title` | string | Job title | - - ---- - -### Ashby Job Created - -Trigger workflow when a new job is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `job` | object | job output from the tool | -| ↳ `id` | string | Job UUID | -| ↳ `title` | string | Job title | -| ↳ `confidential` | boolean | Whether the job is confidential | -| ↳ `status` | string | Job status \(Open, Closed, Draft, Archived\) | -| ↳ `employmentType` | string | Employment type \(Full-time, Part-time, etc.\) | - - ---- - -### Ashby Offer Created - -Trigger workflow when a new offer is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | The webhook event type \(e.g., applicationSubmit, candidateHire\) | -| `offer` | object | offer output from the tool | -| ↳ `id` | string | Offer UUID | -| ↳ `applicationId` | string | Associated application UUID | -| ↳ `acceptanceStatus` | string | Offer acceptance status \(Accepted, Declined, Pending, Created, Cancelled, WaitingOnResponse\) | -| ↳ `offerStatus` | string | Offer process status \(WaitingOnApprovalStart, WaitingOnOfferApproval, WaitingOnCandidateResponse, CandidateAccepted, CandidateRejected, OfferCancelled\) | -| ↳ `decidedAt` | string | Offer decision timestamp \(ISO 8601\). Typically null at creation; populated after candidate responds. | -| ↳ `latestVersion` | object | latestVersion output from the tool | -| ↳ `id` | string | Latest offer version UUID | - diff --git a/apps/docs/content/docs/en/triggers/attio.mdx b/apps/docs/content/docs/en/triggers/attio.mdx deleted file mode 100644 index 7d7418d36b1..00000000000 --- a/apps/docs/content/docs/en/triggers/attio.mdx +++ /dev/null @@ -1,513 +0,0 @@ ---- -title: Attio -description: Available Attio triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Attio provides 22 triggers for automating workflows based on events. - -## Triggers - -### Attio Comment Created - -Trigger workflow when a new comment is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `threadId` | string | The thread ID | -| `commentId` | string | The comment ID | -| `objectId` | string | The object type ID | -| `recordId` | string | The record ID | -| `listId` | string | The list ID \(if comment is on a list entry\) | -| `entryId` | string | The list entry ID \(if comment is on a list entry\) | - - ---- - -### Attio Comment Deleted - -Trigger workflow when a comment is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `threadId` | string | The thread ID | -| `commentId` | string | The comment ID | -| `objectId` | string | The object type ID | -| `recordId` | string | The record ID | -| `listId` | string | The list ID \(if comment is on a list entry\) | -| `entryId` | string | The list entry ID \(if comment is on a list entry\) | - - ---- - -### Attio Comment Resolved - -Trigger workflow when a comment thread is resolved in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `threadId` | string | The thread ID | -| `commentId` | string | The comment ID | -| `objectId` | string | The object type ID | -| `recordId` | string | The record ID | -| `listId` | string | The list ID \(if comment is on a list entry\) | -| `entryId` | string | The list entry ID \(if comment is on a list entry\) | - - ---- - -### Attio Comment Unresolved - -Trigger workflow when a comment thread is unresolved in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `threadId` | string | The thread ID | -| `commentId` | string | The comment ID | -| `objectId` | string | The object type ID | -| `recordId` | string | The record ID | -| `listId` | string | The list ID \(if comment is on a list entry\) | -| `entryId` | string | The list entry ID \(if comment is on a list entry\) | - - ---- - -### Attio List Created - -Trigger workflow when a list is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | - - ---- - -### Attio List Deleted - -Trigger workflow when a list is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | - - ---- - -### Attio List Entry Created - -Trigger workflow when a new list entry is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | -| `entryId` | string | The list entry ID | - - ---- - -### Attio List Entry Deleted - -Trigger workflow when a list entry is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | -| `entryId` | string | The list entry ID | - - ---- - -### Attio List Entry Updated - -Trigger workflow when a list entry is updated in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | -| `entryId` | string | The list entry ID | -| `attributeId` | string | The ID of the attribute that was updated on the list entry | - - ---- - -### Attio List Updated - -Trigger workflow when a list is updated in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `listId` | string | The list ID | - - ---- - -### Attio Note Created - -Trigger workflow when a new note is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `noteId` | string | The note ID | -| `parentObjectId` | string | The parent object type ID | -| `parentRecordId` | string | The parent record ID | - - ---- - -### Attio Note Deleted - -Trigger workflow when a note is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `noteId` | string | The note ID | -| `parentObjectId` | string | The parent object type ID | -| `parentRecordId` | string | The parent record ID | - - ---- - -### Attio Note Updated - -Trigger workflow when a note is updated in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `noteId` | string | The note ID | -| `parentObjectId` | string | The parent object type ID | -| `parentRecordId` | string | The parent record ID | - - ---- - -### Attio Record Created - -Trigger workflow when a new record is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `objectId` | string | The object type ID \(e.g. people, companies\) | -| `recordId` | string | The record ID | - - ---- - -### Attio Record Deleted - -Trigger workflow when a record is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `objectId` | string | The object type ID \(e.g. people, companies\) | -| `recordId` | string | The record ID | - - ---- - -### Attio Record Merged - -Trigger workflow when two records are merged in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `objectId` | string | The object type ID of the surviving record | -| `recordId` | string | The surviving record ID after merge | -| `duplicateObjectId` | string | The object type ID of the merged-away record | -| `duplicateRecordId` | string | The record ID that was merged away | - - ---- - -### Attio Record Updated - -Trigger workflow when a record is updated in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `objectId` | string | The object type ID \(e.g. people, companies\) | -| `recordId` | string | The record ID | -| `attributeId` | string | The ID of the attribute that was updated on the record | - - ---- - -### Attio Task Created - -Trigger workflow when a new task is created in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `taskId` | string | The task ID | - - ---- - -### Attio Task Deleted - -Trigger workflow when a task is deleted in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `taskId` | string | The task ID | - - ---- - -### Attio Task Updated - -Trigger workflow when a task is updated in Attio - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `taskId` | string | The task ID | - - ---- - -### Attio Webhook (All Events) - -Trigger workflow on any Attio webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `id` | json | The event ID object containing resource identifiers | -| `parentObjectId` | string | The parent object type ID \(if applicable\) | -| `parentRecordId` | string | The parent record ID \(if applicable\) | - - ---- - -### Attio Workspace Member Created - -Trigger workflow when a new member is added to the Attio workspace - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Attio Account | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g. record.created, note.created\) | -| `workspaceId` | string | The workspace ID | -| `workspaceMemberId` | string | The workspace member ID | - diff --git a/apps/docs/content/docs/en/triggers/azure_devops.mdx b/apps/docs/content/docs/en/triggers/azure_devops.mdx deleted file mode 100644 index d9d4b9b0128..00000000000 --- a/apps/docs/content/docs/en/triggers/azure_devops.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Azure Devops -description: Available Azure Devops triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Azure Devops provides 3 triggers for automating workflows based on events. - -## Triggers - -### Azure DevOps Build Failed - -Trigger workflow when an Azure DevOps build fails, is canceled, or partially succeeds - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `buildId` | number | Build ID | -| `buildNumber` | string | Build number string \(e.g. 20240101.1\) | -| `result` | string | Build result: failed \| canceled \| partiallySucceeded | -| `pipelineId` | number | Pipeline definition ID | -| `pipelineName` | string | Pipeline definition name | -| `projectName` | string | Azure DevOps project name | -| `branch` | string | Source branch name \(refs/heads/ prefix stripped\) | -| `commitSha` | string | Source commit SHA | -| `triggeredBy` | string | Display name of the person who triggered the build | -| `triggeredByEmail` | string | Email/unique name of the person who triggered the build, or null if not set | -| `startTime` | string | Build start time \(ISO 8601\) | -| `finishTime` | string | Build finish time \(ISO 8601\) | -| `buildUrl` | string | API URL for the build resource | - - ---- - -### Azure DevOps Webhook (All Service Hook Events) - -Trigger on whichever service hook event types you configure in Azure DevOps. Sim does not filter deliveries for this trigger. - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | Service hook event type \(e.g. build.complete, workitem.created\) | -| `notificationId` | number | Notification ID | -| `subscriptionId` | string | Service hook subscription ID | -| `publisherId` | string | Publisher ID \(e.g. tfs\) | -| `createdDate` | string | Event creation time \(ISO 8601\) | -| `resource` | json | Event resource payload | -| `resourceContainers` | json | Resource container references \(project, collection, etc.\) | -| `message` | json | Short message object | -| `detailedMessage` | json | Detailed message object | - - ---- - -### Azure DevOps Work Item Created - -Trigger workflow when a work item is created in Azure DevOps - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `workItemId` | number | Work item ID | -| `workItemType` | string | Work item type for Basic process \(e.g. Issue, Task, Epic\) | -| `title` | string | Work item title | -| `state` | string | Work item state for Basic process \(e.g. To Do, Doing, Done\) | -| `createdBy` | string | Display name of the creator, or null if not set | -| `assignedTo` | string | Assignee display name, or null if unassigned | -| `priority` | number | Priority \(1–4\), or 0 if not set | -| `areaPath` | string | Area path | -| `iterationPath` | string | Iteration path | -| `description` | string | Work item description \(HTML\), or null if not set | -| `projectName` | string | Azure DevOps project name | -| `workItemUrl` | string | API URL for the work item resource | - diff --git a/apps/docs/content/docs/en/triggers/calcom.mdx b/apps/docs/content/docs/en/triggers/calcom.mdx deleted file mode 100644 index dc347f1d74f..00000000000 --- a/apps/docs/content/docs/en/triggers/calcom.mdx +++ /dev/null @@ -1,293 +0,0 @@ ---- -title: Cal.com -description: Available Cal.com triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Cal.com provides 9 triggers for automating workflows based on events. - -## Triggers - -### CalCom Booking Cancelled - -Trigger workflow when a booking is cancelled in Cal.com - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Booking start time \(ISO 8601\) | -| ↳ `endTime` | string | Booking end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status | -| ↳ `location` | string | Meeting location or URL | -| ↳ `cancellationReason` | string | Reason for cancellation | -| ↳ `responses` | json | Booking form responses | -| ↳ `metadata` | json | Custom metadata attached to the booking | - - ---- - -### CalCom Booking Created - -Trigger workflow when a new booking is created in Cal.com - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Booking start time \(ISO 8601\) | -| ↳ `endTime` | string | Booking end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status | -| ↳ `location` | string | Meeting location or URL | -| ↳ `responses` | json | Booking form responses \(dynamic - fields depend on your event type configuration\) | -| ↳ `metadata` | json | Custom metadata attached to the booking \(dynamic - user-defined key-value pairs\) | -| ↳ `videoCallData` | json | Video call details \(structure varies by provider\) | - - ---- - -### CalCom Booking Paid - -Trigger workflow when payment is completed for a paid booking - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(BOOKING_PAID\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Booking start time \(ISO 8601\) | -| ↳ `endTime` | string | Booking end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status | -| ↳ `location` | string | Meeting location or URL | -| ↳ `payment` | object | Payment details | -| ↳ `id` | string | Payment ID | -| ↳ `amount` | number | Payment amount | -| ↳ `currency` | string | Payment currency | -| ↳ `success` | boolean | Whether payment succeeded | -| ↳ `metadata` | json | Custom metadata attached to the booking | - - ---- - -### CalCom Booking Rejected - -Trigger workflow when a booking request is rejected by the host - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(BOOKING_REJECTED\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Requested start time \(ISO 8601\) | -| ↳ `endTime` | string | Requested end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status \(rejected\) | -| ↳ `rejectionReason` | string | Reason for rejection provided by host | -| ↳ `metadata` | json | Custom metadata attached to the booking | - - ---- - -### CalCom Booking Requested - -Trigger workflow when a booking request is submitted (pending confirmation) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(BOOKING_REQUESTED\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Requested start time \(ISO 8601\) | -| ↳ `endTime` | string | Requested end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status \(pending\) | -| ↳ `location` | string | Meeting location or URL | -| ↳ `responses` | json | Booking form responses | -| ↳ `metadata` | json | Custom metadata attached to the booking | - - ---- - -### CalCom Booking Rescheduled - -Trigger workflow when a booking is rescheduled in Cal.com - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Booking title | -| ↳ `description` | string | Booking description | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | New booking start time \(ISO 8601\) | -| ↳ `endTime` | string | New booking end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `status` | string | Booking status | -| ↳ `location` | string | Meeting location or URL | -| ↳ `rescheduleId` | number | Previous booking ID | -| ↳ `rescheduleUid` | string | Previous booking UID | -| ↳ `rescheduleStartTime` | string | Original start time \(ISO 8601\) | -| ↳ `rescheduleEndTime` | string | Original end time \(ISO 8601\) | -| ↳ `responses` | json | Booking form responses | -| ↳ `metadata` | json | Custom metadata attached to the booking | - - ---- - -### CalCom Meeting Ended - -Trigger workflow when a Cal.com meeting ends - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(MEETING_ENDED\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Meeting title | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Meeting start time \(ISO 8601\) | -| ↳ `endTime` | string | Meeting end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `duration` | number | Actual meeting duration in minutes | -| ↳ `videoCallData` | json | Video call details | - - ---- - -### CalCom Recording Ready - -Trigger workflow when a meeting recording is ready for download - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(RECORDING_READY\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | object | payload output from the tool | -| ↳ `title` | string | Meeting title | -| ↳ `eventTypeId` | number | Event type ID | -| ↳ `startTime` | string | Meeting start time \(ISO 8601\) | -| ↳ `endTime` | string | Meeting end time \(ISO 8601\) | -| ↳ `uid` | string | Unique booking identifier | -| ↳ `bookingId` | number | Numeric booking ID | -| ↳ `recordingUrl` | string | URL to download the recording | -| ↳ `transcription` | string | Meeting transcription text \(if available\) | - - ---- - -### CalCom Webhook (All Events) - -Trigger workflow on any Cal.com webhook event (configure event types in Cal.com) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Used to verify webhook requests via X-Cal-Signature-256 header. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `triggerEvent` | string | The webhook event type \(e.g., BOOKING_CREATED, MEETING_ENDED\) | -| `createdAt` | string | When the webhook event was created \(ISO 8601\) | -| `payload` | json | Complete webhook payload \(structure varies by event type\) | - diff --git a/apps/docs/content/docs/en/triggers/calendly.mdx b/apps/docs/content/docs/en/triggers/calendly.mdx deleted file mode 100644 index 7d29e5c916f..00000000000 --- a/apps/docs/content/docs/en/triggers/calendly.mdx +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: Calendly -description: Available Calendly triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Calendly provides 4 triggers for automating workflows based on events. - -## Triggers - -### Calendly Invitee Canceled - -Trigger workflow when someone cancels a scheduled event on Calendly - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Personal Access Token | -| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | Event type \(invitee.created or invitee.canceled\) | -| `created_at` | string | Webhook event creation timestamp | -| `created_by` | string | URI of the Calendly user who created this webhook | -| `payload` | object | payload output from the tool | -| ↳ `uri` | string | Invitee URI | -| ↳ `email` | string | Invitee email address | -| ↳ `name` | string | Invitee full name | -| ↳ `first_name` | string | Invitee first name | -| ↳ `last_name` | string | Invitee last name | -| ↳ `status` | string | Invitee status \(active or canceled\) | -| ↳ `timezone` | string | Invitee timezone | -| ↳ `event` | string | Scheduled event URI | -| ↳ `text_reminder_number` | string | Phone number for text reminders | -| ↳ `rescheduled` | boolean | Whether this invitee rescheduled | -| ↳ `old_invitee` | string | URI of the old invitee \(if rescheduled\) | -| ↳ `new_invitee` | string | URI of the new invitee \(if rescheduled\) | -| ↳ `cancel_url` | string | URL to cancel the event | -| ↳ `reschedule_url` | string | URL to reschedule the event | -| ↳ `created_at` | string | Invitee creation timestamp | -| ↳ `updated_at` | string | Invitee last update timestamp | -| ↳ `canceled` | boolean | Whether the event was canceled | -| ↳ `cancellation` | object | Cancellation details | -| ↳ `canceled_by` | string | Who canceled the event | -| ↳ `reason` | string | Cancellation reason | -| ↳ `payment` | object | Payment details | -| ↳ `id` | string | Payment ID | -| ↳ `provider` | string | Payment provider | -| ↳ `amount` | number | Payment amount | -| ↳ `currency` | string | Payment currency | -| ↳ `terms` | string | Payment terms | -| ↳ `successful` | boolean | Whether payment was successful | -| ↳ `no_show` | object | No-show details | -| ↳ `created_at` | string | No-show marked timestamp | -| ↳ `reconfirmation` | object | Reconfirmation details | -| ↳ `created_at` | string | Reconfirmation timestamp | -| ↳ `confirmed_at` | string | Confirmation timestamp | - - ---- - -### Calendly Invitee Created - -Trigger workflow when someone schedules a new event on Calendly - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Personal Access Token | -| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | Event type \(invitee.created or invitee.canceled\) | -| `created_at` | string | Webhook event creation timestamp | -| `created_by` | string | URI of the Calendly user who created this webhook | -| `payload` | object | payload output from the tool | -| ↳ `uri` | string | Invitee URI | -| ↳ `email` | string | Invitee email address | -| ↳ `name` | string | Invitee full name | -| ↳ `first_name` | string | Invitee first name | -| ↳ `last_name` | string | Invitee last name | -| ↳ `status` | string | Invitee status \(active or canceled\) | -| ↳ `timezone` | string | Invitee timezone | -| ↳ `event` | string | Scheduled event URI | -| ↳ `text_reminder_number` | string | Phone number for text reminders | -| ↳ `rescheduled` | boolean | Whether this invitee rescheduled | -| ↳ `old_invitee` | string | URI of the old invitee \(if rescheduled\) | -| ↳ `new_invitee` | string | URI of the new invitee \(if rescheduled\) | -| ↳ `cancel_url` | string | URL to cancel the event | -| ↳ `reschedule_url` | string | URL to reschedule the event | -| ↳ `created_at` | string | Invitee creation timestamp | -| ↳ `updated_at` | string | Invitee last update timestamp | -| ↳ `canceled` | boolean | Whether the event was canceled | -| ↳ `cancellation` | object | Cancellation details | -| ↳ `canceled_by` | string | Who canceled the event | -| ↳ `reason` | string | Cancellation reason | -| ↳ `payment` | object | Payment details | -| ↳ `id` | string | Payment ID | -| ↳ `provider` | string | Payment provider | -| ↳ `amount` | number | Payment amount | -| ↳ `currency` | string | Payment currency | -| ↳ `terms` | string | Payment terms | -| ↳ `successful` | boolean | Whether payment was successful | -| ↳ `no_show` | object | No-show details | -| ↳ `created_at` | string | No-show marked timestamp | -| ↳ `reconfirmation` | object | Reconfirmation details | -| ↳ `created_at` | string | Reconfirmation timestamp | -| ↳ `confirmed_at` | string | Confirmation timestamp | - - ---- - -### Calendly Routing Form Submitted - -Trigger workflow when someone submits a Calendly routing form - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Personal Access Token | -| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | Event type \(routing_form_submission.created\) | -| `created_at` | string | Webhook event creation timestamp | -| `created_by` | string | URI of the Calendly user who created this webhook | -| `payload` | object | payload output from the tool | -| ↳ `uri` | string | Routing form submission URI | -| ↳ `routing_form` | string | Routing form URI | -| ↳ `submitter` | object | Submitter details | -| ↳ `uri` | string | Submitter URI | -| ↳ `email` | string | Submitter email address | -| ↳ `name` | string | Submitter full name | -| ↳ `submitter_type` | string | Type of submitter | -| ↳ `result` | object | Routing result details | -| ↳ `type` | string | Result type \(event_type, custom_message, or external_url\) | -| ↳ `value` | string | Result value \(event type URI, message, or URL\) | -| ↳ `created_at` | string | Submission creation timestamp | -| ↳ `updated_at` | string | Submission last update timestamp | - - ---- - -### Calendly Webhook - -Trigger workflow from any Calendly webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Personal Access Token | -| `organization` | string | Yes | Organization URI for the webhook subscription. Get this from | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | Event type \(invitee.created, invitee.canceled, or routing_form_submission.created\) | -| `created_at` | string | Webhook event creation timestamp | -| `created_by` | string | URI of the Calendly user who created this webhook | -| `payload` | object | Complete event payload \(structure varies by event type\) | - diff --git a/apps/docs/content/docs/en/triggers/confluence.mdx b/apps/docs/content/docs/en/triggers/confluence.mdx deleted file mode 100644 index e624e05af08..00000000000 --- a/apps/docs/content/docs/en/triggers/confluence.mdx +++ /dev/null @@ -1,692 +0,0 @@ ---- -title: Confluence -description: Available Confluence triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Confluence provides 23 triggers for automating workflows based on events. - -## Triggers - -### Confluence Attachment Created - -Trigger workflow when an attachment is uploaded in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | -| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | -| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | -| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `attachment` | object | attachment output from the tool | -| ↳ `mediaType` | string | MIME type of the attachment | -| ↳ `fileSize` | number | File size in bytes | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Container page/blog ID | -| ↳ `title` | string | Container page/blog title | -| ↳ `contentType` | string | Container content type | -| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | - - ---- - -### Confluence Attachment Removed - -Trigger workflow when an attachment is removed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | -| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | -| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | -| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `attachment` | object | attachment output from the tool | -| ↳ `mediaType` | string | MIME type of the attachment | -| ↳ `fileSize` | number | File size in bytes | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Container page/blog ID | -| ↳ `title` | string | Container page/blog title | -| ↳ `contentType` | string | Container content type | -| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | - - ---- - -### Confluence Attachment Updated - -Trigger workflow when an attachment is updated in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | -| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | -| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | -| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `attachment` | object | attachment output from the tool | -| ↳ `mediaType` | string | MIME type of the attachment | -| ↳ `fileSize` | number | File size in bytes | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Container page/blog ID | -| ↳ `title` | string | Container page/blog title | -| ↳ `contentType` | string | Container content type | -| `files` | file[] | Attachment file content downloaded from Confluence \(if includeFileContent is enabled with credentials\) | - - ---- - -### Confluence Blog Post Created - -Trigger workflow when a blog post is created in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Blog Post Removed - -Trigger workflow when a blog post is removed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Blog Post Restored - -Trigger workflow when a blog post is restored from trash in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Blog Post Updated - -Trigger workflow when a blog post is updated in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Comment Created - -Trigger workflow when a comment is created in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `comment` | object | comment output from the tool | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Parent page/blog ID | -| ↳ `title` | string | Parent page/blog title | -| ↳ `contentType` | string | Parent content type \(page or blogpost\) | -| ↳ `spaceKey` | string | Space key of the parent | -| ↳ `self` | string | URL link to the parent content | - - ---- - -### Confluence Comment Removed - -Trigger workflow when a comment is removed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `comment` | object | comment output from the tool | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Parent page/blog ID | -| ↳ `title` | string | Parent page/blog title | -| ↳ `contentType` | string | Parent content type \(page or blogpost\) | -| ↳ `spaceKey` | string | Space key of the parent | -| ↳ `self` | string | URL link to the parent content | - - ---- - -### Confluence Comment Updated - -Trigger workflow when a comment is updated in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `comment` | object | comment output from the tool | -| ↳ `parent` | object | parent output from the tool | -| ↳ `id` | number | Parent page/blog ID | -| ↳ `title` | string | Parent page/blog title | -| ↳ `contentType` | string | Parent content type \(page or blogpost\) | -| ↳ `spaceKey` | string | Space key of the parent | -| ↳ `self` | string | URL link to the parent content | - - ---- - -### Confluence Label Added - -Trigger workflow when a label is added to content in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `label` | object | label output from the tool | -| ↳ `name` | string | Label name | -| ↳ `id` | string | Label ID | -| ↳ `prefix` | string | Label prefix \(global, my, team\) | -| `content` | object | content output from the tool | -| ↳ `id` | number | Content ID the label was added to or removed from | -| ↳ `title` | string | Content title | -| ↳ `contentType` | string | Content type \(page, blogpost\) | - - ---- - -### Confluence Label Removed - -Trigger workflow when a label is removed from content in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `label` | object | label output from the tool | -| ↳ `name` | string | Label name | -| ↳ `id` | string | Label ID | -| ↳ `prefix` | string | Label prefix \(global, my, team\) | -| `content` | object | content output from the tool | -| ↳ `id` | number | Content ID the label was added to or removed from | -| ↳ `title` | string | Content title | -| ↳ `contentType` | string | Content type \(page, blogpost\) | - - ---- - -### Confluence Page Created - -Trigger workflow when a new page is created in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Page Moved - -Trigger workflow when a page is moved in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Page Permissions Updated - -Trigger workflow when page permissions are changed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `id` | number | Content ID | -| `title` | string | Content title | -| `contentType` | string | Content type \(page, blogpost, comment, attachment\) | -| `version` | number | Version number | -| `spaceKey` | string | Space key the content belongs to | -| `creatorAccountId` | string | Account ID of the creator | -| `lastModifierAccountId` | string | Account ID of the last modifier | -| `self` | string | URL link to the content | -| `creationDate` | number | Creation timestamp \(Unix epoch milliseconds\) | -| `modificationDate` | number | Last modification timestamp \(Unix epoch milliseconds\) | -| `page` | object | page output from the tool | -| ↳ `permissions` | json | Updated permissions object for the page | - - ---- - -### Confluence Page Removed - -Trigger workflow when a page is removed or trashed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Page Restored - -Trigger workflow when a page is restored from trash in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Page Updated - -Trigger workflow when a page is updated in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | - - ---- - -### Confluence Space Created - -Trigger workflow when a new space is created in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `space` | object | space output from the tool | -| ↳ `key` | string | Space key | -| ↳ `name` | string | Space name | -| ↳ `self` | string | URL link to the space | - - ---- - -### Confluence Space Removed - -Trigger workflow when a space is removed in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `space` | object | space output from the tool | -| ↳ `key` | string | Space key | -| ↳ `name` | string | Space name | -| ↳ `self` | string | URL link to the space | - - ---- - -### Confluence Space Updated - -Trigger workflow when a space is updated in Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `space` | object | space output from the tool | -| ↳ `key` | string | Space key | -| ↳ `name` | string | Space name | -| ↳ `self` | string | URL link to the space | - - ---- - -### Confluence User Created - -Trigger workflow when a new user is added to Confluence - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `user` | object | user output from the tool | -| ↳ `accountId` | string | Account ID of the new user | -| ↳ `accountType` | string | Account type \(e.g., atlassian, app\) | -| ↳ `displayName` | string | Display name of the user | -| ↳ `emailAddress` | string | Email address of the user \(may not be available due to GDPR/privacy settings\) | -| ↳ `publicName` | string | Public name of the user | -| ↳ `self` | string | URL link to the user profile | - - ---- - -### Confluence Webhook (All Events) - -Trigger workflow on any Confluence webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Confluence using HMAC signature | -| `confluenceDomain` | string | No | Your Confluence Cloud domain | -| `confluenceEmail` | string | No | Your Atlassian account email. Required together with API token to download attachment files. | -| `confluenceApiToken` | string | No | API token from https://id.atlassian.com/manage-profile/security/api-tokens. Required to download attachment file content. | -| `includeFileContent` | boolean | No | Download and include actual file content from attachments. Requires email, API token, and domain. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `timestamp` | number | Timestamp of the webhook event \(Unix epoch milliseconds\) | -| `userAccountId` | string | Account ID of the user who triggered the event | -| `accountType` | string | Account type \(e.g., customer\) | -| `page` | json | Page object \(present in page events\) | -| `comment` | json | Comment object \(present in comment events\) | -| `blog` | json | Blog post object \(present in blog events\) | -| `attachment` | json | Attachment object \(present in attachment events\) | -| `space` | json | Space object \(present in space events\) | -| `label` | json | Label object \(present in label events\) | -| `content` | json | Content object \(present in label events\) | -| `user` | json | User object \(present in user events\) | -| `files` | file[] | Attachment file content \(present in attachment events when includeFileContent is enabled\) | - diff --git a/apps/docs/content/docs/en/triggers/fathom.mdx b/apps/docs/content/docs/en/triggers/fathom.mdx deleted file mode 100644 index 9c4a173aca2..00000000000 --- a/apps/docs/content/docs/en/triggers/fathom.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: Fathom -description: Available Fathom triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Fathom provides 2 triggers for automating workflows based on events. - -## Triggers - -### Fathom New Meeting Content - -Trigger workflow when new meeting content is ready in Fathom - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Fathom. | -| `triggeredFor` | string | No | Which recording types should trigger this webhook. | -| `includeSummary` | boolean | No | Include the meeting summary in the webhook payload. | -| `includeTranscript` | boolean | No | Include the full transcript in the webhook payload. | -| `includeActionItems` | boolean | No | Include action items extracted from the meeting. | -| `includeCrmMatches` | boolean | No | Include matched CRM contacts, companies, and deals from your linked CRM. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `title` | string | Meeting title | -| `meeting_title` | string | Calendar event title | -| `recording_id` | number | Unique recording ID | -| `url` | string | URL to view the meeting in Fathom | -| `share_url` | string | Shareable URL for the meeting | -| `created_at` | string | ISO 8601 creation timestamp | -| `scheduled_start_time` | string | Scheduled start time | -| `scheduled_end_time` | string | Scheduled end time | -| `recording_start_time` | string | Recording start time | -| `recording_end_time` | string | Recording end time | -| `transcript_language` | string | Language of the transcript | -| `calendar_invitees_domains_type` | string | Domain type: only_internal or one_or_more_external | -| `recorded_by` | object | Recorder details | -| `calendar_invitees` | array | Array of calendar invitees with name and email | -| `default_summary` | object | Meeting summary | -| `transcript` | array | Array of transcript entries with speaker, text, and timestamp | -| `action_items` | array | Array of action items extracted from the meeting | -| `crm_matches` | json | Matched CRM contacts, companies, and deals from linked CRM | - - ---- - -### Fathom Webhook - -Generic webhook trigger for all Fathom events - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Fathom. | -| `triggeredFor` | string | No | Which recording types should trigger this webhook. | -| `includeSummary` | boolean | No | Include the meeting summary in the webhook payload. | -| `includeTranscript` | boolean | No | Include the full transcript in the webhook payload. | -| `includeActionItems` | boolean | No | Include action items extracted from the meeting. | -| `includeCrmMatches` | boolean | No | Include matched CRM contacts, companies, and deals from your linked CRM. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `title` | string | Meeting title | -| `meeting_title` | string | Calendar event title | -| `recording_id` | number | Unique recording ID | -| `url` | string | URL to view the meeting in Fathom | -| `share_url` | string | Shareable URL for the meeting | -| `created_at` | string | ISO 8601 creation timestamp | -| `scheduled_start_time` | string | Scheduled start time | -| `scheduled_end_time` | string | Scheduled end time | -| `recording_start_time` | string | Recording start time | -| `recording_end_time` | string | Recording end time | -| `transcript_language` | string | Language of the transcript | -| `calendar_invitees_domains_type` | string | Domain type: only_internal or one_or_more_external | -| `recorded_by` | object | Recorder details | -| `calendar_invitees` | array | Array of calendar invitees with name and email | -| `default_summary` | object | Meeting summary | -| `transcript` | array | Array of transcript entries with speaker, text, and timestamp | -| `action_items` | array | Array of action items extracted from the meeting | -| `crm_matches` | json | Matched CRM contacts, companies, and deals from linked CRM | - diff --git a/apps/docs/content/docs/en/triggers/fireflies.mdx b/apps/docs/content/docs/en/triggers/fireflies.mdx deleted file mode 100644 index 9a265f451b0..00000000000 --- a/apps/docs/content/docs/en/triggers/fireflies.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Fireflies -description: Available Fireflies triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Fireflies provides 1 trigger for automating workflows based on events. - -## Triggers - -### Fireflies Transcription Complete - -Trigger workflow when a Fireflies meeting transcription is complete - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Secret key for HMAC signature verification \(set in Fireflies dashboard\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `meetingId` | string | The ID of the transcribed meeting | -| `eventType` | string | The type of event \(e.g. Transcription completed, meeting.transcribed\) | -| `clientReferenceId` | string | Custom reference ID if set during upload | -| `timestamp` | number | Unix timestamp in milliseconds when the event was fired \(V2 webhooks\) | - diff --git a/apps/docs/content/docs/en/triggers/github.mdx b/apps/docs/content/docs/en/triggers/github.mdx deleted file mode 100644 index 26d4f8ace44..00000000000 --- a/apps/docs/content/docs/en/triggers/github.mdx +++ /dev/null @@ -1,1186 +0,0 @@ ---- -title: GitHub -description: Available GitHub triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -GitHub provides 12 triggers for automating workflows based on events. - -## Triggers - -### GitHub Actions Workflow Run - -Trigger workflow when a GitHub Actions workflow run is requested, in progress, or completed - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., workflow_run\) | -| `action` | string | Action performed \(requested, in_progress, completed\) | -| `workflow_run` | object | workflow_run output from the tool | -| ↳ `id` | number | Workflow run ID | -| ↳ `node_id` | string | Workflow run node ID | -| ↳ `name` | string | Workflow name | -| ↳ `workflow_id` | number | Workflow ID | -| ↳ `run_number` | number | Run number for this workflow | -| ↳ `run_attempt` | number | Attempt number for this run | -| ↳ `event` | string | Event that triggered the workflow \(push, pull_request, etc.\) | -| ↳ `status` | string | Current status \(queued, in_progress, completed\) | -| ↳ `conclusion` | string | Conclusion \(success, failure, cancelled, skipped, timed_out, action_required\) | -| ↳ `head_branch` | string | Branch name | -| ↳ `head_sha` | string | Commit SHA that triggered the workflow | -| ↳ `path` | string | Path to the workflow file | -| ↳ `display_title` | string | Display title for the run | -| ↳ `run_started_at` | string | Timestamp when the run started | -| ↳ `created_at` | string | Workflow run creation timestamp | -| ↳ `updated_at` | string | Workflow run last update timestamp | -| ↳ `html_url` | string | Workflow run HTML URL | -| ↳ `check_suite_id` | number | Associated check suite ID | -| ↳ `check_suite_node_id` | string | Associated check suite node ID | -| ↳ `url` | string | Workflow run API URL | -| ↳ `actor` | object | actor output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `triggering_actor` | object | triggering_actor output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name | -| ↳ `private` | boolean | Whether repository is private | -| ↳ `head_repository` | object | head_repository output from the tool | -| ↳ `id` | number | Head repository ID | -| ↳ `node_id` | string | Head repository node ID | -| ↳ `name` | string | Head repository name | -| ↳ `full_name` | string | Head repository full name | -| ↳ `private` | boolean | Whether repository is private | -| ↳ `head_commit` | object | head_commit output from the tool | -| ↳ `id` | string | Commit SHA | -| ↳ `tree_id` | string | Tree ID | -| ↳ `message` | string | Commit message | -| ↳ `timestamp` | string | Commit timestamp | -| ↳ `author` | object | author output from the tool | -| ↳ `name` | string | Author name | -| ↳ `email` | string | Author email | -| ↳ `committer` | object | committer output from the tool | -| ↳ `name` | string | Committer name | -| ↳ `email` | string | Committer email | -| ↳ `pull_requests` | array | Array of associated pull requests | -| ↳ `referenced_workflows` | array | Array of referenced workflow runs | -| `workflow` | object | workflow output from the tool | -| ↳ `id` | number | Workflow ID | -| ↳ `node_id` | string | Workflow node ID | -| ↳ `name` | string | Workflow name | -| ↳ `path` | string | Path to workflow file | -| ↳ `state` | string | Workflow state \(active, deleted, disabled_fork, etc.\) | -| ↳ `created_at` | string | Workflow creation timestamp | -| ↳ `updated_at` | string | Workflow last update timestamp | -| ↳ `url` | string | Workflow API URL | -| ↳ `html_url` | string | Workflow HTML URL | -| ↳ `badge_url` | string | Workflow badge URL | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub Issue Closed - -Trigger workflow when an issue is closed in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issues, pull_request, push\) | -| `action` | string | Action performed \(opened, closed, reopened, edited, etc.\) | -| `issue` | object | issue output from the tool | -| ↳ `id` | number | Issue ID | -| ↳ `node_id` | string | Issue node ID | -| ↳ `number` | number | Issue number | -| ↳ `title` | string | Issue title | -| ↳ `body` | string | Issue body/description | -| ↳ `state` | string | Issue state \(open, closed\) | -| ↳ `state_reason` | string | Reason for state \(completed, not_planned, reopened\) | -| ↳ `html_url` | string | Issue HTML URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `milestone` | object | Milestone object if assigned | -| ↳ `created_at` | string | Issue creation timestamp | -| ↳ `updated_at` | string | Issue last update timestamp | -| ↳ `closed_at` | string | Issue closed timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub Issue Comment - -Trigger workflow when a comment is added to an issue (not pull requests) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issue_comment\) | -| `action` | string | Action performed \(created, edited, deleted\) | -| `issue` | object | issue output from the tool | -| ↳ `number` | number | Issue number | -| ↳ `title` | string | Issue title | -| ↳ `state` | string | Issue state \(open, closed\) | -| ↳ `html_url` | string | Issue HTML URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| `comment` | object | comment output from the tool | -| ↳ `id` | number | Comment ID | -| ↳ `node_id` | string | Comment node ID | -| ↳ `body` | string | Comment text | -| ↳ `html_url` | string | Comment HTML URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `created_at` | string | Comment creation timestamp | -| ↳ `updated_at` | string | Comment last update timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub Issue Opened - -Trigger workflow when a new issue is opened in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issues, pull_request, push\) | -| `action` | string | Action performed \(opened, closed, reopened, edited, etc.\) | -| `issue` | object | issue output from the tool | -| ↳ `id` | number | Issue ID | -| ↳ `node_id` | string | Issue node ID | -| ↳ `number` | number | Issue number | -| ↳ `title` | string | Issue title | -| ↳ `body` | string | Issue body/description | -| ↳ `state` | string | Issue state \(open, closed\) | -| ↳ `state_reason` | string | Reason for state \(completed, not_planned, reopened\) | -| ↳ `html_url` | string | Issue HTML URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `milestone` | object | Milestone object if assigned | -| ↳ `created_at` | string | Issue creation timestamp | -| ↳ `updated_at` | string | Issue last update timestamp | -| ↳ `closed_at` | string | Issue closed timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub PR Closed - -Trigger workflow when a pull request is closed without being merged (e.g., abandoned) in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | -| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | -| `number` | number | Pull request number | -| `pull_request` | object | pull_request output from the tool | -| ↳ `id` | number | Pull request ID | -| ↳ `node_id` | string | Pull request node ID | -| ↳ `number` | number | Pull request number | -| ↳ `title` | string | Pull request title | -| ↳ `body` | string | Pull request description | -| ↳ `state` | string | Pull request state \(open, closed\) | -| ↳ `merged` | boolean | Whether the PR was merged | -| ↳ `merged_at` | string | Timestamp when PR was merged | -| ↳ `merged_by` | object | merged_by output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `draft` | boolean | Whether the PR is a draft | -| ↳ `html_url` | string | Pull request HTML URL | -| ↳ `diff_url` | string | Pull request diff URL | -| ↳ `patch_url` | string | Pull request patch URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `head` | object | head output from the tool | -| ↳ `ref` | string | Source branch name | -| ↳ `sha` | string | Source branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Source repository name | -| ↳ `full_name` | string | Source repository full name | -| ↳ `base` | object | base output from the tool | -| ↳ `ref` | string | Target branch name | -| ↳ `sha` | string | Target branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Target repository name | -| ↳ `full_name` | string | Target repository full name | -| ↳ `additions` | number | Number of lines added | -| ↳ `deletions` | number | Number of lines deleted | -| ↳ `changed_files` | number | Number of files changed | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `requested_reviewers` | array | Array of requested reviewers | -| ↳ `created_at` | string | Pull request creation timestamp | -| ↳ `updated_at` | string | Pull request last update timestamp | -| ↳ `closed_at` | string | Pull request closed timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub PR Comment - -Trigger workflow when a comment is added to a pull request in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., issue_comment\) | -| `action` | string | Action performed \(created, edited, deleted\) | -| `issue` | object | issue output from the tool | -| ↳ `id` | number | Issue ID | -| ↳ `node_id` | string | Issue node ID | -| ↳ `number` | number | Issue/PR number | -| ↳ `title` | string | Issue/PR title | -| ↳ `body` | string | Issue/PR description | -| ↳ `state` | string | Issue/PR state \(open, closed\) | -| ↳ `html_url` | string | Issue/PR HTML URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `pull_request` | object | pull_request output from the tool | -| ↳ `url` | string | Pull request API URL \(present only for PR comments\) | -| ↳ `html_url` | string | Pull request HTML URL | -| ↳ `diff_url` | string | Pull request diff URL | -| ↳ `patch_url` | string | Pull request patch URL | -| ↳ `created_at` | string | Issue/PR creation timestamp | -| ↳ `updated_at` | string | Issue/PR last update timestamp | -| `comment` | object | comment output from the tool | -| ↳ `id` | number | Comment ID | -| ↳ `node_id` | string | Comment node ID | -| ↳ `url` | string | Comment API URL | -| ↳ `html_url` | string | Comment HTML URL | -| ↳ `body` | string | Comment text | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `created_at` | string | Comment creation timestamp | -| ↳ `updated_at` | string | Comment last update timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub PR Merged - -Trigger workflow when a pull request is successfully merged in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | -| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | -| `number` | number | Pull request number | -| `pull_request` | object | pull_request output from the tool | -| ↳ `id` | number | Pull request ID | -| ↳ `node_id` | string | Pull request node ID | -| ↳ `number` | number | Pull request number | -| ↳ `title` | string | Pull request title | -| ↳ `body` | string | Pull request description | -| ↳ `state` | string | Pull request state \(open, closed\) | -| ↳ `merged` | boolean | Whether the PR was merged | -| ↳ `merged_at` | string | Timestamp when PR was merged | -| ↳ `merged_by` | object | merged_by output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `draft` | boolean | Whether the PR is a draft | -| ↳ `html_url` | string | Pull request HTML URL | -| ↳ `diff_url` | string | Pull request diff URL | -| ↳ `patch_url` | string | Pull request patch URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `head` | object | head output from the tool | -| ↳ `ref` | string | Source branch name | -| ↳ `sha` | string | Source branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Source repository name | -| ↳ `full_name` | string | Source repository full name | -| ↳ `base` | object | base output from the tool | -| ↳ `ref` | string | Target branch name | -| ↳ `sha` | string | Target branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Target repository name | -| ↳ `full_name` | string | Target repository full name | -| ↳ `additions` | number | Number of lines added | -| ↳ `deletions` | number | Number of lines deleted | -| ↳ `changed_files` | number | Number of files changed | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `requested_reviewers` | array | Array of requested reviewers | -| ↳ `created_at` | string | Pull request creation timestamp | -| ↳ `updated_at` | string | Pull request last update timestamp | -| ↳ `closed_at` | string | Pull request closed timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub PR Opened - -Trigger workflow when a new pull request is opened in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request\) | -| `action` | string | Action performed \(opened, closed, synchronize, reopened, edited, etc.\) | -| `number` | number | Pull request number | -| `pull_request` | object | pull_request output from the tool | -| ↳ `id` | number | Pull request ID | -| ↳ `node_id` | string | Pull request node ID | -| ↳ `number` | number | Pull request number | -| ↳ `title` | string | Pull request title | -| ↳ `body` | string | Pull request description | -| ↳ `state` | string | Pull request state \(open, closed\) | -| ↳ `merged` | boolean | Whether the PR was merged | -| ↳ `merged_at` | string | Timestamp when PR was merged | -| ↳ `merged_by` | object | merged_by output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `draft` | boolean | Whether the PR is a draft | -| ↳ `html_url` | string | Pull request HTML URL | -| ↳ `diff_url` | string | Pull request diff URL | -| ↳ `patch_url` | string | Pull request patch URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `head` | object | head output from the tool | -| ↳ `ref` | string | Source branch name | -| ↳ `sha` | string | Source branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Source repository name | -| ↳ `full_name` | string | Source repository full name | -| ↳ `base` | object | base output from the tool | -| ↳ `ref` | string | Target branch name | -| ↳ `sha` | string | Target branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Target repository name | -| ↳ `full_name` | string | Target repository full name | -| ↳ `additions` | number | Number of lines added | -| ↳ `deletions` | number | Number of lines deleted | -| ↳ `changed_files` | number | Number of files changed | -| ↳ `labels` | array | Array of label objects | -| ↳ `assignees` | array | Array of assigned users | -| ↳ `requested_reviewers` | array | Array of requested reviewers | -| ↳ `created_at` | string | Pull request creation timestamp | -| ↳ `updated_at` | string | Pull request last update timestamp | -| ↳ `closed_at` | string | Pull request closed timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub PR Reviewed - -Trigger workflow when a pull request review is submitted, edited, or dismissed in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., pull_request_review\) | -| `action` | string | Action performed \(submitted, edited, dismissed\) | -| `review` | object | review output from the tool | -| ↳ `id` | number | Review ID | -| ↳ `node_id` | string | Review node ID | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | Reviewer username | -| ↳ `id` | number | Reviewer user ID | -| ↳ `node_id` | string | Reviewer node ID | -| ↳ `avatar_url` | string | Reviewer avatar URL | -| ↳ `html_url` | string | Reviewer profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `body` | string | Review comment text | -| ↳ `state` | string | Review state \(approved, changes_requested, commented, dismissed\) | -| ↳ `html_url` | string | Review HTML URL | -| ↳ `submitted_at` | string | Review submission timestamp | -| ↳ `commit_id` | string | Commit SHA that was reviewed | -| ↳ `author_association` | string | Author association \(OWNER, MEMBER, COLLABORATOR, CONTRIBUTOR, etc.\) | -| `pull_request` | object | pull_request output from the tool | -| ↳ `id` | number | Pull request ID | -| ↳ `node_id` | string | Pull request node ID | -| ↳ `number` | number | Pull request number | -| ↳ `title` | string | Pull request title | -| ↳ `body` | string | Pull request description | -| ↳ `state` | string | Pull request state \(open, closed\) | -| ↳ `merged` | boolean | Whether the PR was merged | -| ↳ `draft` | boolean | Whether the PR is a draft | -| ↳ `html_url` | string | Pull request HTML URL | -| ↳ `diff_url` | string | Pull request diff URL | -| ↳ `patch_url` | string | Pull request patch URL | -| ↳ `user` | object | user output from the tool | -| ↳ `login` | string | PR author username | -| ↳ `id` | number | PR author user ID | -| ↳ `node_id` | string | PR author node ID | -| ↳ `avatar_url` | string | PR author avatar URL | -| ↳ `html_url` | string | PR author profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `head` | object | head output from the tool | -| ↳ `ref` | string | Source branch name | -| ↳ `sha` | string | Source branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Source repository name | -| ↳ `full_name` | string | Source repository full name | -| ↳ `base` | object | base output from the tool | -| ↳ `ref` | string | Target branch name | -| ↳ `sha` | string | Target branch commit SHA | -| ↳ `repo` | object | repo output from the tool | -| ↳ `name` | string | Target repository name | -| ↳ `full_name` | string | Target repository full name | -| ↳ `created_at` | string | Pull request creation timestamp | -| ↳ `updated_at` | string | Pull request last update timestamp | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub Push - -Trigger workflow when code is pushed to a repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., push\) | -| `branch` | string | Branch name derived from ref \(e.g., main from refs/heads/main\) | -| `ref` | string | Git reference that was pushed \(e.g., refs/heads/main\) | -| `before` | string | SHA of the commit before the push | -| `after` | string | SHA of the commit after the push | -| `created` | boolean | Whether this push created a new branch or tag | -| `deleted` | boolean | Whether this push deleted a branch or tag | -| `forced` | boolean | Whether this was a force push | -| `base_ref` | string | Base reference for the push | -| `compare` | string | URL to compare the changes | -| `commits` | array | Array of commit objects included in this push | -| `head_commit` | object | head_commit output from the tool | -| ↳ `id` | string | Commit SHA of the most recent commit | -| ↳ `tree_id` | string | Git tree SHA | -| ↳ `distinct` | boolean | Whether this commit is distinct | -| ↳ `message` | string | Commit message | -| ↳ `timestamp` | string | Commit timestamp | -| ↳ `url` | string | Commit URL | -| ↳ `author` | object | author output from the tool | -| ↳ `name` | string | Author name | -| ↳ `email` | string | Author email | -| ↳ `username` | string | Author GitHub username | -| ↳ `committer` | object | committer output from the tool | -| ↳ `name` | string | Committer name | -| ↳ `email` | string | Committer email | -| ↳ `username` | string | Committer GitHub username | -| ↳ `added` | array | Array of file paths added in this commit | -| ↳ `removed` | array | Array of file paths removed in this commit | -| ↳ `modified` | array | Array of file paths modified in this commit | -| `pusher` | object | pusher output from the tool | -| ↳ `name` | string | Pusher name | -| ↳ `email` | string | Pusher email | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `default_branch` | string | Default branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | - - ---- - -### GitHub Release Published - -Trigger workflow when a new release is published in a GitHub repository - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_type` | string | GitHub event type from X-GitHub-Event header \(e.g., release\) | -| `action` | string | Action performed \(published, unpublished, created, edited, deleted, prereleased, released\) | -| `release` | object | release output from the tool | -| ↳ `id` | number | Release ID | -| ↳ `node_id` | string | Release node ID | -| ↳ `tag_name` | string | Git tag name for the release | -| ↳ `target_commitish` | string | Target branch or commit SHA | -| ↳ `name` | string | Release name/title | -| ↳ `body` | string | Release description/notes in markdown format | -| ↳ `draft` | boolean | Whether the release is a draft | -| ↳ `prerelease` | boolean | Whether the release is a pre-release | -| ↳ `created_at` | string | Release creation timestamp | -| ↳ `published_at` | string | Release publication timestamp | -| ↳ `url` | string | Release API URL | -| ↳ `html_url` | string | Release HTML URL | -| ↳ `assets_url` | string | Release assets API URL | -| ↳ `upload_url` | string | URL for uploading release assets | -| ↳ `tarball_url` | string | Source code tarball download URL | -| ↳ `zipball_url` | string | Source code zipball download URL | -| ↳ `discussion_url` | string | Discussion URL if available | -| ↳ `author` | object | author output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `gravatar_id` | string | Gravatar ID | -| ↳ `url` | string | User API URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `followers_url` | string | Followers API URL | -| ↳ `following_url` | string | Following API URL | -| ↳ `gists_url` | string | Gists API URL | -| ↳ `starred_url` | string | Starred repositories API URL | -| ↳ `subscriptions_url` | string | Subscriptions API URL | -| ↳ `organizations_url` | string | Organizations API URL | -| ↳ `repos_url` | string | Repositories API URL | -| ↳ `events_url` | string | Events API URL | -| ↳ `received_events_url` | string | Received events API URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `site_admin` | boolean | Whether user is a site administrator | -| ↳ `assets` | array | Array of release asset objects with download URLs | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `repo_description` | string | Repository description | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `archive_url` | string | Archive API URL | -| ↳ `assignees_url` | string | Assignees API URL | -| ↳ `blobs_url` | string | Blobs API URL | -| ↳ `branches_url` | string | Branches API URL | -| ↳ `collaborators_url` | string | Collaborators API URL | -| ↳ `comments_url` | string | Comments API URL | -| ↳ `commits_url` | string | Commits API URL | -| ↳ `compare_url` | string | Compare API URL | -| ↳ `contents_url` | string | Contents API URL | -| ↳ `contributors_url` | string | Contributors API URL | -| ↳ `deployments_url` | string | Deployments API URL | -| ↳ `downloads_url` | string | Downloads API URL | -| ↳ `events_url` | string | Events API URL | -| ↳ `forks_url` | string | Forks API URL | -| ↳ `git_commits_url` | string | Git commits API URL | -| ↳ `git_refs_url` | string | Git refs API URL | -| ↳ `git_tags_url` | string | Git tags API URL | -| ↳ `hooks_url` | string | Hooks API URL | -| ↳ `issue_comment_url` | string | Issue comment API URL | -| ↳ `issue_events_url` | string | Issue events API URL | -| ↳ `issues_url` | string | Issues API URL | -| ↳ `keys_url` | string | Keys API URL | -| ↳ `labels_url` | string | Labels API URL | -| ↳ `languages_url` | string | Languages API URL | -| ↳ `merges_url` | string | Merges API URL | -| ↳ `milestones_url` | string | Milestones API URL | -| ↳ `notifications_url` | string | Notifications API URL | -| ↳ `pulls_url` | string | Pull requests API URL | -| ↳ `releases_url` | string | Releases API URL | -| ↳ `stargazers_url` | string | Stargazers API URL | -| ↳ `statuses_url` | string | Statuses API URL | -| ↳ `subscribers_url` | string | Subscribers API URL | -| ↳ `subscription_url` | string | Subscription API URL | -| ↳ `tags_url` | string | Tags API URL | -| ↳ `teams_url` | string | Teams API URL | -| ↳ `trees_url` | string | Trees API URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size in KB | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `has_issues` | boolean | Whether issues are enabled | -| ↳ `has_projects` | boolean | Whether projects are enabled | -| ↳ `has_downloads` | boolean | Whether downloads are enabled | -| ↳ `has_wiki` | boolean | Whether wiki is enabled | -| ↳ `has_pages` | boolean | Whether GitHub Pages is enabled | -| ↳ `forks_count` | number | Number of forks | -| ↳ `mirror_url` | string | Mirror URL if repository is a mirror | -| ↳ `archived` | boolean | Whether the repository is archived | -| ↳ `disabled` | boolean | Whether the repository is disabled | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `license` | object | license output from the tool | -| ↳ `key` | string | License key | -| ↳ `name` | string | License name | -| ↳ `spdx_id` | string | SPDX license identifier | -| ↳ `url` | string | License API URL | -| ↳ `node_id` | string | License node ID | -| ↳ `allow_forking` | boolean | Whether forking is allowed | -| ↳ `is_template` | boolean | Whether repository is a template | -| ↳ `topics` | array | Array of repository topics | -| ↳ `visibility` | string | Repository visibility \(public, private, internal\) | -| ↳ `forks` | number | Number of forks | -| ↳ `open_issues` | number | Number of open issues | -| ↳ `watchers` | number | Number of watchers | -| ↳ `default_branch` | string | Default branch name | -| ↳ `created_at` | string | Repository creation timestamp | -| ↳ `updated_at` | string | Repository last update timestamp | -| ↳ `pushed_at` | string | Repository last push timestamp | -| ↳ `owner` | object | owner output from the tool | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `gravatar_id` | string | Owner gravatar ID | -| ↳ `url` | string | Owner API URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `followers_url` | string | Followers API URL | -| ↳ `following_url` | string | Following API URL | -| ↳ `gists_url` | string | Gists API URL | -| ↳ `starred_url` | string | Starred repositories API URL | -| ↳ `subscriptions_url` | string | Subscriptions API URL | -| ↳ `organizations_url` | string | Organizations API URL | -| ↳ `repos_url` | string | Repositories API URL | -| ↳ `events_url` | string | Events API URL | -| ↳ `received_events_url` | string | Received events API URL | -| ↳ `owner_type` | string | Owner type \(User, Organization\) | -| ↳ `site_admin` | boolean | Whether owner is a site administrator | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Username | -| ↳ `id` | number | User ID | -| ↳ `node_id` | string | User node ID | -| ↳ `avatar_url` | string | Avatar URL | -| ↳ `gravatar_id` | string | Gravatar ID | -| ↳ `url` | string | User API URL | -| ↳ `html_url` | string | Profile URL | -| ↳ `followers_url` | string | Followers API URL | -| ↳ `following_url` | string | Following API URL | -| ↳ `gists_url` | string | Gists API URL | -| ↳ `starred_url` | string | Starred repositories API URL | -| ↳ `subscriptions_url` | string | Subscriptions API URL | -| ↳ `organizations_url` | string | Organizations API URL | -| ↳ `repos_url` | string | Repositories API URL | -| ↳ `events_url` | string | Events API URL | -| ↳ `received_events_url` | string | Received events API URL | -| ↳ `user_type` | string | User type \(User, Bot, Organization\) | -| ↳ `site_admin` | boolean | Whether user is a site administrator | - - ---- - -### GitHub Webhook - -Trigger workflow from GitHub events like push, pull requests, issues, and more - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `contentType` | string | Yes | Format GitHub will use when sending the webhook payload. | -| `webhookSecret` | string | No | Validates that webhook deliveries originate from GitHub. | -| `sslVerification` | string | Yes | GitHub verifies SSL certificates when delivering webhooks. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `ref` | string | Git reference \(e.g., refs/heads/fix/telegram-wh\) | -| `before` | string | SHA of the commit before the push | -| `after` | string | SHA of the commit after the push | -| `created` | boolean | Whether the push created the reference | -| `deleted` | boolean | Whether the push deleted the reference | -| `forced` | boolean | Whether the push was forced | -| `base_ref` | string | Base reference for the push | -| `compare` | string | URL to compare the changes | -| `repository` | object | repository output from the tool | -| ↳ `id` | number | Repository ID | -| ↳ `node_id` | string | Repository node ID | -| ↳ `name` | string | Repository name | -| ↳ `full_name` | string | Repository full name \(owner/repo\) | -| ↳ `private` | boolean | Whether the repository is private | -| ↳ `html_url` | string | Repository HTML URL | -| ↳ `fork` | boolean | Whether the repository is a fork | -| ↳ `url` | string | Repository API URL | -| ↳ `created_at` | number | Repository creation timestamp | -| ↳ `updated_at` | string | Repository last updated time | -| ↳ `pushed_at` | number | Repository last push timestamp | -| ↳ `git_url` | string | Repository git URL | -| ↳ `ssh_url` | string | Repository SSH URL | -| ↳ `clone_url` | string | Repository clone URL | -| ↳ `homepage` | string | Repository homepage URL | -| ↳ `size` | number | Repository size | -| ↳ `stargazers_count` | number | Number of stars | -| ↳ `watchers_count` | number | Number of watchers | -| ↳ `language` | string | Primary programming language | -| ↳ `forks_count` | number | Number of forks | -| ↳ `archived` | boolean | Whether the repository is archived | -| ↳ `disabled` | boolean | Whether the repository is disabled | -| ↳ `open_issues_count` | number | Number of open issues | -| ↳ `topics` | array | Repository topics | -| ↳ `visibility` | string | Repository visibility \(public, private\) | -| ↳ `forks` | number | Number of forks | -| ↳ `open_issues` | number | Number of open issues | -| ↳ `watchers` | number | Number of watchers | -| ↳ `default_branch` | string | Default branch name | -| ↳ `stargazers` | number | Number of stargazers | -| ↳ `master_branch` | string | Master branch name | -| ↳ `owner` | object | owner output from the tool | -| ↳ `name` | string | Owner name | -| ↳ `email` | string | Owner email | -| ↳ `login` | string | Owner username | -| ↳ `id` | number | Owner ID | -| ↳ `node_id` | string | Owner node ID | -| ↳ `avatar_url` | string | Owner avatar URL | -| ↳ `gravatar_id` | string | Owner gravatar ID | -| ↳ `url` | string | Owner API URL | -| ↳ `html_url` | string | Owner profile URL | -| ↳ `user_view_type` | string | User view type | -| ↳ `site_admin` | boolean | Whether the owner is a site admin | -| ↳ `license` | object | Repository license information | -| `pusher` | object | Information about who pushed the changes | -| `sender` | object | sender output from the tool | -| ↳ `login` | string | Sender username | -| ↳ `id` | number | Sender ID | -| ↳ `node_id` | string | Sender node ID | -| ↳ `avatar_url` | string | Sender avatar URL | -| ↳ `gravatar_id` | string | Sender gravatar ID | -| ↳ `url` | string | Sender API URL | -| ↳ `html_url` | string | Sender profile URL | -| ↳ `user_view_type` | string | User view type | -| ↳ `site_admin` | boolean | Whether the sender is a site admin | -| `commits` | array | Array of commit objects | -| `head_commit` | object | Head commit object | -| `event_type` | string | Type of GitHub event \(e.g., push, pull_request, issues\) | -| `action` | string | The action that was performed \(e.g., opened, closed, synchronize\) | -| `branch` | string | Branch name extracted from ref | - diff --git a/apps/docs/content/docs/en/triggers/gmail.mdx b/apps/docs/content/docs/en/triggers/gmail.mdx deleted file mode 100644 index c4555771468..00000000000 --- a/apps/docs/content/docs/en/triggers/gmail.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Gmail -description: Available Gmail triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Gmail provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### Gmail Email Trigger - -Triggers when new emails are received in Gmail (requires Gmail credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires google email credentials to access your account. | -| `labelIds` | string | No | Choose which Gmail labels to monitor. Leave empty to monitor all emails. | -| `labelFilterBehavior` | string | Yes | Include only emails with selected labels, or exclude emails with selected labels | -| `searchQuery` | string | No | Optional Gmail search query to filter emails. Use the same format as Gmail search box \(e.g., | -| `markAsRead` | boolean | No | Automatically mark emails as read after processing | -| `includeAttachments` | boolean | No | Download and include email attachments in the trigger payload | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `email` | object | email output from the tool | -| ↳ `id` | string | Gmail message ID | -| ↳ `threadId` | string | Gmail thread ID | -| ↳ `subject` | string | Email subject line | -| ↳ `from` | string | Sender email address | -| ↳ `to` | string | Recipient email address | -| ↳ `cc` | string | CC recipients | -| ↳ `date` | string | Email date in ISO format | -| ↳ `bodyText` | string | Plain text email body | -| ↳ `bodyHtml` | string | HTML email body | -| ↳ `labels` | string | Email labels array | -| ↳ `hasAttachments` | boolean | Whether email has attachments | -| ↳ `attachments` | file[] | Array of email attachments as files \(if includeAttachments is enabled\) | -| `timestamp` | string | Event timestamp | - diff --git a/apps/docs/content/docs/en/triggers/gong.mdx b/apps/docs/content/docs/en/triggers/gong.mdx deleted file mode 100644 index 1885f7ffc70..00000000000 --- a/apps/docs/content/docs/en/triggers/gong.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Gong -description: Available Gong triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Gong provides 2 triggers for automating workflows based on events. - -## Triggers - -### Gong Call Completed - -Trigger workflow when a call is completed and processed in Gong - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `gongJwtPublicKeyPem` | string | No | Required only when your Gong rule uses **Signed JWT header**. Sim verifies RS256, `webhook_url`, and `body_sha256` per Gong. If empty, only the webhook URL path authenticates the request. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | Constant identifier for automation-rule webhooks \(`gong.automation_rule`\). Gong does not send distinct event names in the payload. | -| `callId` | string | Gong call ID \(same value as metaData.id when present\) | -| `isTest` | boolean | Whether this is a test webhook from the Gong UI | -| `callData` | json | Full call data object | -| `metaData` | object | metaData output from the tool | -| ↳ `id` | string | Gong call ID | -| ↳ `url` | string | URL to the call in Gong | -| ↳ `title` | string | Call title | -| ↳ `scheduled` | string | Scheduled start time \(ISO 8601\) | -| ↳ `started` | string | Actual start time \(ISO 8601\) | -| ↳ `duration` | number | Call duration in seconds | -| ↳ `primaryUserId` | string | Primary Gong user ID | -| ↳ `workspaceId` | string | Gong workspace ID | -| ↳ `direction` | string | Call direction \(Inbound, Outbound, etc.\) | -| ↳ `system` | string | Communication platform used \(e.g. Zoom, Teams\) | -| ↳ `scope` | string | Call scope \(Internal, External, or Unknown\) | -| ↳ `media` | string | Media type \(Video or Audio\) | -| ↳ `language` | string | Language code \(ISO-639-2B\) | -| ↳ `sdrDisposition` | string | SDR disposition classification \(when present\) | -| ↳ `clientUniqueId` | string | Call identifier from the origin recording system \(when present\) | -| ↳ `customData` | string | Custom metadata from call creation \(when present\) | -| ↳ `purpose` | string | Call purpose \(when present\) | -| ↳ `meetingUrl` | string | Web conference provider URL \(when present\) | -| ↳ `isPrivate` | boolean | Whether the call is private \(when present\) | -| ↳ `calendarEventId` | string | Calendar event identifier \(when present\) | -| `parties` | array | Array of call participants with name, email, title, and affiliation | -| `context` | array | Array of CRM context objects \(Salesforce opportunities, accounts, etc.\) | -| `trackers` | array | Keyword and smart trackers from call content \(same shape as Gong extensive-calls `content.trackers`\) | -| `topics` | array | Topic segments with durations from call content \(`content.topics`\) | -| `highlights` | array | AI-generated highlights from call content \(`content.highlights`\) | - - ---- - -### Gong Webhook - -Generic webhook trigger for all Gong events - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `gongJwtPublicKeyPem` | string | No | Required only when your Gong rule uses **Signed JWT header**. Sim verifies RS256, `webhook_url`, and `body_sha256` per Gong. If empty, only the webhook URL path authenticates the request. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | Constant identifier for automation-rule webhooks \(`gong.automation_rule`\). Gong does not send distinct event names in the payload. | -| `callId` | string | Gong call ID \(same value as metaData.id when present\) | -| `isTest` | boolean | Whether this is a test webhook from the Gong UI | -| `callData` | json | Full call data object | -| `metaData` | object | metaData output from the tool | -| ↳ `id` | string | Gong call ID | -| ↳ `url` | string | URL to the call in Gong | -| ↳ `title` | string | Call title | -| ↳ `scheduled` | string | Scheduled start time \(ISO 8601\) | -| ↳ `started` | string | Actual start time \(ISO 8601\) | -| ↳ `duration` | number | Call duration in seconds | -| ↳ `primaryUserId` | string | Primary Gong user ID | -| ↳ `workspaceId` | string | Gong workspace ID | -| ↳ `direction` | string | Call direction \(Inbound, Outbound, etc.\) | -| ↳ `system` | string | Communication platform used \(e.g. Zoom, Teams\) | -| ↳ `scope` | string | Call scope \(Internal, External, or Unknown\) | -| ↳ `media` | string | Media type \(Video or Audio\) | -| ↳ `language` | string | Language code \(ISO-639-2B\) | -| ↳ `sdrDisposition` | string | SDR disposition classification \(when present\) | -| ↳ `clientUniqueId` | string | Call identifier from the origin recording system \(when present\) | -| ↳ `customData` | string | Custom metadata from call creation \(when present\) | -| ↳ `purpose` | string | Call purpose \(when present\) | -| ↳ `meetingUrl` | string | Web conference provider URL \(when present\) | -| ↳ `isPrivate` | boolean | Whether the call is private \(when present\) | -| ↳ `calendarEventId` | string | Calendar event identifier \(when present\) | -| `parties` | array | Array of call participants with name, email, title, and affiliation | -| `context` | array | Array of CRM context objects \(Salesforce opportunities, accounts, etc.\) | -| `trackers` | array | Keyword and smart trackers from call content \(same shape as Gong extensive-calls `content.trackers`\) | -| `topics` | array | Topic segments with durations from call content \(`content.topics`\) | -| `highlights` | array | AI-generated highlights from call content \(`content.highlights`\) | - diff --git a/apps/docs/content/docs/en/triggers/google-calendar.mdx b/apps/docs/content/docs/en/triggers/google-calendar.mdx deleted file mode 100644 index b60b09843eb..00000000000 --- a/apps/docs/content/docs/en/triggers/google-calendar.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Google Calendar -description: Available Google Calendar triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Google Calendar provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### Google Calendar Event Trigger - -Triggers when events are created, updated, or cancelled in Google Calendar - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Connect your Google account to access Google Calendar. | -| `calendarId` | file-selector | No | The calendar to monitor for event changes. | -| `manualCalendarId` | string | No | The calendar to monitor for event changes. | -| `eventTypeFilter` | string | No | Only trigger for specific event types. Defaults to all events. | -| `searchTerm` | string | No | Optional: Filter events by text match across title, description, location, and attendees. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | object | event output from the tool | -| ↳ `id` | string | Calendar event ID | -| ↳ `status` | string | Event status \(confirmed, tentative, cancelled\) | -| ↳ `eventType` | string | Change type: "created", "updated", or "cancelled" | -| ↳ `summary` | string | Event title | -| ↳ `eventDescription` | string | Event description | -| ↳ `location` | string | Event location | -| ↳ `htmlLink` | string | Link to event in Google Calendar | -| ↳ `start` | json | Event start time | -| ↳ `end` | json | Event end time | -| ↳ `created` | string | Event creation time | -| ↳ `updated` | string | Event last updated time | -| ↳ `attendees` | json | Event attendees | -| ↳ `creator` | json | Event creator | -| ↳ `organizer` | json | Event organizer | -| `calendarId` | string | Calendar ID | -| `timestamp` | string | Event processing timestamp in ISO format | - diff --git a/apps/docs/content/docs/en/triggers/google-drive.mdx b/apps/docs/content/docs/en/triggers/google-drive.mdx deleted file mode 100644 index b0f7b35f34a..00000000000 --- a/apps/docs/content/docs/en/triggers/google-drive.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Google Drive -description: Available Google Drive triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Google Drive provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### Google Drive File Trigger - -Triggers when files are created, modified, or deleted in Google Drive - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Connect your Google account to access Google Drive. | -| `folderId` | file-selector | No | Optional: The folder to monitor. Leave empty to monitor all files in Drive. | -| `manualFolderId` | string | No | Optional: The folder ID from the Google Drive URL to monitor. Leave empty to monitor all files. | -| `mimeTypeFilter` | string | No | Optional: Only trigger for specific file types. | -| `eventTypeFilter` | string | No | Only trigger for specific change types. Defaults to all changes. | -| `includeSharedDrives` | boolean | No | Include files from shared \(team\) drives. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `file` | object | file output from the tool | -| ↳ `id` | string | Google Drive file ID | -| ↳ `name` | string | File name | -| ↳ `mimeType` | string | File MIME type | -| ↳ `modifiedTime` | string | Last modified time \(ISO\) | -| ↳ `createdTime` | string | File creation time \(ISO\) | -| ↳ `size` | string | File size in bytes | -| ↳ `webViewLink` | string | URL to view file in browser | -| ↳ `parents` | json | Parent folder IDs | -| ↳ `lastModifyingUser` | json | User who last modified the file | -| ↳ `shared` | boolean | Whether file is shared | -| ↳ `starred` | boolean | Whether file is starred | -| `eventType` | string | Change type: "created", "modified", or "deleted" | -| `timestamp` | string | Event timestamp in ISO format | - diff --git a/apps/docs/content/docs/en/triggers/google-sheets.mdx b/apps/docs/content/docs/en/triggers/google-sheets.mdx deleted file mode 100644 index 91c31509807..00000000000 --- a/apps/docs/content/docs/en/triggers/google-sheets.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Google Sheets -description: Available Google Sheets triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Google Sheets provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### Google Sheets New Row Trigger - -Triggers when new rows are added to a Google Sheet - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Connect your Google account to access Google Sheets. | -| `spreadsheetId` | file-selector | Yes | The spreadsheet to monitor for new rows. | -| `manualSpreadsheetId` | string | Yes | The spreadsheet to monitor for new rows. | -| `sheetName` | sheet-selector | Yes | The sheet tab to monitor for new rows. | -| `manualSheetName` | string | Yes | The sheet tab to monitor for new rows. | -| `valueRenderOption` | string | No | How values are rendered. Formatted returns display strings, Unformatted returns raw numbers/booleans, Formula returns the formula text. | -| `dateTimeRenderOption` | string | No | How dates and times are rendered. Only applies when Value Render is not | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `row` | json | Row data mapped to column headers from row 1 | -| `rawRow` | json | Raw row values as an array | -| `headers` | json | Column headers from row 1 | -| `rowNumber` | number | The 1-based row number of the new row | -| `spreadsheetId` | string | The spreadsheet ID | -| `sheetName` | string | The sheet tab name | -| `timestamp` | string | Event timestamp in ISO format | - diff --git a/apps/docs/content/docs/en/triggers/google_forms.mdx b/apps/docs/content/docs/en/triggers/google_forms.mdx deleted file mode 100644 index d60aa0d83d7..00000000000 --- a/apps/docs/content/docs/en/triggers/google_forms.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Google Forms -description: Available Google Forms triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Google Forms provides 1 trigger for automating workflows based on events. - -## Triggers - -### Google Forms Webhook - -Trigger workflow from Google Form submissions (via Apps Script forwarder) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `token` | string | Yes | We validate requests using this secret. Send it as Authorization: Bearer <token> or a custom header. | -| `secretHeaderName` | string | No | If set, the webhook will validate this header equals your Shared Secret instead of Authorization. | -| `triggerFormId` | string | No | Optional, for clarity and matching in workflows. Not required for webhook to work. | -| `includeRawPayload` | boolean | No | Include the original payload from Apps Script in the workflow input. | -| `setupScript` | string | No | Copy this code and paste it into your Google Forms Apps Script editor | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `responseId` | string | Unique response identifier \(if available\) | -| `createTime` | string | Response creation timestamp | -| `lastSubmittedTime` | string | Last submitted timestamp | -| `formId` | string | Google Form ID | -| `answers` | object | Normalized map of question -> answer | -| `raw` | object | Original payload \(when enabled\) | - diff --git a/apps/docs/content/docs/en/triggers/grain.mdx b/apps/docs/content/docs/en/triggers/grain.mdx deleted file mode 100644 index 849326f20c1..00000000000 --- a/apps/docs/content/docs/en/triggers/grain.mdx +++ /dev/null @@ -1,239 +0,0 @@ ---- -title: Grain -description: Available Grain triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Grain provides 8 triggers for automating workflows based on events. - -## Triggers - -### Grain All Events - -Trigger on all actions (added, updated, removed) in a Grain view - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., recording_added\) | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | Event data object \(recording, highlight, etc.\) | - - ---- - -### Grain Highlight Created - -Trigger workflow when a new highlight/clip is created in Grain - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | data output from the tool | -| ↳ `id` | string | Highlight UUID | -| ↳ `recording_id` | string | Parent recording UUID | -| ↳ `text` | string | Highlight title/description | -| ↳ `transcript` | string | Transcript text of the clip | -| ↳ `speakers` | array | Array of speaker names | -| ↳ `timestamp` | number | Start timestamp in ms | -| ↳ `duration` | number | Duration in ms | -| ↳ `tags` | array | Array of tag strings | -| ↳ `url` | string | URL to view in Grain | -| ↳ `thumbnail_url` | string | Thumbnail URL | -| ↳ `created_datetime` | string | ISO8601 creation timestamp | - - ---- - -### Grain Highlight Updated - -Trigger workflow when a highlight/clip is updated in Grain - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | data output from the tool | -| ↳ `id` | string | Highlight UUID | -| ↳ `recording_id` | string | Parent recording UUID | -| ↳ `text` | string | Highlight title/description | -| ↳ `transcript` | string | Transcript text of the clip | -| ↳ `speakers` | array | Array of speaker names | -| ↳ `timestamp` | number | Start timestamp in ms | -| ↳ `duration` | number | Duration in ms | -| ↳ `tags` | array | Array of tag strings | -| ↳ `url` | string | URL to view in Grain | -| ↳ `thumbnail_url` | string | Thumbnail URL | -| ↳ `created_datetime` | string | ISO8601 creation timestamp | - - ---- - -### Grain Item Added - -Trigger when a new item is added to a Grain view (recording, highlight, or story) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., recording_added\) | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | Event data object \(recording, highlight, etc.\) | - - ---- - -### Grain Item Updated - -Trigger when an item is updated in a Grain view (recording, highlight, or story) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | The view determines which content type fires events \(recordings, highlights, or stories\). | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., recording_added\) | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | Event data object \(recording, highlight, etc.\) | - - ---- - -### Grain Recording Created - -Trigger workflow when a new recording is added in Grain - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | data output from the tool | -| ↳ `id` | string | Recording UUID | -| ↳ `title` | string | Recording title | -| ↳ `start_datetime` | string | ISO8601 start timestamp | -| ↳ `end_datetime` | string | ISO8601 end timestamp | -| ↳ `duration_ms` | number | Duration in milliseconds | -| ↳ `media_type` | string | audio, transcript, or video | -| ↳ `source` | string | Recording source \(zoom, meet, local_capture, etc.\) | -| ↳ `url` | string | URL to view in Grain | -| ↳ `thumbnail_url` | string | Thumbnail URL \(nullable\) | -| ↳ `tags` | array | Array of tag strings | -| ↳ `teams` | array | Array of team objects | -| ↳ `meeting_type` | object | Meeting type info with id, name, scope \(nullable\) | - - ---- - -### Grain Recording Updated - -Trigger workflow when a recording is updated in Grain - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | data output from the tool | -| ↳ `id` | string | Recording UUID | -| ↳ `title` | string | Recording title | -| ↳ `start_datetime` | string | ISO8601 start timestamp | -| ↳ `end_datetime` | string | ISO8601 end timestamp | -| ↳ `duration_ms` | number | Duration in milliseconds | -| ↳ `media_type` | string | audio, transcript, or video | -| ↳ `source` | string | Recording source \(zoom, meet, local_capture, etc.\) | -| ↳ `url` | string | URL to view in Grain | -| ↳ `thumbnail_url` | string | Thumbnail URL \(nullable\) | -| ↳ `tags` | array | Array of tag strings | -| ↳ `teams` | array | Array of team objects | -| ↳ `meeting_type` | object | Meeting type info with id, name, scope \(nullable\) | - - ---- - -### Grain Story Created - -Trigger workflow when a new story is created in Grain - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Grain. | -| `viewId` | string | Yes | Required by Grain to create the webhook subscription. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type | -| `user_id` | string | User UUID who triggered the event | -| `data` | object | data output from the tool | -| ↳ `id` | string | Story UUID | -| ↳ `title` | string | Story title | -| ↳ `url` | string | URL to view in Grain | -| ↳ `created_datetime` | string | ISO8601 creation timestamp | - diff --git a/apps/docs/content/docs/en/triggers/greenhouse.mdx b/apps/docs/content/docs/en/triggers/greenhouse.mdx deleted file mode 100644 index d8b55bcbbf5..00000000000 --- a/apps/docs/content/docs/en/triggers/greenhouse.mdx +++ /dev/null @@ -1,295 +0,0 @@ ---- -title: Greenhouse -description: Available Greenhouse triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Greenhouse provides 8 triggers for automating workflows based on events. - -## Triggers - -### Greenhouse Candidate Hired - -Trigger workflow when a candidate is hired - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(hire_candidate\) | -| `payload` | object | payload output from the tool | -| ↳ `application` | object | application output from the tool | -| ↳ `id` | number | Application ID | -| ↳ `status` | string | Application status | -| ↳ `prospect` | boolean | Whether the applicant is a prospect | -| ↳ `applied_at` | string | When the application was submitted | -| ↳ `url` | string | Application URL in Greenhouse | -| ↳ `current_stage` | object | current_stage output from the tool | -| ↳ `id` | number | Current stage ID | -| ↳ `name` | string | Current stage name | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | number | Candidate ID | -| ↳ `first_name` | string | First name | -| ↳ `last_name` | string | Last name | -| ↳ `title` | string | Current title | -| ↳ `company` | string | Current company | -| ↳ `email_addresses` | json | Email addresses | -| ↳ `phone_numbers` | json | Phone numbers | -| ↳ `recruiter` | json | Assigned recruiter | -| ↳ `coordinator` | json | Assigned coordinator | -| ↳ `jobs` | json | Associated jobs \(array\) | -| ↳ `offer` | object | offer output from the tool | -| ↳ `id` | number | Offer ID | -| ↳ `version` | number | Offer version | -| ↳ `starts_at` | string | Offer start date | -| ↳ `custom_fields` | json | Offer custom fields | -| ↳ `custom_fields` | json | Application custom fields | - - ---- - -### Greenhouse Candidate Rejected - -Trigger workflow when a candidate is rejected - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(reject_candidate\) | -| `payload` | object | payload output from the tool | -| ↳ `application` | object | application output from the tool | -| ↳ `id` | number | Application ID | -| ↳ `status` | string | Application status \(rejected\) | -| ↳ `prospect` | boolean | Whether the applicant is a prospect | -| ↳ `applied_at` | string | When the application was submitted | -| ↳ `rejected_at` | string | When the candidate was rejected | -| ↳ `url` | string | Application URL in Greenhouse | -| ↳ `current_stage` | object | current_stage output from the tool | -| ↳ `id` | number | Stage ID where rejected | -| ↳ `name` | string | Stage name where rejected | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | number | Candidate ID | -| ↳ `first_name` | string | First name | -| ↳ `last_name` | string | Last name | -| ↳ `email_addresses` | json | Email addresses | -| ↳ `phone_numbers` | json | Phone numbers | -| ↳ `jobs` | json | Associated jobs \(array\) | -| ↳ `rejection_reason` | json | Rejection reason object with id, name, and type fields | -| ↳ `rejection_details` | json | Rejection details with custom fields | -| ↳ `custom_fields` | json | Application custom fields | - - ---- - -### Greenhouse Candidate Stage Change - -Trigger workflow when a candidate changes interview stages - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(candidate_stage_change\) | -| `payload` | object | payload output from the tool | -| ↳ `application` | object | application output from the tool | -| ↳ `id` | number | Application ID | -| ↳ `status` | string | Application status | -| ↳ `prospect` | boolean | Whether the applicant is a prospect | -| ↳ `applied_at` | string | When the application was submitted | -| ↳ `url` | string | Application URL in Greenhouse | -| ↳ `current_stage` | object | current_stage output from the tool | -| ↳ `id` | number | Current stage ID | -| ↳ `name` | string | Current stage name | -| ↳ `interviews` | json | Interviews in this stage | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | number | Candidate ID | -| ↳ `first_name` | string | First name | -| ↳ `last_name` | string | Last name | -| ↳ `title` | string | Current title | -| ↳ `company` | string | Current company | -| ↳ `email_addresses` | json | Email addresses | -| ↳ `phone_numbers` | json | Phone numbers | -| ↳ `jobs` | json | Associated jobs \(array\) | -| ↳ `custom_fields` | json | Application custom fields | - - ---- - -### Greenhouse Job Created - -Trigger workflow when a new job is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(job_created\) | - - ---- - -### Greenhouse Job Updated - -Trigger workflow when a job is updated - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(job_updated\) | - - ---- - -### Greenhouse New Application - -Trigger workflow when a new application is submitted - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(new_candidate_application\) | -| `payload` | object | payload output from the tool | -| ↳ `application` | object | application output from the tool | -| ↳ `id` | number | Application ID | -| ↳ `status` | string | Application status | -| ↳ `prospect` | boolean | Whether the applicant is a prospect | -| ↳ `applied_at` | string | When the application was submitted | -| ↳ `url` | string | Application URL in Greenhouse | -| ↳ `current_stage` | object | current_stage output from the tool | -| ↳ `id` | number | Current stage ID | -| ↳ `name` | string | Current stage name | -| ↳ `candidate` | object | candidate output from the tool | -| ↳ `id` | number | Candidate ID | -| ↳ `first_name` | string | First name | -| ↳ `last_name` | string | Last name | -| ↳ `title` | string | Current title | -| ↳ `company` | string | Current company | -| ↳ `created_at` | string | When the candidate was created | -| ↳ `email_addresses` | json | Email addresses | -| ↳ `phone_numbers` | json | Phone numbers | -| ↳ `tags` | json | Candidate tags | -| ↳ `jobs` | json | Associated jobs \(array\) | -| ↳ `answers` | json | Application question answers | -| ↳ `attachments` | json | Application attachments | -| ↳ `custom_fields` | json | Application custom fields | - - ---- - -### Greenhouse Offer Created - -Trigger workflow when a new offer is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type \(offer_created\) | -| `payload` | object | payload output from the tool | -| ↳ `id` | number | Offer ID | -| ↳ `application_id` | number | Associated application ID | -| ↳ `job_id` | number | Associated job ID | -| ↳ `user_id` | number | User who created the offer | -| ↳ `version` | number | Offer version number | -| ↳ `sent_on` | string | When the offer was sent | -| ↳ `resolved_at` | string | When the offer was resolved | -| ↳ `start_date` | string | Offer start date | -| ↳ `notes` | string | Offer notes | -| ↳ `offer_status` | string | Offer status | -| ↳ `custom_fields` | json | Custom field values | - - ---- - -### Greenhouse Webhook (Endpoint Events) - -Trigger on whichever event types you select for this URL in Greenhouse. Sim does not filter deliveries for this trigger. - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretKey` | string | No | When set, requests must include a valid Signature header \(HMAC-SHA256\). If left empty, the endpoint does not verify signatures—only use on a private URL you fully control. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `applicationId` | number | Application id when present \(`payload.application.id` or flat `payload.application_id` on offers\) | -| `candidateId` | number | Candidate id when `payload.application.candidate.id` is present | -| `jobId` | number | Job id from `payload.job.id` or flat `payload.job_id` when present | -| `action` | string | The webhook event type | -| `payload` | json | Full event payload | - diff --git a/apps/docs/content/docs/en/triggers/hubspot.mdx b/apps/docs/content/docs/en/triggers/hubspot.mdx deleted file mode 100644 index 532368cacc8..00000000000 --- a/apps/docs/content/docs/en/triggers/hubspot.mdx +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: HubSpot -description: Available HubSpot triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -HubSpot provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### HubSpot CRM Trigger - -Triggers when HubSpot CRM records (contacts, companies, deals, tickets, custom objects) are created or updated, or when contacts join a list - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | Connect a HubSpot account so Sim can poll your CRM on your behalf. | -| `objectType` | string | Yes | What you want to watch. | -| `customObjectTypeId` | string | No | HubSpot custom object type ID \(e.g. | -| `listId` | string | No | The HubSpot list to watch for new members. | -| `eventType` | string | No | Created fires once per new record. Updated fires on any modification. Property Changed fires only when the chosen property changes value. | -| `targetPropertyName` | string | No | Fires only when this specific property changes value on a record. | -| `properties` | string | No | Properties to include on each record. Leave empty to use sensible defaults. Sim always includes the timestamps it needs internally. | -| `pipelineId` | string | No | Restrict to a single pipeline. | -| `stageId` | string | No | Restrict to a single stage within the selected pipeline. | -| `ownerId` | string | No | Restrict to records owned by a specific HubSpot user. | -| `filters` | string | No | JSON array of HubSpot search filters, AND-combined. Each item: \{ | -| `maxRecordsPerPoll` | string | No | Soft cap on records emitted per poll \(default 50, max 1000\). Excess rolls over to the next poll. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `objectType` | string | HubSpot object type \(contact, company, deal, ticket, custom object id, or list_membership\) | -| `eventType` | string | Event type \(created, updated, property_changed, or joined\) | -| `objectId` | string | HubSpot ID of the affected record \(or contact id for list memberships\) | -| `occurredAt` | string | ISO timestamp of when the change happened in HubSpot | -| `properties` | json | HubSpot properties on the record as a key-value object \(property internal name → value\). Default keys per object type \(override via "Properties to Fetch"\): Contact → firstname, lastname, email, phone, company, lifecyclestage, hs_lead_status, hubspot_owner_id, createdate, lastmodifieddate. Company → name, domain, industry, lifecyclestage, hubspot_owner_id, createdate, hs_lastmodifieddate. Deal → dealname, amount, dealstage, pipeline, closedate, hubspot_owner_id, createdate, hs_lastmodifieddate. Ticket → subject, content, hs_pipeline, hs_pipeline_stage, hs_ticket_priority, hubspot_owner_id, createdate, hs_lastmodifieddate. Custom and user-requested properties appear keyed by their HubSpot internal name. | -| `createdAt` | string | ISO timestamp when the record was created in HubSpot | -| `updatedAt` | string | ISO timestamp when the record was last updated in HubSpot | -| `archived` | boolean | Whether the record is archived | -| `propertyName` | string | Name of the property that changed \(property_changed events only\) | -| `propertyValue` | string | New value of the changed property \(property_changed events only\) | -| `previousValue` | string | Previous value before the change \(property_changed events only\) | -| `listId` | string | HubSpot list ID \(list_membership events only\) | -| `timestamp` | string | ISO timestamp when Sim emitted the event | - diff --git a/apps/docs/content/docs/en/triggers/index.mdx b/apps/docs/content/docs/en/triggers/index.mdx deleted file mode 100644 index e996a39bc27..00000000000 --- a/apps/docs/content/docs/en/triggers/index.mdx +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: Overview -description: Triggers are the core ways to start Sim workflows ---- - -import { Card, Cards } from 'fumadocs-ui/components/card' -import { Image } from '@/components/ui/image' -import { FAQ } from '@/components/ui/faq' - -
- Triggers Overview -
- -## Core Triggers - -Use the Start block for everything originating from the editor, deploy-to-API, or deploy-to-chat experiences. Other triggers remain available for event-driven workflows: - - - - Unified entry point that supports editor runs, API deployments and chat deployments - - - Receive external webhook payloads - - - Cron or interval based runs - - - Monitor RSS and Atom feeds for new content - - - Monitor team Gmail and Outlook inboxes - - - -## Quick Comparison - -| Trigger | Start condition | -|---------|-----------------| -| **Start** | Editor runs, deploy-to-API requests, or chat messages | -| **Schedule** | Timer managed in schedule block | -| **Webhook** | On inbound HTTP request | -| **RSS Feed** | New item published to feed | -| **Email Polling Groups** | New email received in team Gmail or Outlook inboxes | - -> The Start block always exposes `input`, `conversationId`, and `files` fields. Add custom fields to the input format for additional structured data. - -## Using Triggers - -1. Drop the Start block in the start slot (or an alternate trigger like Webhook/Schedule). -2. Configure any required schema or auth. -3. Connect the block to the rest of the workflow. - -> Deployments power every trigger. Update the workflow, redeploy, and all trigger entry points pick up the new snapshot. Learn more in [Execution → Deployment Snapshots](/execution). - -## Manual Run Priority - -When you click **Run** in the editor, Sim automatically selects which trigger to run based on the following priority order: - -1. **Start Block** (highest priority) -2. **Schedule Triggers** -3. **External Triggers** (webhooks, integrations like Slack, Gmail, Airtable, etc.) - -If your workflow has multiple triggers, the highest priority trigger will be used. For example, if you have both a Start block and a Webhook trigger, clicking Run will use the Start block. - -**External triggers with mock payloads**: When external triggers (webhooks and integrations) are run manually, Sim automatically generates mock payloads based on the trigger's expected data structure. This ensures downstream blocks can resolve variables correctly during testing. - -## Email Polling Groups - -Polling Groups let you monitor multiple team members' Gmail or Outlook inboxes with a single trigger. Requires a Team or Enterprise plan. - -**Creating a Polling Group** (Admin/Owner) - -1. Go to **Settings → Email Polling** -2. Click **Create** and choose Gmail or Outlook -3. Enter a name for the group - -**Inviting Members** - -1. Click **Add Members** on your polling group -2. Enter email addresses (comma or newline separated, or drag & drop a CSV) -3. Click **Send Invites** - -Invitees receive an email with a link to connect their account. Once connected, their inbox is automatically included in the polling group. Invitees don't need to be members of your Sim organization. - -This is separate from external workspace membership: polling group invitees are granting access to an inbox for a trigger, while external workspace members are collaborators with Read, Write, or Admin access to a workspace. - -**Using in a Workflow** - -When configuring an email trigger, select your polling group from the credentials dropdown instead of an individual account. The system creates webhooks for each member and routes all emails through your workflow. - - diff --git a/apps/docs/content/docs/en/triggers/intercom.mdx b/apps/docs/content/docs/en/triggers/intercom.mdx deleted file mode 100644 index 0930f009e18..00000000000 --- a/apps/docs/content/docs/en/triggers/intercom.mdx +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Intercom -description: Available Intercom triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Intercom provides 6 triggers for automating workflows based on events. - -## Triggers - -### Intercom Contact Created - -Trigger workflow when a new lead is created in Intercom - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - - ---- - -### Intercom Conversation Closed - -Trigger workflow when a conversation is closed in Intercom - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - - ---- - -### Intercom Conversation Created - -Trigger workflow when a new conversation is created in Intercom - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - - ---- - -### Intercom Conversation Reply - -Trigger workflow when someone replies to an Intercom conversation - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - - ---- - -### Intercom User Created - -Trigger workflow when a new user is created in Intercom - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - - ---- - -### Intercom Webhook (All Events) - -Trigger workflow on any Intercom webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Your app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `topic` | string | The webhook topic \(e.g., conversation.user.created\) | -| `id` | string | Unique notification ID | -| `app_id` | string | Your Intercom app ID | -| `created_at` | number | Unix timestamp when the event occurred | -| `delivery_attempts` | number | Number of delivery attempts for this notification | -| `first_sent_at` | number | Unix timestamp of first delivery attempt | -| `data` | json | data output from the tool | - diff --git a/apps/docs/content/docs/en/triggers/jira.mdx b/apps/docs/content/docs/en/triggers/jira.mdx deleted file mode 100644 index 5f467a2147c..00000000000 --- a/apps/docs/content/docs/en/triggers/jira.mdx +++ /dev/null @@ -1,976 +0,0 @@ ---- -title: Jira -description: Available Jira triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Jira provides 15 triggers for automating workflows based on events. - -## Triggers - -### Jira Comment Deleted - -Trigger workflow when a comment is deleted from a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which comment deletions trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the comment | -| ↳ `accountId` | string | Account ID of the user who last updated the comment | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | -| ↳ `self` | string | REST API URL for this comment | - - ---- - -### Jira Comment Updated - -Trigger workflow when a comment is updated on a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which comment updates trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the comment | -| ↳ `accountId` | string | Account ID of the user who last updated the comment | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | -| ↳ `self` | string | REST API URL for this comment | - - ---- - -### Jira Issue Commented - -Trigger workflow when a comment is added to a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue comments trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the comment | -| ↳ `accountId` | string | Account ID of the user who last updated the comment | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | -| ↳ `self` | string | REST API URL for this comment | - - ---- - -### Jira Issue Created - -Trigger workflow when a new issue is created in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issues trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | - - ---- - -### Jira Issue Deleted - -Trigger workflow when an issue is deleted in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue deletions trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | - - ---- - -### Jira Issue Updated - -Trigger workflow when an issue is updated in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue updates trigger this workflow using JQL | -| `fieldFilters` | string | No | Comma-separated list of fields to monitor. Only trigger when these fields change. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `issue_event_type_name` | string | Issue event type name from Jira \(only present in issue events\) | -| `changelog` | object | changelog output from the tool | -| ↳ `id` | string | Changelog ID | - - ---- - -### Jira Project Created - -Trigger workflow when a project is created in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(project_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `self` | string | REST API URL for this project | -| ↳ `projectTypeKey` | string | Project type \(e.g., software, business\) | -| ↳ `lead` | object | lead output from the tool | -| ↳ `displayName` | string | Project lead display name | -| ↳ `accountId` | string | Project lead account ID | - - ---- - -### Jira Sprint Closed - -Trigger workflow when a sprint is closed in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `sprint` | object | sprint output from the tool | -| ↳ `id` | number | Sprint ID | -| ↳ `self` | string | REST API URL for this sprint | -| ↳ `state` | string | Sprint state \(future, active, closed\) | -| ↳ `name` | string | Sprint name | -| ↳ `startDate` | string | Sprint start date \(ISO format\) | -| ↳ `endDate` | string | Sprint end date \(ISO format\) | -| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | -| ↳ `originBoardId` | number | Board ID the sprint belongs to | -| ↳ `goal` | string | Sprint goal | -| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | - - ---- - -### Jira Sprint Created - -Trigger workflow when a sprint is created in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `sprint` | object | sprint output from the tool | -| ↳ `id` | number | Sprint ID | -| ↳ `self` | string | REST API URL for this sprint | -| ↳ `state` | string | Sprint state \(future, active, closed\) | -| ↳ `name` | string | Sprint name | -| ↳ `startDate` | string | Sprint start date \(ISO format\) | -| ↳ `endDate` | string | Sprint end date \(ISO format\) | -| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | -| ↳ `originBoardId` | number | Board ID the sprint belongs to | -| ↳ `goal` | string | Sprint goal | -| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | - - ---- - -### Jira Sprint Started - -Trigger workflow when a sprint is started in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., sprint_started, sprint_closed\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `sprint` | object | sprint output from the tool | -| ↳ `id` | number | Sprint ID | -| ↳ `self` | string | REST API URL for this sprint | -| ↳ `state` | string | Sprint state \(future, active, closed\) | -| ↳ `name` | string | Sprint name | -| ↳ `startDate` | string | Sprint start date \(ISO format\) | -| ↳ `endDate` | string | Sprint end date \(ISO format\) | -| ↳ `completeDate` | string | Sprint completion date \(ISO format\) | -| ↳ `originBoardId` | number | Board ID the sprint belongs to | -| ↳ `goal` | string | Sprint goal | -| ↳ `createdDate` | string | Sprint creation date \(ISO format\) | - - ---- - -### Jira Version Released - -Trigger workflow when a version is released in Jira - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(jira:version_released\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `version` | object | version output from the tool | -| ↳ `id` | string | Version ID | -| ↳ `name` | string | Version name | -| ↳ `self` | string | REST API URL for this version | -| ↳ `released` | boolean | Whether the version is released | -| ↳ `releaseDate` | string | Release date \(ISO format\) | -| ↳ `projectId` | number | Project ID the version belongs to | -| ↳ `description` | string | Version description | -| ↳ `archived` | boolean | Whether the version is archived | - - ---- - -### Jira Webhook (All Events) - -Trigger workflow on any Jira webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `changelog` | object | changelog output from the tool | -| ↳ `id` | string | Changelog ID | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | string | Comment text/body | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | -| `worklog` | object | worklog output from the tool | -| ↳ `id` | string | Worklog entry ID | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Worklog author display name | -| ↳ `accountId` | string | Worklog author account ID | -| ↳ `emailAddress` | string | Worklog author email address | -| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | -| ↳ `timeSpentSeconds` | number | Time spent in seconds | -| ↳ `comment` | string | Worklog comment/description | -| ↳ `started` | string | When the work was started \(ISO format\) | - - ---- - -### Jira Worklog Created - -Trigger workflow when time is logged on a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog entries trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `worklog` | object | worklog output from the tool | -| ↳ `id` | string | Worklog entry ID | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Worklog author display name | -| ↳ `accountId` | string | Worklog author account ID | -| ↳ `emailAddress` | string | Worklog author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the worklog | -| ↳ `accountId` | string | Account ID of the user who last updated the worklog | -| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | -| ↳ `timeSpentSeconds` | number | Time spent in seconds | -| ↳ `comment` | string | Worklog comment/description | -| ↳ `started` | string | When the work was started \(ISO format\) | -| ↳ `created` | string | When the worklog entry was created \(ISO format\) | -| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | -| ↳ `issueId` | string | ID of the issue this worklog belongs to | -| ↳ `self` | string | REST API URL for this worklog entry | - - ---- - -### Jira Worklog Deleted - -Trigger workflow when a worklog entry is deleted from a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog deletions trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `worklog` | object | worklog output from the tool | -| ↳ `id` | string | Worklog entry ID | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Worklog author display name | -| ↳ `accountId` | string | Worklog author account ID | -| ↳ `emailAddress` | string | Worklog author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the worklog | -| ↳ `accountId` | string | Account ID of the user who last updated the worklog | -| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | -| ↳ `timeSpentSeconds` | number | Time spent in seconds | -| ↳ `comment` | string | Worklog comment/description | -| ↳ `started` | string | When the work was started \(ISO format\) | -| ↳ `created` | string | When the worklog entry was created \(ISO format\) | -| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | -| ↳ `issueId` | string | ID of the issue this worklog belongs to | -| ↳ `self` | string | REST API URL for this worklog entry | - - ---- - -### Jira Worklog Updated - -Trigger workflow when a worklog entry is updated on a Jira issue - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog updates trigger this workflow using JQL | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, comment_created, worklog_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| ↳ `emailAddress` | string | Email address of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Jira issue key \(e.g., PROJ-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `votes` | json | Votes on this issue | -| ↳ `labels` | array | Array of labels applied to this issue | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `created` | string | Issue creation date \(ISO format\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `duedate` | string | Due date for the issue | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `summary` | string | Issue summary/title | -| ↳ `description` | json | Issue description in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `watches` | json | Watchers information | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `progress` | json | Progress tracking information | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `security` | string | Security level | -| ↳ `subtasks` | array | Array of subtask objects | -| ↳ `versions` | array | Array of affected versions | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name | -| ↳ `id` | string | Issue type ID | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| ↳ `components` | array | Array of component objects associated with this issue | -| ↳ `fixVersions` | array | Array of fix version objects for this issue | -| `worklog` | object | worklog output from the tool | -| ↳ `id` | string | Worklog entry ID | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Worklog author display name | -| ↳ `accountId` | string | Worklog author account ID | -| ↳ `emailAddress` | string | Worklog author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the worklog | -| ↳ `accountId` | string | Account ID of the user who last updated the worklog | -| ↳ `timeSpent` | string | Time spent \(e.g., "2h 30m"\) | -| ↳ `timeSpentSeconds` | number | Time spent in seconds | -| ↳ `comment` | string | Worklog comment/description | -| ↳ `started` | string | When the work was started \(ISO format\) | -| ↳ `created` | string | When the worklog entry was created \(ISO format\) | -| ↳ `updated` | string | When the worklog entry was last updated \(ISO format\) | -| ↳ `issueId` | string | ID of the issue this worklog belongs to | -| ↳ `self` | string | REST API URL for this worklog entry | - diff --git a/apps/docs/content/docs/en/triggers/jsm.mdx b/apps/docs/content/docs/en/triggers/jsm.mdx deleted file mode 100644 index 4233fa04e7b..00000000000 --- a/apps/docs/content/docs/en/triggers/jsm.mdx +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: Jsm -description: Available Jsm triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Jsm provides 5 triggers for automating workflows based on events. - -## Triggers - -### JSM Request Commented - -Trigger workflow when a comment is added to a Jira Service Management request - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Issue key \(e.g., SD-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `summary` | string | Request summary/title | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Current status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | -| ↳ `id` | string | Issue type ID | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `created` | string | Request creation date \(ISO format\) | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `duedate` | string | Due date for the request | -| ↳ `labels` | array | Array of labels applied to this request | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `updateAuthor` | object | updateAuthor output from the tool | -| ↳ `displayName` | string | Display name of the user who last updated the comment | -| ↳ `accountId` | string | Account ID of the user who last updated the comment | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | - - ---- - -### JSM Request Created - -Trigger workflow when a new service request is created in Jira Service Management - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Issue key \(e.g., SD-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `summary` | string | Request summary/title | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Current status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | -| ↳ `id` | string | Issue type ID | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `created` | string | Request creation date \(ISO format\) | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `duedate` | string | Due date for the request | -| ↳ `labels` | array | Array of labels applied to this request | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| `issue_event_type_name` | string | Issue event type name from Jira | - - ---- - -### JSM Request Resolved - -Trigger workflow when a service request is resolved in Jira Service Management - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Issue key \(e.g., SD-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `summary` | string | Request summary/title | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Current status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | -| ↳ `id` | string | Issue type ID | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `created` | string | Request creation date \(ISO format\) | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `duedate` | string | Due date for the request | -| ↳ `labels` | array | Array of labels applied to this request | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| `issue_event_type_name` | string | Issue event type name from Jira | -| `changelog` | object | changelog output from the tool | -| ↳ `id` | string | Changelog ID | - - ---- - -### JSM Request Updated - -Trigger workflow when a service request is updated in Jira Service Management - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `webhookEvent` | string | The webhook event type \(e.g., jira:issue_created, jira:issue_updated, comment_created\) | -| `timestamp` | number | Timestamp of the webhook event | -| `user` | object | user output from the tool | -| ↳ `displayName` | string | Display name of the user who triggered the event | -| ↳ `accountId` | string | Account ID of the user who triggered the event | -| `issue` | object | issue output from the tool | -| ↳ `id` | string | Jira issue ID | -| ↳ `key` | string | Issue key \(e.g., SD-123\) | -| ↳ `self` | string | REST API URL for this issue | -| ↳ `fields` | object | fields output from the tool | -| ↳ `summary` | string | Request summary/title | -| ↳ `status` | object | status output from the tool | -| ↳ `name` | string | Current status name | -| ↳ `id` | string | Status ID | -| ↳ `statusCategory` | json | Status category information | -| ↳ `priority` | object | priority output from the tool | -| ↳ `name` | string | Priority name | -| ↳ `id` | string | Priority ID | -| ↳ `issuetype` | object | issuetype output from the tool | -| ↳ `name` | string | Issue type name \(e.g., Service Request, Incident\) | -| ↳ `id` | string | Issue type ID | -| ↳ `project` | object | project output from the tool | -| ↳ `key` | string | Project key | -| ↳ `name` | string | Project name | -| ↳ `id` | string | Project ID | -| ↳ `reporter` | object | reporter output from the tool | -| ↳ `displayName` | string | Reporter display name | -| ↳ `accountId` | string | Reporter account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `assignee` | object | assignee output from the tool | -| ↳ `displayName` | string | Assignee display name | -| ↳ `accountId` | string | Assignee account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `creator` | object | creator output from the tool | -| ↳ `displayName` | string | Creator display name | -| ↳ `accountId` | string | Creator account ID | -| ↳ `emailAddress` | string | Email address \(Jira Server only — not available in Jira Cloud webhook payloads\) | -| ↳ `created` | string | Request creation date \(ISO format\) | -| ↳ `updated` | string | Last updated date \(ISO format\) | -| ↳ `duedate` | string | Due date for the request | -| ↳ `labels` | array | Array of labels applied to this request | -| ↳ `resolution` | object | resolution output from the tool | -| ↳ `name` | string | Resolution name \(e.g., Done, Fixed\) | -| ↳ `id` | string | Resolution ID | -| `issue_event_type_name` | string | Issue event type name from Jira | -| `changelog` | object | changelog output from the tool | -| ↳ `id` | string | Changelog ID | - - ---- - -### JSM Webhook (All Events) - -Trigger workflow on any Jira Service Management webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which service desk requests trigger this workflow using JQL \(Jira Query Language\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `changelog` | object | changelog output from the tool | -| ↳ `id` | string | Changelog ID | -| `comment` | object | comment output from the tool | -| ↳ `id` | string | Comment ID | -| ↳ `body` | json | Comment body in Atlassian Document Format \(ADF\). On Jira Server this may be a plain string. | -| ↳ `author` | object | author output from the tool | -| ↳ `displayName` | string | Comment author display name | -| ↳ `accountId` | string | Comment author account ID | -| ↳ `emailAddress` | string | Comment author email address | -| ↳ `created` | string | Comment creation date \(ISO format\) | -| ↳ `updated` | string | Comment last updated date \(ISO format\) | - diff --git a/apps/docs/content/docs/en/triggers/linear.mdx b/apps/docs/content/docs/en/triggers/linear.mdx deleted file mode 100644 index fa64c12e4fd..00000000000 --- a/apps/docs/content/docs/en/triggers/linear.mdx +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Linear -description: Available Linear triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Linear provides 15 triggers for automating workflows based on events. - -## Triggers - -### Linear Comment Created - -Trigger workflow when a new comment is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Comment Updated - -Trigger workflow when a comment is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Customer Request Created - -Trigger workflow when a new customer request is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Customer Request Updated - -Trigger workflow when a customer request is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Cycle Created - -Trigger workflow when a new cycle is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Cycle Updated - -Trigger workflow when a cycle is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Issue Created - -Trigger workflow when a new issue is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Issue Removed - -Trigger workflow when an issue is removed/deleted in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Issue Updated - -Trigger workflow when an issue is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Label Created - -Trigger workflow when a new label is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Label Updated - -Trigger workflow when a label is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Project Created - -Trigger workflow when a new project is created in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Project Update Created - -Trigger workflow when a new project update is posted in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Project Updated - -Trigger workflow when a project is updated in Linear - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - - ---- - -### Linear Webhook - -Trigger workflow from Linear events you select when creating the webhook in Linear (not guaranteed to be every model or event type). - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | API Key | -| `teamId` | string | No | Team ID | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `action` | string | Action performed \(create, update, remove\) | -| `type` | string | Entity type \(Issue, Comment, Project, Cycle, IssueLabel, ProjectUpdate, etc.\) | -| `webhookId` | string | Webhook ID | -| `webhookTimestamp` | number | Webhook timestamp \(milliseconds\) | -| `organizationId` | string | Organization ID | -| `createdAt` | string | Event creation timestamp | -| `url` | string | URL of the subject entity in Linear \(top-level webhook payload\) | -| `data` | object | Complete entity data object | -| `updatedFrom` | object | Previous values for changed fields \(only present on update\) | - diff --git a/apps/docs/content/docs/en/triggers/meta.json b/apps/docs/content/docs/en/triggers/meta.json index 10a41e72ef0..a84bd247498 100644 --- a/apps/docs/content/docs/en/triggers/meta.json +++ b/apps/docs/content/docs/en/triggers/meta.json @@ -1,54 +1,4 @@ { - "pages": [ - "index", - "start", - "schedule", - "webhook", - "rss", - "airtable", - "ashby", - "attio", - "azure_devops", - "calcom", - "calendly", - "circleback", - "confluence", - "emailbison", - "fathom", - "fireflies", - "github", - "gmail", - "gong", - "google-calendar", - "google-drive", - "google-sheets", - "google_forms", - "grain", - "greenhouse", - "hubspot", - "imap", - "intercom", - "jira", - "jsm", - "lemlist", - "linear", - "microsoft-teams", - "monday", - "notion", - "outlook", - "resend", - "salesforce", - "sendblue", - "servicenow", - "slack", - "stripe", - "table", - "telegram", - "twilio_voice", - "typeform", - "vercel", - "webflow", - "whatsapp", - "zoom" - ] + "title": "Core Triggers", + "pages": ["start", "schedule", "webhook", "rss", "table"] } diff --git a/apps/docs/content/docs/en/triggers/microsoft-teams.mdx b/apps/docs/content/docs/en/triggers/microsoft-teams.mdx deleted file mode 100644 index 3af8b9e1344..00000000000 --- a/apps/docs/content/docs/en/triggers/microsoft-teams.mdx +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Microsoft Teams -description: Available Microsoft Teams triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Microsoft Teams provides 2 triggers for automating workflows based on events. - -## Triggers - -### Microsoft Teams Channel - -Trigger workflow from Microsoft Teams channel messages via outgoing webhooks - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `hmacSecret` | string | Yes | The security token provided by Teams when creating an outgoing webhook. Used to verify request authenticity. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `from` | object | from output from the tool | -| ↳ `id` | string | Sender ID | -| ↳ `name` | string | Sender name | -| ↳ `aadObjectId` | string | AAD Object ID | -| `message` | object | message output from the tool | -| ↳ `raw` | object | raw output from the tool | -| ↳ `attachments` | json | Array of attachments | -| ↳ `channelData` | object | channelData output from the tool | -| ↳ `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| ↳ `tenant` | object | tenant output from the tool | -| ↳ `id` | string | Tenant ID | -| ↳ `channel` | object | channel output from the tool | -| ↳ `id` | string | Channel ID | -| ↳ `teamsTeamId` | string | Teams team ID | -| ↳ `teamsChannelId` | string | Teams channel ID | -| ↳ `conversation` | object | conversation output from the tool | -| ↳ `id` | string | Composite conversation ID | -| ↳ `name` | string | Conversation name \(nullable\) | -| ↳ `isGroup` | boolean | Is group conversation | -| ↳ `tenantId` | string | Tenant ID | -| ↳ `aadObjectId` | string | AAD Object ID \(nullable\) | -| ↳ `conversationType` | string | Conversation type \(channel\) | -| ↳ `text` | string | Message text content | -| ↳ `messageType` | string | Message type | -| ↳ `channelId` | string | Channel ID \(msteams\) | -| ↳ `timestamp` | string | Timestamp | -| `activity` | object | Activity payload | -| `conversation` | object | conversation output from the tool | -| ↳ `id` | string | Composite conversation ID | -| ↳ `name` | string | Conversation name \(nullable\) | -| ↳ `isGroup` | boolean | Is group conversation | -| ↳ `tenantId` | string | Tenant ID | -| ↳ `aadObjectId` | string | AAD Object ID \(nullable\) | -| ↳ `conversationType` | string | Conversation type \(channel\) | - - ---- - -### Microsoft Teams Chat - -Trigger workflow from new messages in Microsoft Teams chats via Microsoft Graph subscriptions - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires microsoft teams credentials to access your account. | -| `triggerChatId` | string | Yes | The ID of the Teams chat to monitor | -| `includeAttachments` | boolean | No | Fetch hosted contents and upload to storage | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `message_id` | string | Message ID | -| `chat_id` | string | Chat ID | -| `from_name` | string | Sender display name | -| `text` | string | Message body \(HTML or text\) | -| `created_at` | string | Message timestamp | -| `attachments` | file[] | Uploaded attachments as files | - diff --git a/apps/docs/content/docs/en/triggers/monday.mdx b/apps/docs/content/docs/en/triggers/monday.mdx deleted file mode 100644 index 6bb725e499b..00000000000 --- a/apps/docs/content/docs/en/triggers/monday.mdx +++ /dev/null @@ -1,215 +0,0 @@ ---- -title: Monday -description: Available Monday triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Monday provides 9 triggers for automating workflows based on events. - -## Triggers - -### Monday Column Value Changed - -Trigger workflow when any column value changes on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `columnId` | string | The ID of the changed column | -| `columnType` | string | The type of the changed column | -| `columnTitle` | string | The title of the changed column | -| `value` | json | The new value of the column | -| `previousValue` | json | The previous value of the column | - - ---- - -### Monday Item Archived - -Trigger workflow when an item is archived on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | - - ---- - -### Monday Item Created - -Trigger workflow when a new item is created on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | - - ---- - -### Monday Item Deleted - -Trigger workflow when an item is deleted on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | - - ---- - -### Monday Item Moved to Group - -Trigger workflow when an item is moved to any group on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `destGroupId` | string | The destination group ID the item was moved to | -| `sourceGroupId` | string | The source group ID the item was moved from | - - ---- - -### Monday Item Name Changed - -Trigger workflow when an item name changes on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `columnId` | string | The ID of the changed column | -| `columnType` | string | The type of the changed column | -| `columnTitle` | string | The title of the changed column | -| `value` | json | The new value of the column | -| `previousValue` | json | The previous value of the column | - - ---- - -### Monday Status Changed - -Trigger workflow when a status column value changes on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `columnId` | string | The ID of the changed column | -| `columnType` | string | The type of the changed column | -| `columnTitle` | string | The title of the changed column | -| `value` | json | The new value of the column | -| `previousValue` | json | The previous value of the column | - - ---- - -### Monday Subitem Created - -Trigger workflow when a subitem is created on a Monday.com board - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `parentItemId` | string | The parent item ID | -| `parentItemBoardId` | string | The parent item board ID | - - ---- - -### Monday Update Posted - -Trigger workflow when an update or comment is posted on a Monday.com item - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `boardId` | string | The board ID where the event occurred | -| `itemId` | string | The item ID \(pulseId\) | -| `itemName` | string | The item name \(pulseName\) | -| `groupId` | string | The group ID of the item | -| `userId` | string | The ID of the user who triggered the event | -| `triggerTime` | string | ISO timestamp of when the event occurred | -| `triggerUuid` | string | Unique identifier for this event | -| `subscriptionId` | string | The webhook subscription ID | -| `updateId` | string | The ID of the created update | -| `body` | string | The HTML body of the update | -| `textBody` | string | The plain text body of the update | - diff --git a/apps/docs/content/docs/en/triggers/outlook.mdx b/apps/docs/content/docs/en/triggers/outlook.mdx deleted file mode 100644 index 1b304006d94..00000000000 --- a/apps/docs/content/docs/en/triggers/outlook.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Outlook -description: Available Outlook triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Outlook provides 1 trigger for automating workflows based on events. - -All triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications. - -## Triggers - -### Outlook Email Trigger - -Triggers when new emails are received in Outlook (requires Microsoft credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires outlook credentials to access your account. | -| `folderIds` | string | No | Choose which Outlook folders to monitor. Leave empty to monitor all emails. | -| `folderFilterBehavior` | string | Yes | Include only emails from selected folders, or exclude emails from selected folders | -| `markAsRead` | boolean | No | Automatically mark emails as read after processing | -| `includeAttachments` | boolean | No | Download and include email attachments in the trigger payload | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `email` | object | email output from the tool | -| ↳ `id` | string | Outlook message ID | -| ↳ `conversationId` | string | Outlook conversation ID | -| ↳ `subject` | string | Email subject line | -| ↳ `from` | string | Sender email address | -| ↳ `to` | string | Recipient email address | -| ↳ `cc` | string | CC recipients | -| ↳ `date` | string | Email date in ISO format | -| ↳ `bodyText` | string | Plain text email body | -| ↳ `bodyHtml` | string | HTML email body | -| ↳ `hasAttachments` | boolean | Whether email has attachments | -| ↳ `attachments` | file[] | Array of email attachments as files \(if includeAttachments is enabled\) | -| ↳ `isRead` | boolean | Whether email is read | -| ↳ `folderId` | string | Outlook folder ID where email is located | -| ↳ `messageId` | string | Message ID for threading | -| ↳ `threadId` | string | Thread ID for conversation threading | -| `timestamp` | string | Event timestamp | - diff --git a/apps/docs/content/docs/en/triggers/rss.mdx b/apps/docs/content/docs/en/triggers/rss.mdx index 93f86d35878..d04974d9770 100644 --- a/apps/docs/content/docs/en/triggers/rss.mdx +++ b/apps/docs/content/docs/en/triggers/rss.mdx @@ -1,60 +1,52 @@ --- title: RSS Feed +description: The RSS trigger runs a workflow when a new item is published to an RSS or Atom feed. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' -import { Image } from '@/components/ui/image' +import { BlockPreview } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The RSS Feed block monitors RSS and Atom feeds – when new items are published, your workflow triggers automatically. +The **RSS trigger** watches an RSS or Atom feed and runs a workflow when a new item is published. There's no account to connect — just a feed URL. -
- RSS Feed Block -
+ ## Configuration -1. **Add RSS Feed Block** - Drag the RSS Feed block to start your workflow -2. **Enter Feed URL** - Paste the URL of any RSS or Atom feed -3. **Deploy** - Deploy your workflow to activate polling +1. Add the RSS trigger as the workflow's entry point. +2. Paste any RSS or Atom feed URL. +3. Deploy the workflow to start polling. -Once deployed, the feed is checked every minute for new items. +Once deployed, Sim checks the feed every minute and runs the workflow for each new item. -## Output Fields +## Outputs -| Field | Type | Description | -|-------|------|-------------| -| `title` | string | Item title | -| `link` | string | Item link | -| `pubDate` | string | Publication date | -| `item` | object | Raw item with all fields | -| `feed` | object | Raw feed metadata | +| Output | What it is | +| --- | --- | +| `` | The item title | +| `` | The item link | +| `` | The publication date | +| `` | The raw item, with every field (`guid`, `author`, `content`, and more) | +| `` | The feed metadata (title, link, description) | -Access mapped fields directly (``) or use the raw objects for any field (``, ``). +Read a mapped field directly, or reach into the raw objects for anything else — ``, ``. ## Use Cases -- **Content monitoring** - Track blogs, news sites, or competitor updates -- **Podcast automation** - Trigger workflows when new episodes drop -- **Release tracking** - Monitor GitHub releases, changelogs, or product updates -- **Social aggregation** - Collect content from platforms that expose RSS feeds +- **Content monitoring** — blogs, news sites, or competitor updates +- **Release tracking** — GitHub releases, changelogs, or product updates +- **Podcast automation** — run a workflow when a new episode drops RSS triggers only fire for items published after you save the trigger. Existing feed items are not processed. - diff --git a/apps/docs/content/docs/en/triggers/salesforce.mdx b/apps/docs/content/docs/en/triggers/salesforce.mdx deleted file mode 100644 index a849dbb6e9f..00000000000 --- a/apps/docs/content/docs/en/triggers/salesforce.mdx +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Salesforce -description: Available Salesforce triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Salesforce provides 6 triggers for automating workflows based on events. - -## Triggers - -### Salesforce Case Status Changed - -Trigger workflow when a case status changes - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type \(Case\) | -| `recordId` | string | Case ID | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | object | record output from the tool | -| ↳ `Id` | string | Case ID | -| ↳ `Subject` | string | Case subject | -| ↳ `Status` | string | Current case status | -| ↳ `Priority` | string | Case priority | -| ↳ `CaseNumber` | string | Case number | -| ↳ `AccountId` | string | Related Account ID | -| ↳ `ContactId` | string | Related Contact ID | -| ↳ `OwnerId` | string | Case owner ID | -| `previousStatus` | string | Previous case status | -| `newStatus` | string | New case status | -| `payload` | json | Full webhook payload | - - ---- - -### Salesforce Opportunity Stage Changed - -Trigger workflow when an opportunity stage changes - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type \(Opportunity\) | -| `recordId` | string | Opportunity ID | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | object | record output from the tool | -| ↳ `Id` | string | Opportunity ID | -| ↳ `Name` | string | Opportunity name | -| ↳ `StageName` | string | Current stage name | -| ↳ `Amount` | string | Deal amount | -| ↳ `CloseDate` | string | Expected close date | -| ↳ `Probability` | string | Win probability | -| ↳ `AccountId` | string | Related Account ID \(standard Opportunity field\) | -| ↳ `OwnerId` | string | Opportunity owner ID | -| `previousStage` | string | Previous stage name | -| `newStage` | string | New stage name | -| `payload` | json | Full webhook payload | - - ---- - -### Salesforce Record Created - -Trigger workflow when a Salesforce record is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | -| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | -| `recordId` | string | ID of the affected record | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | object | record output from the tool | -| ↳ `Id` | string | Record ID | -| ↳ `Name` | string | Record name | -| ↳ `CreatedDate` | string | Record creation date | -| ↳ `LastModifiedDate` | string | Last modification date | -| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | -| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | -| `changedFields` | json | Fields that were changed \(for update events\) | -| `payload` | json | Full webhook payload | - - ---- - -### Salesforce Record Deleted - -Trigger workflow when a Salesforce record is deleted - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | -| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | -| `recordId` | string | ID of the affected record | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | object | record output from the tool | -| ↳ `Id` | string | Record ID | -| ↳ `Name` | string | Record name | -| ↳ `CreatedDate` | string | Record creation date | -| ↳ `LastModifiedDate` | string | Last modification date | -| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | -| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | -| `changedFields` | json | Fields that were changed \(for update events\) | -| `payload` | json | Full webhook payload | - - ---- - -### Salesforce Record Updated - -Trigger workflow when a Salesforce record is updated - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | -| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event \(e.g., created, updated, deleted\) | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type \(e.g., Account, Contact, Lead\) | -| `recordId` | string | ID of the affected record | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | object | record output from the tool | -| ↳ `Id` | string | Record ID | -| ↳ `Name` | string | Record name | -| ↳ `CreatedDate` | string | Record creation date | -| ↳ `LastModifiedDate` | string | Last modification date | -| ↳ `OwnerId` | string | Record owner ID \(standard field when sent in the Flow body\) | -| ↳ `SystemModstamp` | string | System modstamp from the record \(ISO 8601\) when included in the payload | -| `changedFields` | json | Fields that were changed \(for update events\) | -| `payload` | json | Full webhook payload | - - ---- - -### Salesforce Webhook (All Events) - -Trigger workflow on any Salesforce webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `webhookSecret` | string | Yes | Required. Use the same value in your Salesforce HTTP Callout as Bearer token or X-Sim-Webhook-Secret. | -| `objectType` | string | No | When set, the payload must include matching object type metadata \(for example objectType, sobjectType, or attributes.type\) or the event is rejected. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | The type of event | -| `simEventType` | string | Optional alias from the payload \(`simEventType`\). Empty when only `eventType` is sent. | -| `objectType` | string | Salesforce object type | -| `recordId` | string | ID of the affected record | -| `timestamp` | string | When the event occurred \(ISO 8601\) | -| `record` | json | Full record data | -| `payload` | json | Full webhook payload | - diff --git a/apps/docs/content/docs/en/triggers/schedule.mdx b/apps/docs/content/docs/en/triggers/schedule.mdx index 8c59882ceb2..0509200a6d6 100644 --- a/apps/docs/content/docs/en/triggers/schedule.mdx +++ b/apps/docs/content/docs/en/triggers/schedule.mdx @@ -1,88 +1,71 @@ --- title: Schedule +description: The Schedule trigger runs a workflow on a timer — a simple interval or a cron expression. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' +import { BlockPreview } from '@/components/workflow-preview' import { FAQ } from '@/components/ui/faq' -The Schedule block automatically triggers workflows on a recurring schedule at specified intervals or times. +The **Schedule trigger** runs a workflow on a timer, on its own with no input — on a simple interval or a cron expression. -
- Schedule Block -
+ -## Schedule Options +## Schedule -Configure when your workflow runs: +Pick how often it runs: - + -
    -
  • Every X Minutes: Run at minute intervals (1-1440)
  • -
  • Hourly: Run at a specific minute each hour
  • -
  • Daily: Run at a specific time each day
  • -
  • Weekly: Run on a specific day and time each week
  • -
  • Monthly: Run on a specific day and time each month
  • -
+ - **Every X minutes** — a minute interval (1–1440) + - **Hourly** — a set minute each hour + - **Daily** — a set time each day + - **Weekly** — a set day and time each week + - **Monthly** — a set day and time each month
-

Use cron expressions for advanced scheduling:

-
-
0 9 * * 1-5 - Every weekday at 9 AM
-
*/15 * * * * - Every 15 minutes
-
0 0 1 * * - First day of each month
-
+ For finer control, use a cron expression: + + - `0 9 * * 1-5` — weekdays at 9 AM + - `*/15 * * * *` — every 15 minutes + - `0 0 1 * *` — the first of each month + + Cron expressions and intervals are evaluated in the configured timezone, which defaults to UTC.
## Activation -Schedules are tied to workflow deployment: +A schedule is tied to [deployment](/deployment): -- **Deploy workflow** → Schedule becomes active and starts running -- **Undeploy workflow** → Schedule is removed -- **Redeploy workflow** → Schedule is recreated with current configuration +- **Deploy** — the schedule becomes active and starts running +- **Undeploy** — the schedule is removed +- **Redeploy** — the schedule is recreated from the current configuration -You must deploy your workflow for the schedule to start running. Configure the schedule block, then deploy from the toolbar. +A schedule only runs once the workflow is deployed. Configure the trigger, then deploy from the toolbar. -## Automatic Disabling - -Schedules automatically disable after **100 consecutive failures** to prevent runaway errors. When disabled: +## Automatic disabling -- A warning badge appears on the schedule block -- The schedule stops executing -- Click the badge to reactivate the schedule +A schedule disables itself after **100 consecutive failures**, to stop runaway errors. A warning badge appears on the block and it stops running; click the badge to reactivate it. The counter resets to zero on any successful run.
- Disabled Schedule + A disabled schedule
-Schedule blocks cannot receive incoming connections and serve as workflow entry points only. +A Schedule trigger is an entry point only — it can't receive incoming connections. - diff --git a/apps/docs/content/docs/en/triggers/sendblue.mdx b/apps/docs/content/docs/en/triggers/sendblue.mdx deleted file mode 100644 index 28d14ef6d6f..00000000000 --- a/apps/docs/content/docs/en/triggers/sendblue.mdx +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Sendblue -description: Available Sendblue triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Sendblue provides 2 triggers for automating workflows based on events. - -## Triggers - -### Sendblue Message Received - -Trigger when an inbound iMessage or SMS is received in Sendblue - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `account_email` | string | Email of the Sendblue account | -| `content` | string | Message text content | -| `media_url` | string | CDN link to attached media, if any | -| `is_outbound` | boolean | True for outbound messages, false for inbound | -| `status` | string | Message status \(e.g., RECEIVED, QUEUED, SENT, DELIVERED, ERROR\) | -| `error_code` | number | Error identifier, null if none | -| `error_message` | string | Descriptive error text, null if none | -| `error_reason` | string | Additional error context, null if none | -| `error_detail` | string | Detailed error information, null if none | -| `message_handle` | string | Sendblue message identifier \(use to deduplicate\) | -| `date_sent` | string | ISO 8601 creation timestamp | -| `date_updated` | string | ISO 8601 last-update timestamp | -| `from_number` | string | E.164 sender phone number | -| `number` | string | E.164 recipient/counterparty phone number | -| `to_number` | string | E.164 destination phone number | -| `was_downgraded` | boolean | True if the recipient lacks iMessage support | -| `plan` | string | Account plan type | -| `message_type` | string | Message category \(e.g., message, group\) | -| `group_id` | string | Group identifier, empty for non-group messages | -| `participants` | array | Participant phone numbers for group messages | -| `send_style` | string | Expressive style if applied | -| `opted_out` | boolean | True if the recipient has opted out | -| `sendblue_number` | string | Sendblue phone number used | -| `service` | string | Messaging service \(iMessage or SMS\) | -| `group_display_name` | string | Group chat name, null for non-group messages | -| `sender_email` | string | Email of the user who sent the message | -| `seat_id` | string | Seat UUID, null if absent | -| `raw` | string | Complete raw webhook payload from Sendblue as a JSON string | - - ---- - -### Sendblue Message Status Updated - -Trigger when an outbound message status changes (SENT, DELIVERED, ERROR) in Sendblue - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `account_email` | string | Email of the Sendblue account | -| `content` | string | Message text content | -| `media_url` | string | CDN link to attached media, if any | -| `is_outbound` | boolean | True for outbound messages, false for inbound | -| `status` | string | Message status \(e.g., RECEIVED, QUEUED, SENT, DELIVERED, ERROR\) | -| `error_code` | number | Error identifier, null if none | -| `error_message` | string | Descriptive error text, null if none | -| `error_reason` | string | Additional error context, null if none | -| `error_detail` | string | Detailed error information, null if none | -| `message_handle` | string | Sendblue message identifier \(use to deduplicate\) | -| `date_sent` | string | ISO 8601 creation timestamp | -| `date_updated` | string | ISO 8601 last-update timestamp | -| `from_number` | string | E.164 sender phone number | -| `number` | string | E.164 recipient/counterparty phone number | -| `to_number` | string | E.164 destination phone number | -| `was_downgraded` | boolean | True if the recipient lacks iMessage support | -| `plan` | string | Account plan type | -| `message_type` | string | Message category \(e.g., message, group\) | -| `group_id` | string | Group identifier, empty for non-group messages | -| `participants` | array | Participant phone numbers for group messages | -| `send_style` | string | Expressive style if applied | -| `opted_out` | boolean | True if the recipient has opted out | -| `sendblue_number` | string | Sendblue phone number used | -| `service` | string | Messaging service \(iMessage or SMS\) | -| `group_display_name` | string | Group chat name, null for non-group messages | -| `sender_email` | string | Email of the user who sent the message | -| `seat_id` | string | Seat UUID, null if absent | -| `raw` | string | Complete raw webhook payload from Sendblue as a JSON string | - diff --git a/apps/docs/content/docs/en/triggers/slack.mdx b/apps/docs/content/docs/en/triggers/slack.mdx deleted file mode 100644 index 2998aae7d1c..00000000000 --- a/apps/docs/content/docs/en/triggers/slack.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Slack -description: Available Slack triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Slack provides 1 trigger for automating workflows based on events. - -## Triggers - -### Slack Webhook - -Trigger workflow from Slack events like mentions, messages, and reactions - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `signingSecret` | string | Yes | The signing secret from your Slack app to validate request authenticity. | -| `botToken` | string | No | The bot token from your Slack app. Required for downloading files attached to messages. | -| `includeFiles` | boolean | No | Download and include file attachments from messages. Requires a bot token with files:read scope. | -| `setupWizard` | modal | No | Walk through manifest creation, app install, and pasting credentials. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | object | Slack event data | -| ↳ `event_type` | string | Type of Slack payload: an Events API event \(e.g., app_mention, message\), an interactivity type \(e.g., block_actions\), or "slash_command" for slash commands | -| ↳ `subtype` | string | Message subtype \(e.g., channel_join, channel_leave, bot_message, file_share\). Null for regular user messages | -| ↳ `channel` | string | Slack channel ID where the event occurred | -| ↳ `channel_name` | string | Human-readable channel name | -| ↳ `channel_type` | string | Type of channel \(e.g., channel, group, im, mpim\). Useful for distinguishing DMs from public channels | -| ↳ `user` | string | User ID who triggered the event | -| ↳ `user_name` | string | Username who triggered the event | -| ↳ `bot_id` | string | Bot ID if the message was sent by a bot. Null for human users | -| ↳ `text` | string | Message text content. For slash commands, the text after the command. For interactivity, the source message text \(falls back to the triggering action value\) | -| ↳ `timestamp` | string | Message timestamp from the triggering event | -| ↳ `thread_ts` | string | Parent thread timestamp \(if message is in a thread\) | -| ↳ `team_id` | string | Slack workspace/team ID | -| ↳ `event_id` | string | Unique event identifier | -| ↳ `reaction` | string | Emoji reaction name \(e.g., thumbsup\). Present for reaction_added/reaction_removed events | -| ↳ `item_user` | string | User ID of the original message author. Present for reaction_added/reaction_removed events | -| ↳ `command` | string | Slash command name including the leading slash \(e.g., /deploy\). Present for slash commands | -| ↳ `action_id` | string | action_id of the first interactive element triggered. Present for block_actions \(button/select clicks\) | -| ↳ `action_value` | string | Value carried by the first interactive element \(button value, selected option, date, etc.\). Present for block_actions | -| ↳ `actions` | json | Full array of interactive actions from the payload, preserving every element and its value. Present for block_actions | -| ↳ `response_url` | string | Temporary URL to post a response back to the originating message or command. Present for interactivity and slash commands | -| ↳ `trigger_id` | string | Short-lived trigger ID used to open a modal in response. Present for interactivity and slash commands | -| ↳ `callback_id` | string | Callback ID of the shortcut or view. Present for shortcuts and modal submissions | -| ↳ `api_app_id` | string | Slack app ID. Present for interactivity and slash commands | -| ↳ `message_ts` | string | Timestamp of the message the interaction originated from. Present for block_actions | -| ↳ `hasFiles` | boolean | Whether the message has file attachments | -| ↳ `files` | file[] | File attachments downloaded from the message \(if includeFiles is enabled and bot token is provided\) | - diff --git a/apps/docs/content/docs/en/triggers/start.mdx b/apps/docs/content/docs/en/triggers/start.mdx index 5ab88809ac1..fe3eabd92ab 100644 --- a/apps/docs/content/docs/en/triggers/start.mdx +++ b/apps/docs/content/docs/en/triggers/start.mdx @@ -1,79 +1,62 @@ --- title: Start +description: The Start block is the default trigger — it collects typed inputs and runs the workflow from the editor, an API call, or chat. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' -The Start block is the default trigger for workflows built in Sim. It collects structured inputs and fans out to the rest of your graph for editor tests, API deployments, and chat experiences. +The **Start block** is the default trigger for a workflow. It defines the inputs the workflow takes and runs it from three surfaces with the same shape: a manual run in the editor, an [API deployment](/deployment/api), and a [chat deployment](/deployment/chat).
- Start block with Input Format fields + Start block with Input Format fields
-The Start block sits in the start slot when you create a workflow. Keep it there when you want the same entry point to serve editor runs, deploy-to-API requests, and chat sessions. Swap it with Webhook or Schedule triggers when you only need event-driven runs. +Every workflow starts with a Start block in the trigger slot. Keep it when one entry point should serve editor, API, and chat runs. Swap in a [Webhook](/triggers/webhook) or [Schedule](/triggers/schedule) trigger when the workflow should only run on an event or a timer. -## Fields exposed by Start +## Input Format -The Start block emits different data depending on the run surface: +Define the fields the workflow accepts. Each field has a name and a type — `string`, `number`, `boolean`, `object`, `array`, or `files` — and becomes available downstream as ``. A `customerId` field reads as ``. -- **Input Format fields** — Every field you add becomes available as <start.fieldName>. For example, a `customerId` field shows up as <start.customerId> in downstream blocks and templates. -- **Chat-only fields** — When the workflow runs from the chat side panel or a deployed chat experience, Sim also provides <start.input> (latest user message), <start.conversationId> (active session id), and <start.files> (chat attachments). +- Give a field a **default value** to prefill the manual-run form. Defaults are ignored on deployed runs. +- **File** fields accept uploads from both chat and API callers. +- Reorder fields to control how they appear in the editor form. -Keep Input Format fields scoped to the names you expect to reference later—those values are the only structured fields shared across editor, API, and chat runs. +## Outputs -## Configure the Input Format +The fields you define, plus conversation context when the workflow runs from chat: -Use the Input Format sub-block to define the schema that applies across run modes: +| Output | What it is | +| --- | --- | +| `` | Each Input Format field, by name | +| `` | The latest user message (chat only) | +| `` | The active session id (chat only) | +| `` | Chat attachments (chat only) | -1. Add a field for each value you want to collect. -2. Choose a type (`string`, `number`, `boolean`, `object`, `array`, or `files`). File fields accept uploads from chat and API callers. -3. Provide default values when you want the manual run modal to populate test data automatically. These defaults are ignored for deployed runs. -4. Reorder fields to control how they appear in the editor form. +## Per entry point -Reference structured values downstream with expressions such as <start.customerId> depending on the block you connect. - -## How it behaves per entry point - - + - When you click Run in the editor, the Start block renders the Input Format as a form. Default values make it easy to retest without retyping data. Submitting the form triggers the workflow immediately and the values become available on <start.fieldName> (for example <start.sampleField>). - - File fields in the form upload directly into the corresponding{' '} - <start.fieldName>; use those values to feed downstream - tools or storage steps. + **Run** renders the Input Format as a form, prefilled with any default values, so you can retest without retyping. Submitting runs the workflow, and the values land on ``. File fields upload straight into ``. - Deploying to API turns the Input Format into a JSON contract for clients. Each field becomes part of the request body, and Sim coerces primitive types on ingestion. File fields expect objects that reference uploaded files; use the file upload endpoint before invoking the workflow. - - API callers can include additional optional properties. They are preserved - inside <start.fieldName> outputs so you can experiment - without redeploying immediately. + The Input Format becomes the JSON request body. Each field is part of the body, and Sim coerces primitive types on the way in. File fields expect objects that reference uploaded files, so upload first, then invoke the workflow. - In chat deployments the Start block binds to the active conversation. The latest message fills <start.input>, the session identifier is available at <start.conversationId>, and user attachments appear on <start.files>, alongside any Input Format fields scoped as <start.fieldName>. - - If you launch chat with additional structured context (for example from an embed), it merges into the corresponding <start.fieldName> outputs, keeping downstream blocks consistent with API and manual runs. + The Start block binds to the active conversation: the latest message fills ``, the session id is ``, and attachments appear on ``, alongside any Input Format fields. Extra structured context passed in at launch merges into the matching `` outputs. -## Referencing Start data downstream +## Multiple triggers -- Connect <start.fieldName> directly into agents, tools, or functions that expect structured payloads. -- Use templating syntax like <start.sampleField> or <start.files[0].url> (chat only) in prompt fields. -- Keep <start.conversationId> handy when you need to group outputs, update conversation history, or call back into the chat API. +A workflow can have more than one trigger. When you click **Run** in the editor, Sim runs the highest-priority one: the **Start** trigger first, then a [Schedule](/triggers/schedule), then external triggers (webhooks and integrations). So a workflow with both a Start and a Webhook runs from Start when you click Run. Running an external trigger by hand instead generates a mock payload from its expected shape, so downstream blocks can resolve their references while you test. -## Best practices +## Best Practices -- Treat the Start block as the single entry point when you want to support both API and chat callers. -- Prefer named Input Format fields over parsing raw JSON in downstream nodes; type coercion happens automatically. -- Add validation or routing immediately after Start if certain fields are required for your workflow to succeed. \ No newline at end of file +- **Use Start as the single entry point** when one workflow serves both API and chat callers. +- **Prefer named fields over raw JSON.** Typed Input Format fields are coerced automatically and read by name downstream. +- **Validate early.** Add a [Condition](/blocks/condition) right after Start when certain fields are required for the run to succeed. diff --git a/apps/docs/content/docs/en/triggers/stripe.mdx b/apps/docs/content/docs/en/triggers/stripe.mdx deleted file mode 100644 index 4d3763b81fc..00000000000 --- a/apps/docs/content/docs/en/triggers/stripe.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Stripe -description: Available Stripe triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Stripe provides 1 trigger for automating workflows based on events. - -## Triggers - -### Stripe Webhook - -Triggers when Stripe events occur (payments, subscriptions, invoices, etc.) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `eventTypes` | string | No | Select specific Stripe events to filter. Leave empty to receive all events from Stripe. | -| `webhookSecret` | string | No | Your webhook signing secret from Stripe Dashboard. Used to verify webhook authenticity. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `id` | string | Unique identifier for the event | -| `type` | string | Event type \(e.g., payment_intent.succeeded, customer.created, invoice.paid\) | -| `object` | string | Always "event" | -| `api_version` | string | Stripe API version used to render the event | -| `created` | number | Unix timestamp when the event was created | -| `data` | json | Event data containing the affected Stripe object. Structure varies by event type - access via data.object for the resource \(PaymentIntent, Customer, Invoice, etc.\) | -| `livemode` | boolean | Whether this event occurred in live mode \(true\) or test mode \(false\) | -| `pending_webhooks` | number | Number of webhooks yet to be delivered for this event | -| `request` | json | Information about the API request that triggered this event \(id, idempotency_key\) | - diff --git a/apps/docs/content/docs/en/triggers/table.mdx b/apps/docs/content/docs/en/triggers/table.mdx index beb0826cabb..115fe08acb2 100644 --- a/apps/docs/content/docs/en/triggers/table.mdx +++ b/apps/docs/content/docs/en/triggers/table.mdx @@ -1,44 +1,32 @@ --- title: Table -description: Available Table triggers for automating workflows +description: The Table trigger runs a workflow when a row is inserted or updated in a Sim table. +pageType: reference --- -import { BlockInfoCard } from "@/components/ui/block-info-card" +import { BlockPreview } from '@/components/workflow-preview' - +The **Table trigger** runs a workflow when a row is inserted or updated in a [Sim table](/tables). Use it to react to data changes — enrich a row when it's added, or send a follow-up when a status column flips. -Table provides 1 trigger for automating workflows based on events. + -## Triggers +## Configuration -### Table Trigger +- **Table** — the table to watch. +- **Event type** — what to fire on: a row insert, a row update, or either. +- **Watch columns** — fire only when these columns change. Leave empty to fire on any update. +- **Include headers** — return each row as a key-value object keyed by column name. -Triggers when rows are inserted or updated in a table - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `tableSelector` | table-selector | Yes | The table to monitor. | -| `manualTableId` | string | Yes | The table to monitor. | -| `eventType` | string | Yes | The type of event to trigger on. | -| `watchColumns` | string | No | Only fire when these columns change. Leave empty to fire on any update. | -| `includeHeaders` | boolean | No | When enabled, each row is returned as a key-value object mapped to column names. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `row` | json | Row data mapped to column names \(when header mapping is enabled\) | -| `rawRow` | json | Raw row data object | -| `previousRow` | json | Previous row data before the update \(null for inserts\) | -| `changedColumns` | json | List of column names that changed \(empty for inserts\) | -| `rowId` | string | The unique row ID | -| `headers` | json | Column names from the table schema | -| `tableId` | string | The table ID | -| `tableName` | string | The table name | -| `timestamp` | string | Event timestamp in ISO format | +## Outputs +| Output | What it is | +| --- | --- | +| `` | The row mapped to column names (when Include headers is on) | +| `` | The raw row object | +| `` | The row before the update (`null` for inserts) | +| `` | The columns that changed (empty for inserts) | +| `` | The row's unique id | +| `` | The table's column names | +| `` | The table id | +| `` | The table name | +| `` | The event time, in ISO format | diff --git a/apps/docs/content/docs/en/triggers/telegram.mdx b/apps/docs/content/docs/en/triggers/telegram.mdx deleted file mode 100644 index ab945b8a821..00000000000 --- a/apps/docs/content/docs/en/triggers/telegram.mdx +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Telegram -description: Available Telegram triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Telegram provides 1 trigger for automating workflows based on events. - -## Triggers - -### Telegram Webhook - -Trigger workflow from Telegram bot messages and events - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `botToken` | string | Yes | Your Telegram Bot Token from BotFather | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `message` | object | Telegram message data | -| ↳ `id` | number | Telegram message ID | -| ↳ `text` | string | Message text content \(if present\) | -| ↳ `date` | number | Date the message was sent \(Unix timestamp\) | -| ↳ `messageType` | string | Detected content type: text, photo, document, audio, video, voice, sticker, location, contact, poll | -| ↳ `raw` | object | Raw Telegram message object | -| ↳ `message_id` | number | Original Telegram message_id | -| ↳ `date` | number | Original Telegram message date \(Unix timestamp\) | -| ↳ `text` | string | Original Telegram text \(if present\) | -| ↳ `caption` | string | Original Telegram caption \(if present\) | -| ↳ `chat` | object | Chat information | -| ↳ `id` | number | Chat identifier | -| ↳ `username` | string | Chat username \(if available\) | -| ↳ `first_name` | string | First name \(for private chats\) | -| ↳ `last_name` | string | Last name \(for private chats\) | -| ↳ `title` | string | Chat title \(for groups/channels\) | -| ↳ `from` | object | Sender information | -| ↳ `id` | number | Sender user ID | -| ↳ `is_bot` | boolean | Whether the sender is a bot | -| ↳ `first_name` | string | Sender first name | -| ↳ `last_name` | string | Sender last name | -| ↳ `username` | string | Sender username | -| ↳ `language_code` | string | Sender language code \(if available\) | -| ↳ `reply_to_message` | object | Original message being replied to | -| ↳ `entities` | array | Message entities \(mentions, hashtags, URLs, etc.\) | -| `sender` | object | Sender information | -| ↳ `id` | number | Sender user ID | -| ↳ `username` | string | Sender username \(if available\) | -| ↳ `firstName` | string | Sender first name | -| ↳ `lastName` | string | Sender last name | -| ↳ `languageCode` | string | Sender language code \(if available\) | -| ↳ `isBot` | boolean | Whether the sender is a bot | -| `updateId` | number | Update ID for this webhook delivery | -| `updateType` | string | Type of update: message, edited_message, channel_post, edited_channel_post, unknown | - diff --git a/apps/docs/content/docs/en/triggers/twilio_voice.mdx b/apps/docs/content/docs/en/triggers/twilio_voice.mdx deleted file mode 100644 index 9522006aaa1..00000000000 --- a/apps/docs/content/docs/en/triggers/twilio_voice.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Twilio Voice -description: Available Twilio Voice triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Twilio Voice provides 1 trigger for automating workflows based on events. - -## Triggers - -### Twilio Voice Webhook - -Trigger workflow when phone calls are received via Twilio Voice - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `accountSid` | string | Yes | Your Twilio Account SID from the Twilio Console | -| `authToken` | string | Yes | Your Twilio Auth Token for webhook signature verification | -| `twimlResponse` | string | No | TwiML instructions to return immediately to Twilio. Use square brackets instead of angle brackets \(e.g., \[Response\] instead of <Response>\). This controls what happens when the call comes in \(e.g., play a message, record, gather input\). Your workflow will execute in the background. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `callSid` | string | Unique identifier for this call | -| `accountSid` | string | Twilio Account SID | -| `from` | string | Caller's phone number \(E.164 format\) | -| `to` | string | Recipient phone number \(your Twilio number\) | -| `callStatus` | string | Status of the call \(queued, ringing, in-progress, completed, etc.\) | -| `direction` | string | Call direction: inbound or outbound | -| `apiVersion` | string | Twilio API version | -| `callerName` | string | Caller ID name if available | -| `forwardedFrom` | string | Phone number that forwarded this call | -| `digits` | string | DTMF digits entered by caller \(from <Gather>\) | -| `speechResult` | string | Speech recognition result \(if using <Gather> with speech\) | -| `recordingUrl` | string | URL of call recording if available | -| `recordingSid` | string | Recording SID if available | -| `called` | string | Phone number that was called \(same as "to"\) | -| `caller` | string | Phone number of the caller \(same as "from"\) | -| `toCity` | string | City of the called number | -| `toState` | string | State/province of the called number | -| `toZip` | string | Zip/postal code of the called number | -| `toCountry` | string | Country of the called number | -| `fromCity` | string | City of the caller | -| `fromState` | string | State/province of the caller | -| `fromZip` | string | Zip/postal code of the caller | -| `fromCountry` | string | Country of the caller | -| `calledCity` | string | City of the called number \(same as toCity\) | -| `calledState` | string | State of the called number \(same as toState\) | -| `calledZip` | string | Zip code of the called number \(same as toZip\) | -| `calledCountry` | string | Country of the called number \(same as toCountry\) | -| `callerCity` | string | City of the caller \(same as fromCity\) | -| `callerState` | string | State of the caller \(same as fromState\) | -| `callerZip` | string | Zip code of the caller \(same as fromZip\) | -| `callerCountry` | string | Country of the caller \(same as fromCountry\) | -| `callToken` | string | Twilio call token for authentication | -| `raw` | string | Complete raw webhook payload from Twilio as JSON string | - diff --git a/apps/docs/content/docs/en/triggers/typeform.mdx b/apps/docs/content/docs/en/triggers/typeform.mdx deleted file mode 100644 index e6fdae33b00..00000000000 --- a/apps/docs/content/docs/en/triggers/typeform.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Typeform -description: Available Typeform triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Typeform provides 1 trigger for automating workflows based on events. - -## Triggers - -### Typeform Webhook - -Trigger workflow when a Typeform submission is received - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `formId` | string | Yes | The unique identifier for your Typeform. Find it in the form URL or form settings. | -| `apiKey` | string | Yes | Required to automatically register the webhook with Typeform. Get yours at https://admin.typeform.com/account#/section/tokens | -| `secret` | string | No | A secret string used to verify webhook authenticity. Highly recommended for security. Generate a secure random string \(min 20 characters recommended\). | -| `includeDefinition` | boolean | No | Include the complete form structure \(questions, fields, endings\) in your workflow variables. Note: Typeform always sends this data, but enabling this makes it accessible in your workflow. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event_id` | string | Unique identifier for this webhook event | -| `event_type` | string | Type of event \(always "form_response" for form submissions\) | -| `form_id` | string | Typeform form identifier | -| `token` | string | Unique response/submission identifier | -| `submitted_at` | string | ISO timestamp when the form was submitted | -| `landed_at` | string | ISO timestamp when the user first landed on the form | -| `calculated` | object | Calculated values from the form | -| ↳ `score` | number | Calculated score value | -| `variables` | array | Array of dynamic variables | -| ↳ `key` | string | Variable key | -| ↳ `number` | number | Numeric value \(if type is number\) | -| ↳ `text` | string | Text value \(if type is text\) | -| `hidden` | object | Hidden fields passed to the form \(e.g., UTM parameters\) | -| `answers` | array | Array of respondent answers \(only includes answered questions\) | -| ↳ `text` | string | Text answer value | -| ↳ `email` | string | Email answer value | -| ↳ `number` | number | Number answer value | -| ↳ `boolean` | boolean | Boolean answer value | -| ↳ `date` | string | Date answer value \(ISO format\) | -| ↳ `url` | string | URL answer value | -| ↳ `file_url` | string | File URL answer value | -| ↳ `choice` | object | Single choice answer | -| ↳ `id` | string | Choice ID | -| ↳ `ref` | string | Choice reference | -| ↳ `label` | string | Choice label | -| ↳ `choices` | object | Multiple choices answer | -| ↳ `ids` | array | Array of choice IDs | -| ↳ `refs` | array | Array of choice refs | -| ↳ `labels` | array | Array of choice labels | -| ↳ `field` | object | Field reference | -| ↳ `id` | string | Field ID | -| ↳ `ref` | string | Field reference | -| `definition` | object | Form definition \(only included when "Include Form Definition" is enabled\) | -| ↳ `id` | string | Form ID | -| ↳ `title` | string | Form title | -| ↳ `fields` | array | Array of form fields | -| ↳ `id` | string | Field ID | -| ↳ `ref` | string | Field reference | -| ↳ `title` | string | Field title | -| ↳ `endings` | array | Array of form endings | -| `ending` | object | Ending screen information | -| ↳ `id` | string | Ending screen ID | -| ↳ `ref` | string | Ending screen reference | -| `raw` | object | Complete original webhook payload from Typeform | - diff --git a/apps/docs/content/docs/en/triggers/vercel.mdx b/apps/docs/content/docs/en/triggers/vercel.mdx deleted file mode 100644 index bf96dcadbeb..00000000000 --- a/apps/docs/content/docs/en/triggers/vercel.mdx +++ /dev/null @@ -1,356 +0,0 @@ ---- -title: Vercel -description: Available Vercel triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Vercel provides 8 triggers for automating workflows based on events. - -## Triggers - -### Vercel Deployment Canceled - -Trigger workflow when a deployment is canceled - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | -| `target` | string | Deployment target \(production, staging, or preview\) | -| `plan` | string | Account plan type | -| `domain` | object | domain output from the tool | -| ↳ `name` | string | Domain name | -| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | - - ---- - -### Vercel Deployment Created - -Trigger workflow when a new deployment is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | -| `target` | string | Deployment target \(production, staging, or preview\) | -| `plan` | string | Account plan type | -| `domain` | object | domain output from the tool | -| ↳ `name` | string | Domain name | -| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | - - ---- - -### Vercel Deployment Error - -Trigger workflow when a deployment fails - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | -| `target` | string | Deployment target \(production, staging, or preview\) | -| `plan` | string | Account plan type | -| `domain` | object | domain output from the tool | -| ↳ `name` | string | Domain name | -| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | - - ---- - -### Vercel Deployment Ready - -Trigger workflow when a deployment is ready to serve traffic - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | -| `target` | string | Deployment target \(production, staging, or preview\) | -| `plan` | string | Account plan type | -| `domain` | object | domain output from the tool | -| ↳ `name` | string | Domain name | -| ↳ `delegated` | boolean | Whether the domain was delegated/shared when present on the payload | - - ---- - -### Vercel Domain Created - -Trigger workflow when a domain is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `domain` | object | domain output from the tool | -| ↳ `name` | string | Domain name | -| ↳ `delegated` | boolean | Whether the domain was delegated/shared \(domain.created\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | - - ---- - -### Vercel Project Created - -Trigger workflow when a new project is created - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | - - ---- - -### Vercel Project Removed - -Trigger workflow when a project is removed - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `payload` | json | Raw event payload from Vercel | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `project` | object | project output from the tool | -| ↳ `id` | string | Project ID | -| ↳ `name` | string | Project name | -| `team` | object | team output from the tool | -| ↳ `id` | string | Team ID | -| `user` | object | user output from the tool | -| ↳ `id` | string | User ID | - - ---- - -### Vercel Webhook (Common Events) - -Trigger on a curated set of common Vercel events (deployments, projects, domains, edge config). Pick a specific trigger to listen to one event type only. - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `apiKey` | string | Yes | Required to create the webhook in Vercel. | -| `teamId` | string | No | Scope webhook to a specific team | -| `filterProjectIds` | string | No | Limit webhook to specific projects | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., deployment.created\) | -| `id` | string | Unique webhook delivery ID \(string\) | -| `createdAt` | number | Event timestamp in milliseconds | -| `region` | string | Region where the event occurred | -| `links` | object | links output from the tool | -| ↳ `deployment` | string | Vercel Dashboard URL for the deployment | -| ↳ `project` | string | Vercel Dashboard URL for the project | -| `regions` | json | Regions associated with the deployment \(array\), when provided by Vercel | -| `deployment` | object | deployment output from the tool | -| ↳ `id` | string | Deployment ID | -| ↳ `url` | string | Deployment URL | -| ↳ `name` | string | Deployment name | -| ↳ `meta` | json | Deployment metadata map \(e.g. Git metadata\), per Vercel Webhooks API | -| `payload` | json | Full event payload | - diff --git a/apps/docs/content/docs/en/triggers/webflow.mdx b/apps/docs/content/docs/en/triggers/webflow.mdx deleted file mode 100644 index 2db6961641e..00000000000 --- a/apps/docs/content/docs/en/triggers/webflow.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Webflow -description: Available Webflow triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Webflow provides 4 triggers for automating workflows based on events. - -## Triggers - -### Collection Item Changed - -Trigger workflow when an item is updated in a Webflow CMS collection (requires Webflow credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | -| `triggerSiteId` | string | Yes | The Webflow site to monitor | -| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `siteId` | string | The site ID where the event occurred | -| `collectionId` | string | The collection ID where the item was changed | -| `payload` | object | payload output from the tool | -| ↳ `id` | string | The ID of the changed item | -| ↳ `cmsLocaleId` | string | CMS locale ID | -| ↳ `lastPublished` | string | Last published timestamp | -| ↳ `lastUpdated` | string | Last updated timestamp | -| ↳ `createdOn` | string | Timestamp when the item was created | -| ↳ `isArchived` | boolean | Whether the item is archived | -| ↳ `isDraft` | boolean | Whether the item is a draft | -| ↳ `fieldData` | object | The updated field data of the item | - - ---- - -### Collection Item Created - -Trigger workflow when a new item is created in a Webflow CMS collection (requires Webflow credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | -| `triggerSiteId` | string | Yes | The Webflow site to monitor | -| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `siteId` | string | The site ID where the event occurred | -| `collectionId` | string | The collection ID where the item was created | -| `payload` | object | payload output from the tool | -| ↳ `id` | string | The ID of the created item | -| ↳ `cmsLocaleId` | string | CMS locale ID | -| ↳ `lastPublished` | string | Last published timestamp | -| ↳ `lastUpdated` | string | Last updated timestamp | -| ↳ `createdOn` | string | Timestamp when the item was created | -| ↳ `isArchived` | boolean | Whether the item is archived | -| ↳ `isDraft` | boolean | Whether the item is a draft | -| ↳ `fieldData` | object | The field data of the item | - - ---- - -### Collection Item Deleted - -Trigger workflow when an item is deleted from a Webflow CMS collection (requires Webflow credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | -| `triggerSiteId` | string | Yes | The Webflow site to monitor | -| `triggerCollectionId` | string | No | Optionally filter to monitor only a specific collection | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `siteId` | string | The site ID where the event occurred | -| `collectionId` | string | The collection ID where the item was deleted | -| `payload` | object | payload output from the tool | -| ↳ `id` | string | The ID of the deleted item | -| ↳ `deletedOn` | string | Timestamp when the item was deleted | - - ---- - -### Form Submission - -Trigger workflow when a form is submitted on a Webflow site (requires Webflow credentials) - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `triggerCredentials` | string | Yes | This trigger requires webflow credentials to access your account. | -| `triggerSiteId` | string | Yes | The Webflow site to monitor | -| `formName` | string | No | The name of the specific form to monitor \(optional - leave empty for all forms\) | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `siteId` | string | The site ID where the form was submitted | -| `formId` | string | The form ID | -| `name` | string | The name of the form | -| `id` | string | The unique ID of the form submission | -| `submittedAt` | string | Timestamp when the form was submitted | -| `data` | object | The form submission field data \(keys are field names, values are submitted data\) | -| `schema` | array | Form schema describing each field | -| ↳ `fieldName` | string | Name of the form field | -| ↳ `fieldType` | string | Type of input \(e.g., FormTextInput, FormEmail\) | -| ↳ `fieldElementId` | string | Unique identifier for the form element \(UUID\) | -| `formElementId` | string | The form element ID | - diff --git a/apps/docs/content/docs/en/triggers/webhook.mdx b/apps/docs/content/docs/en/triggers/webhook.mdx index 33d3a6dd952..d3dce922890 100644 --- a/apps/docs/content/docs/en/triggers/webhook.mdx +++ b/apps/docs/content/docs/en/triggers/webhook.mdx @@ -1,160 +1,83 @@ --- -title: Webhooks +title: Webhook +description: The Webhook trigger runs a workflow on any inbound HTTP request to a URL Sim generates. +pageType: reference --- import { Callout } from 'fumadocs-ui/components/callout' import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' +import { BlockPreview } from '@/components/workflow-preview' import { Video } from '@/components/ui/video' import { FAQ } from '@/components/ui/faq' -Webhooks allow external services to trigger workflow runs by sending HTTP requests to your workflow. Sim supports two approaches for webhook-based triggers. +The **Webhook trigger** runs a workflow whenever an inbound HTTP request reaches a URL Sim generates for it. Use it to start a workflow from any external service or custom app that can send an HTTP request — when no dedicated [integration trigger](/workflows#triggers) exists. -## Generic Webhook Trigger + -The Generic Webhook block creates a flexible endpoint that can receive any payload and trigger your workflow: +## How it works -
- Generic Webhook Configuration -
- -### How It Works - -1. **Add Generic Webhook Block** - Drag the Generic Webhook block to start your workflow -2. **Configure Payload** - Set up the expected payload structure (optional) -3. **Get Webhook URL** - Copy the automatically generated unique endpoint -4. **External Integration** - Configure your external service to send POST requests to this URL -5. **Workflow Run** - Every request to the webhook URL triggers the workflow - -### Features - -- **Flexible Payload**: Accepts any JSON payload structure -- **Automatic Parsing**: Webhook data is automatically parsed and available to subsequent blocks -- **Authentication**: Optional bearer token or custom header authentication -- **Rate Limiting**: Built-in protection against abuse -- **Deduplication**: Prevents duplicate runs from repeated requests - - -The Generic Webhook trigger fires every time the webhook URL receives a request, making it perfect for real-time integrations. - - -## Trigger Mode for Service Blocks - -Alternatively, you can use specific service blocks (like Slack, GitHub, etc.) in "trigger mode" to create more specialized webhook endpoints: +1. Add the Webhook trigger as the workflow's entry point. +2. Copy the unique webhook URL Sim generates. +3. Point your external service at it with a `POST`. +4. Every request to the URL runs the workflow, with the request payload available downstream. -
-
+## Configuration -### Setting Up Trigger Mode +### Input Format -1. **Add Service Block** - Choose a service block (e.g., Slack, GitHub, Airtable) -2. **Enable Trigger Mode** - Toggle "Use as Trigger" in the block settings -3. **Configure Service** - Set up authentication and event filters specific to that service -4. **Webhook Registration** - The service automatically registers the webhook with the external platform -5. **Event-Based Runs** - Workflow triggers only for specific events from that service +Optionally define the JSON shape you expect. The fields are documented on the block and read downstream by name. Use a `file[]` field for uploads. -### When to Use Each Approach +### Authentication -**Use Generic Webhook when:** -- Integrating with custom applications or services -- You need maximum flexibility in payload structure -- Working with services that don't have dedicated blocks -- Building internal integrations +Turn on **Require Authentication** and set a token. Callers send it as a Bearer token in the `Authorization` header, or you name a custom header (like `X-Secret-Key`) and the token is matched against that instead. -**Use Trigger Mode when:** -- Working with supported services (Slack, GitHub, etc.) -- You want service-specific event filtering -- You need automatic webhook registration -- You want structured data handling for that service +### Response -## Supported Services for Trigger Mode +By default the endpoint acknowledges receipt. Switch to a custom response to return your own status code and JSON body to the caller. -**Development & Project Management** -- GitHub - Issues, PRs, pushes, releases, workflow runs -- Jira - Issue events, worklogs -- Linear - Issues, comments, projects, cycles, labels +## Outputs -**Communication** -- Slack - Messages, mentions, reactions -- Microsoft Teams - Chat messages, channel notifications -- Telegram - Bot messages, commands -- WhatsApp - Messaging events +The request is parsed and made available to the rest of the workflow — the body's fields by name (a `userId` in the body reads as ``), plus the request headers and query parameters. Common fields like `event`, `id`, and `data` are pulled out of the payload when present. -**Email** -- Gmail - New emails (polling), label changes -- Outlook - New emails (polling), folder events +## Behavior -**CRM & Sales** -- HubSpot - Contacts, companies, deals, tickets, conversations -- Stripe - Payments, subscriptions, customers +- **Deduplication** — idempotency checks prevent duplicate runs from repeated identical requests. +- **Rate limiting** — built-in protection against abuse. +- **Deploy required** — the URL only fires once the workflow is deployed; otherwise it returns not-found. +- **No auto-disable** — unlike polling triggers (RSS, Gmail, IMAP), a push webhook processes each request independently and doesn't disable itself after failed runs. -**Forms & Surveys** -- Typeform - Form submissions -- Google Forms - Form responses -- Webflow - Collection items, form submissions - -**Other** -- Airtable - Record changes -- Twilio Voice - Incoming calls, call status - -## Security and Best Practices - -### Authentication Options - -- **Bearer Tokens**: Include `Authorization: Bearer ` header -- **Custom Headers**: Define custom authentication headers - -### Payload Handling - -- **Validation**: Validate incoming payloads to prevent malformed data -- **Size Limits**: Webhooks have payload size limits for security -- **Error Handling**: Configure error responses for invalid requests + +Validate and sanitize incoming webhook data before you use it downstream. + -### Testing Webhooks +## Test it -1. Use tools like Postman or curl to test your webhook endpoints -2. Check workflow run logs for debugging -3. Verify payload structure matches your expectations -4. Test authentication and error scenarios +Send a request to the webhook URL with `curl` (or Postman) and watch the run appear in [Logs](/logs-debugging): - -Always validate and sanitize incoming webhook data before processing it in your workflows. - +```bash +curl -X POST "" \ + -H "Content-Type: application/json" \ + -d '{"event": "test", "userId": "123"}' +``` -## Common Use Cases +Open the run to confirm the payload landed the way downstream blocks expect — that `` resolves, and that authentication rejects a request without the token if you turned it on. -### Real-time Notifications -- Slack messages triggering automated responses -- Email notifications for critical events +## Service triggers -### CI/CD Integration -- GitHub pushes triggering deployment workflows -- Build status updates -- Automated testing pipelines +Many integrations can act as triggers too: toggle **Use as Trigger** on a service block (Slack, GitHub, Stripe, and more) to register a service-specific webhook with event filtering and structured data — no generic endpoint to wire up. -### Data Synchronization -- Airtable changes updating other systems -- Form submissions triggering follow-up actions -- E-commerce order processing +
+
-### Customer Support -- Support ticket creation workflows -- Automated escalation processes -- Multi-channel communication routing +See [Triggers](/workflows#triggers) for every service that supports this. diff --git a/apps/docs/content/docs/en/triggers/whatsapp.mdx b/apps/docs/content/docs/en/triggers/whatsapp.mdx deleted file mode 100644 index e6a1122a244..00000000000 --- a/apps/docs/content/docs/en/triggers/whatsapp.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: WhatsApp -description: Available WhatsApp triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -WhatsApp provides 1 trigger for automating workflows based on events. - -## Triggers - -### WhatsApp Webhook - -Trigger workflow from WhatsApp incoming messages and message status webhooks - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `verificationToken` | string | Yes | Enter any secure token here. You | -| `appSecret` | string | Yes | Required for WhatsApp POST signature verification. Sim uses it to validate the X-Hub-Signature-256 header on every webhook delivery. | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `eventType` | string | Webhook classification such as incoming_message, message_status, or mixed | -| `messageId` | string | First WhatsApp message identifier \(wamid\) found in the webhook batch | -| `from` | string | Sender phone number from the first incoming message in the batch | -| `recipientId` | string | Recipient phone number from the first status update in the batch | -| `phoneNumberId` | string | Business phone number ID from the first message or status item in the batch | -| `displayPhoneNumber` | string | Business display phone number from the first message or status item in the batch | -| `text` | string | Text body from the first incoming text message in the batch | -| `timestamp` | string | Timestamp from the first message or status item in the batch | -| `messageType` | string | Type of the first incoming message in the batch \(text, image, system, etc.\) | -| `status` | string | First outgoing message status in the batch, such as sent, delivered, read, or failed | -| `contact` | json | First sender contact in the batch \(wa_id, profile.name\) | -| `webhookContacts` | json | All sender contact profiles from the webhook batch | -| `messages` | json | All incoming message objects from the webhook batch, flattened across entries/changes | -| `statuses` | json | All message status objects from the webhook batch, flattened across entries/changes | -| `conversation` | json | Conversation metadata from the first status update in the batch \(id, expiration_timestamp, origin.type\) | -| `pricing` | json | Pricing metadata from the first status update in the batch \(billable, pricing_model, category\) | -| `raw` | json | Complete structured webhook payload from WhatsApp | - diff --git a/apps/docs/content/docs/en/triggers/zoom.mdx b/apps/docs/content/docs/en/triggers/zoom.mdx deleted file mode 100644 index 64175a96c34..00000000000 --- a/apps/docs/content/docs/en/triggers/zoom.mdx +++ /dev/null @@ -1,149 +0,0 @@ ---- -title: Zoom -description: Available Zoom triggers for automating workflows ---- - -import { BlockInfoCard } from "@/components/ui/block-info-card" - - - -Zoom provides 6 triggers for automating workflows based on events. - -## Triggers - -### Zoom Meeting Ended - -Trigger workflow when a Zoom meeting ends - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(e.g., meeting.started\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | object | payload output from the tool | -| ↳ `account_id` | string | Zoom account ID | -| ↳ `object` | object | Meeting details \(shape aligns with Zoom Meetings webhook object fields\) | - - ---- - -### Zoom Meeting Started - -Trigger workflow when a Zoom meeting starts - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(e.g., meeting.started\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | object | payload output from the tool | -| ↳ `account_id` | string | Zoom account ID | -| ↳ `object` | object | Meeting details \(shape aligns with Zoom Meetings webhook object fields\) | - - ---- - -### Zoom Participant Joined - -Trigger workflow when a participant joins a Zoom meeting - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(e.g., meeting.participant_joined\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | object | payload output from the tool | -| ↳ `account_id` | string | Zoom account ID | -| ↳ `object` | object | Meeting and participant details | - - ---- - -### Zoom Participant Left - -Trigger workflow when a participant leaves a Zoom meeting - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(e.g., meeting.participant_joined\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | object | payload output from the tool | -| ↳ `account_id` | string | Zoom account ID | -| ↳ `object` | object | Meeting and participant details | - - ---- - -### Zoom Recording Completed - -Trigger workflow when a Zoom cloud recording is completed - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(recording.completed\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | object | payload output from the tool | -| ↳ `account_id` | string | Zoom account ID | -| ↳ `object` | object | Cloud recording details \(aligns with Zoom cloud recording objects\) | - - ---- - -### Zoom Webhook (All Events) - -Trigger workflow on any Zoom webhook event - -#### Configuration - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `secretToken` | string | Yes | Found in your Zoom app | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `event` | string | The webhook event type \(e.g., meeting.started, recording.completed\) | -| `event_ts` | number | Unix timestamp in milliseconds when the event occurred | -| `payload` | json | Complete webhook payload \(structure varies by event type\) | - diff --git a/apps/docs/content/docs/en/variables/index.mdx b/apps/docs/content/docs/en/variables/index.mdx deleted file mode 100644 index d3543f368f7..00000000000 --- a/apps/docs/content/docs/en/variables/index.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Variables ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Card, Cards } from 'fumadocs-ui/components/card' -import { FAQ } from '@/components/ui/faq' - -Sim has two systems for injecting dynamic values into your workflows: **workflow variables** for in-run state and **environment variables** for secrets and configuration. - -## Variable Syntax at a Glance - -| Syntax | What it references | Example | -|--------|-------------------|---------| -| `` | Workflow variable | `` | -| `` | Nested property | `` | -| `` | Block output | `` | -| `` | Loop iteration (inside loop) | `` | -| `` | Parallel instance (inside parallel) | `` | -| `{{KEY}}` | Environment variable | `{{OPENAI_API_KEY}}` | - -Type `<` in any block text field to open the variable picker and browse available references. - -## Workflow Variables - -Workflow variables are a global store that any block can read or update during execution. They're defined in the **Variables** panel in the sidebar and support text, numbers, booleans, objects, and arrays. - -Key behaviors: -- **Global scope**: Accessible from any block in the workflow -- **Run-scoped persistence**: Changes during a run are visible to subsequent blocks, but each new execution resets variables to their initial values -- **Nested access**: Use dot notation for object properties (``) -- **Updated via the Variables block**: Use the [Variables block](/blocks/variables) to modify variable values mid-workflow - - - Full guide on creating, accessing, and updating workflow variables - - -## Environment Variables - -Environment variables store sensitive values like API keys, tokens, and configuration that should never appear in logs or be visible in the workflow canvas. - -### Creating Environment Variables - -1. Go to **Settings** in your workspace -2. Open the **Secrets** tab -3. Click **Add** and enter a key-value pair - -### Personal vs. Workspace - -| Scope | Visibility | Use case | -|-------|-----------|----------| -| **Workspace** | All workspace members, including external workspace members | Shared API keys, team configuration | -| **Personal** | Only you | Your personal tokens, dev credentials | - -When both a workspace and personal variable share the same key, the workspace value takes precedence. - -### Using Environment Variables - -Reference them with double curly braces in any block field: - -``` -{{API_KEY}} -``` - - - Environment variable names must start with a letter or underscore and contain only letters, numbers, and underscores (e.g., `MY_API_KEY`). - - -### Environment Variables vs. Credentials - -| | Environment Variables | Credentials | -|--|----------------------|-------------| -| **Format** | Key-value string pairs | OAuth tokens, API keys with provider context | -| **Syntax** | `{{KEY}}` | Selected via dropdown in block config | -| **Best for** | Custom API keys, configuration values, feature flags | OAuth services (Slack, GitHub, Google), managed connections | -| **Management** | Settings → Secrets | Settings → Credentials | - -Use environment variables when you have a raw API key or config value. Use [credentials](/credentials) when connecting to a service that needs OAuth or managed token refresh. - -## Name Conflicts - -If a workflow variable and a block output share the same name, Sim resolves the reference in a fixed priority order: loop and parallel context first, then workflow variables, then environment variables, then block outputs. To avoid confusion, use distinct names for your variables and blocks. - - syntax. Environment variables store sensitive configuration like API keys using {{KEY}} syntax. They never appear in logs and are managed at the workspace or personal level." }, - { question: "Can I use environment variables in the Function block?", answer: "Yes. Use the double curly brace syntax {{KEY}} directly in your code. The value is substituted before execution, so the actual secret never appears in logs or outputs." }, - { question: "How do I share an API key with my team?", answer: "Create a workspace-scoped environment variable in Settings → Secrets. All workspace members, including external workspace members, will be able to use it in their workflows via {{KEY}} syntax." }, - { question: "What happens if a variable name has spaces or mixed case?", answer: "Variable resolution is case-insensitive and ignores spaces. A variable named 'My Counter' can be referenced as or . However, using consistent naming (like camelCase) is recommended." }, - { question: "Can I reference environment variables in the Agent system prompt?", answer: "Yes. You can use {{KEY}} syntax in any text field, including system prompts, to inject environment variable values." }, -]} /> diff --git a/apps/docs/content/docs/en/variables/meta.json b/apps/docs/content/docs/en/variables/meta.json deleted file mode 100644 index 00b2a1dc9e0..00000000000 --- a/apps/docs/content/docs/en/variables/meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "title": "Variables", - "pages": ["index", "workflow-variables"], - "defaultOpen": false -} diff --git a/apps/docs/content/docs/en/variables/workflow-variables.mdx b/apps/docs/content/docs/en/variables/workflow-variables.mdx deleted file mode 100644 index 0cf4aa56613..00000000000 --- a/apps/docs/content/docs/en/variables/workflow-variables.mdx +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Workflow Variables ---- - -import { Callout } from 'fumadocs-ui/components/callout' -import { Step, Steps } from 'fumadocs-ui/components/steps' -import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -import { Image } from '@/components/ui/image' -import { Video } from '@/components/ui/video' -import { FAQ } from '@/components/ui/faq' - -Variables in Sim act as a global store for data that can be accessed and modified by any block in your workflow, allowing you to store and share data across your workflow with global variables. They provide a powerful way to share information between different parts of your workflow, maintain state, and create more dynamic applications. - -
-
- - - Variables allow you to store and share data across your entire workflow, making it easy to - maintain state and create complex, interconnected systems. - - -## Overview - -The Variables feature serves as a central data store for your workflow, enabling you to: - - - - Store global data: Create variables that persist throughout workflow execution - - - Share information between blocks: Access the same data from any block in your - workflow - - - Maintain workflow state: Keep track of important values as your workflow runs - - - Create dynamic workflows: Build more flexible systems that can adapt based on - stored values - - - -## Creating Variables - -To open the Variables panel, click **⋯ → Variables** in the top-right of the workflow editor. - -
- Opening the Variables panel from the toolbar menu -
- -Each variable has: - -- **Name**: A unique identifier used to reference the variable -- **Type**: The data type (Plain, Number, Boolean, Object, Array) -- **Value**: The data stored in the variable - -
- Variables panel with a number variable -
- -## Accessing Variables - -Variables can be accessed from any block in your workflow using the variable dropdown. Simply: - -1. Type `<` in any text field within a block -2. Browse the dropdown menu to select from available variables -3. Select the variable you want to use - -
-
- - - You can also drag the connection tag into a field to open the variable dropdown and access - available variables. - - -## Variable Types - -Variables in Sim can store various types of data: - - - - ``` - "Hello, World!" - ``` -

Plain variables store strings of characters. They're useful for storing messages, names, and other text data.

-
- - ``` - 42 - ``` -

Number variables store numeric values that can be used in calculations or comparisons.

-
- - ``` - true - ``` -

Boolean variables store true/false values, perfect for flags and condition checks.

-
- - ```json - { - "name": "John", - "age": 30, - "city": "New York" - } - ``` -

Object variables store structured data with properties and values.

-
- - ```json - [1, 2, 3, "four", "five"] - ``` -

Array variables store ordered collections of items.

-
-
- -## Using Variables in Blocks - -When you access a variable from a block, you can: - -- **Read its value**: Use the variable's current value in your block's logic -- **Modify it**: Update the variable's value based on your block's processing -- **Use it in expressions**: Include variables in expressions and calculations - -## Variable Scope - -Variables in Sim have global scope, meaning: - -- They are accessible from any block in your workflow -- Changes to variables persist throughout workflow execution -- Variables start fresh from their defined values on each run. Changes during execution are visible within that run only - -## Best Practices - -- **Use Descriptive Names**: Choose variable names that clearly indicate what the variable represents. For example, use `userPreferences` instead of `up`. -- **Document Your Variables**: Add descriptions to your variables to help other team members understand their purpose and usage. -- **Consider Variable Scope**: Remember that variables are global and can be modified by any block. Design your workflow with this in mind to prevent unexpected behavior. -- **Initialize Variables Early**: Set up and initialize your variables at the beginning of your workflow to ensure they're available when needed. -- **Handle Missing Variables**: Always consider the case where a variable might not yet exist or might have an unexpected value. Add appropriate validation in your blocks. -- **Limit Variable Count**: Keep the number of variables manageable. Too many variables can make your workflow difficult to understand and maintain. - - syntax. Environment variables (secrets) are workspace-level credentials referenced with {{KEY}} syntax, designed for sensitive values like API keys that should never appear in logs." }, - { question: "How are variables resolved during execution?", answer: "The execution engine uses a chain of resolvers that run in order: loop variables, parallel variables, workflow variables, environment variables, and then block references. When a block input contains a variable reference, the resolver matches it by normalized name (case-insensitive, spaces removed) or exact ID, then substitutes the resolved value before the block runs." }, - { question: "Can I use nested paths to access properties inside an object variable?", answer: "Yes. If your variable stores an object or array, you can use dot notation to access nested properties. For example, will navigate into the config object and return the retryCount value." }, - { question: "Do workflow variables persist between separate workflow runs?", answer: "Variables maintain their initial values as defined in the Variables panel. Each execution starts with those configured values. If a block modifies a variable during execution, that change is visible to subsequent blocks in the same run, but does not alter the saved initial value for future runs." }, - { question: "What happens if I reference a variable that does not exist?", answer: "If the resolver cannot find a matching variable, the raw reference string is left in place without substitution. This typically causes downstream blocks to receive unexpected input, so make sure all referenced variables are defined before running the workflow." }, - { question: "Can I store JSON objects or arrays as variable values?", answer: "Yes. Variables support text, numbers, booleans, JSON objects, and arrays. When the value is parsed for execution, the engine determines the type and resolves it accordingly, so downstream blocks receive the proper JavaScript object or array rather than a raw string." }, -]} /> diff --git a/apps/docs/content/docs/en/workflows/connections.mdx b/apps/docs/content/docs/en/workflows/connections.mdx new file mode 100644 index 00000000000..f705cc917ff --- /dev/null +++ b/apps/docs/content/docs/en/workflows/connections.mdx @@ -0,0 +1,158 @@ +--- +title: Connections +description: The syntax for referencing an earlier block's output and the shape of common block outputs. +pageType: reference +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Card, Cards } from 'fumadocs-ui/components/card' + +A **connection** wires one block to the next and sets the order they run in. [How blocks pass data](/workflows/data-flow) covers the concept: once a block runs, its output is remembered under the block's name, and any later block reads it by reference. This page is the reference for the **connection tag** syntax and the output shapes you'll reach into. + +## Tag syntax + +A connection tag references a value from an earlier block's output: + +``` + +``` + +- `blockName` is the name of the source block. Block names are normalized before matching, so they're lowercased and spaces are removed. `` and `` resolve to the same block. +- `path.to.data` is the path to the value inside that block's output. The field path is case-sensitive. + +You rarely type a tag by hand. In any input field, type `<` to open a dropdown of the values available from earlier blocks and pick one, or drag a value from a connected block straight into the field. + +## Nested and array fields + +Chain dot notation to reach into objects, and use bracket indices for arrays. Both combine in a single path: + +``` + + + +``` + +The resolver walks the path at runtime and substitutes the value. Multiple levels of indexing like `items[0][1]` work too. + +## Using tags in text and code + +Tags resolve at runtime and can sit anywhere in a field, mixed with static text: + +```javascript +// In text +"The user's name is " + +// In JSON +{ + "userName": "", + "orderTotal": +} + +// In a Function block +const greeting = `Hello, ${""}!` +const total = * 1.1 +``` + +Values are formatted to fit their context. In a [Function](/blocks/function) block, a resolved value becomes a code literal, so strings are quoted, objects are JSON, and `null` stays `null`, ready to drop into JavaScript or Python. In other blocks, objects are JSON-stringified and primitives become plain strings. + + +In a numeric context, confirm the referenced value is actually a number. A tag that resolves to text will not behave as a number. + + +When a referenced block didn't run on the current path, for example a block on an unselected branch, its tag resolves to an empty value. In most blocks that's an empty string; in Function blocks it's `null`. + +## Common block outputs + +A tag's path depends on what the source block produced. These are the standard shapes for the blocks you'll reference most. The output panel shows the live structure for any block. + + + + ```json + { + "content": "The generated text response", + "model": "gpt-4o", + "tokens": { "prompt": 120, "completion": 85, "total": 205 }, + "toolCalls": [], + "cost": [] + } + ``` + + `content` is the main response. `tokens` is an object of usage counts. `toolCalls` and `cost` are present when the agent used tools. With a response format configured, the output matches your schema instead of this shape. + + + ```json + { + "data": "Response body", + "status": 200, + "headers": { "content-type": "application/json" } + } + ``` + + `data` is the response body and can be any type. `status` is the HTTP status code. `headers` holds the response headers. + + + ```json + { + "result": "Function return value", + "stdout": "Console output" + } + ``` + + `result` is whatever your function returned and can be any type. `stdout` captures anything the code logged. + + + ```json + { + "conditionResult": true, + "selectedPath": { + "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1", + "blockType": "agent", + "blockTitle": "Follow-up Agent" + }, + "selectedOption": "condition-1" + } + ``` + + `conditionResult` is the boolean result. `selectedPath` describes the next block. `selectedOption` is the ID of the matched condition. + + + ```json + { + "content": "Routing decision", + "model": "gpt-4o", + "tokens": { "prompt": 120, "completion": 85, "total": 205 }, + "selectedPath": { + "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1", + "blockType": "agent", + "blockTitle": "Customer Service Agent" + } + } + ``` + + `content` is the routing decision text. `selectedPath` describes the chosen destination block. + + + ```json + { + "content": "Evaluation summary", + "model": "gpt-5", + "tokens": { "prompt": 120, "completion": 85, "total": 205 }, + "metric1": 8.5, + "metric2": 7.2 + } + ``` + + `content` summarizes the evaluation. Each metric you defined appears as its own field with a numeric score. + + + +A Function's `result`, an API's `data`, and an Agent with a response format all return whatever your code, the remote service, or your schema produced, so check the output panel during development to confirm the path you're referencing. + +## Next + + + + + + diff --git a/apps/docs/content/docs/en/workflows/data-flow.mdx b/apps/docs/content/docs/en/workflows/data-flow.mdx new file mode 100644 index 00000000000..202d0daf1d0 --- /dev/null +++ b/apps/docs/content/docs/en/workflows/data-flow.mdx @@ -0,0 +1,78 @@ +--- +title: How blocks pass data +description: What a block's output is, how blocks reference earlier outputs, and the data types you'll work with. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, OutputBundle, CLASSIFY_REPLY_WORKFLOW } from '@/components/workflow-preview' + +Most blocks need a value that an earlier block produced. A block gets it by referencing that block's output by name. This page covers three things: what an output is and where it lives, how a block references one, and the types of values you'll find inside. + + + +In this workflow, Classify reads the message from Start, and Reply reads the classification from Classify. + +## What an output is + +When a block runs, Sim keeps its result under the block's name for the rest of the run. That stored result is the block's **output**, and any later block can read it. + +An output is usually a set of named values, not a single thing. You read one by its key: `` is the `content` value of the block named `classify`. + + + +Different blocks produce different values. An [Agent](/blocks/agent) keeps its `content`; an [API](/blocks/api) keeps the `data` it received; a Table block keeps a `rowCount` and the rows it read, reached with ``. + + +A block's output is not the same as the **workflow's** output. Every block has its own, kept under its own name. The workflow's output is simply one of them: whatever the last block produced. + + +## How a block references an output + +A block's inputs are its **parameters**: the fields you fill in, like an Agent's model and prompt. In any parameter you can insert a **connection tag** to pull in an earlier output instead of typing a fixed value. The `` in Classify's prompt means "use whatever Start received here." + + + +A block can reference any output that already exists by the time it runs, meaning any block before it on its path (see [how workflows run](/workflows/how-it-runs)). You rarely type a tag by hand: wherever a parameter accepts one, the builder lists the available outputs and you pick the value you want. + +## Data types + +Each value inside an output has a type, shown next to it in the output panel. The type tells you what you can do with the value: index into an array, read a field from an object, compare a number. + +| Type | What it is | Example | +| --- | --- | --- | +| `string` | Text | `"Billing issue"` | +| `number` | A numeric value | `248` | +| `boolean` | `true` or `false` | `true` | +| `object` | A set of named fields | `{ category: "billing", urgency: "high" }` | +| `array` | An ordered list of values | `["billing", "urgent"]` | +| `null` | No value | `null` | + +A file shows up as an `object` carrying the file's details, like its name and URL. When a value isn't the type the next step needs, reshape it in a [Function](/blocks/function) block, which runs a short snippet of code and stores the result as its own output. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/workflows/how-it-runs.mdx b/apps/docs/content/docs/en/workflows/how-it-runs.mdx new file mode 100644 index 00000000000..c07cebfdde8 --- /dev/null +++ b/apps/docs/content/docs/en/workflows/how-it-runs.mdx @@ -0,0 +1,52 @@ +--- +title: How workflows run +description: How Sim orders the blocks, runs independent ones in parallel, and follows branches. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { Image } from '@/components/ui/image' + +When you run a workflow, Sim works out the order from the [connections](/workflows/connections): a block runs as soon as the blocks it depends on have finished. You never set the order by hand; the way blocks are wired implies it. + +## Independent blocks run in parallel + +Two blocks that don't depend on each other run at the same time. There's nothing to configure. If neither block is downstream of the other, Sim runs them together. + +Two agent blocks running at the same time after the Start trigger + +Here the Customer Support and Deep Researcher agents both run right after the Start trigger, instead of one waiting on the other. + +## A block waits for all its inputs + +When several blocks feed into one, that block waits for all of them to finish, then runs once with each of their outputs available to read. You don't merge them yourself. + +A Function block running after two agent blocks complete + +The Function block here runs after both agents complete, with both of their outputs ready. + +## Branches follow one path + +A workflow can split. A [Condition](/blocks/condition) block branches on an explicit rule; a [Router](/blocks/router) block lets a model choose the path. Only the branch that is taken runs. A block on a branch that didn't run produces no output, which is why a [connection tag](/workflows/connections) pointing at it comes back empty. + +A workflow branching by condition and by router + +To repeat work, a [Loop](/blocks/loop) block runs its inner blocks over a list or a count, and a [Parallel](/blocks/parallel) block runs them for several items at once. + + +A workflow can call other workflows, through a Workflow block, an MCP tool, or an API block. Sim tracks the call chain and stops a run that exceeds 25 hops, so workflows that call each other can't loop forever. + + +## Watching a run + +While a workflow runs, the editor shows each block's state live: queued, running, done, or errored. A failed block stops its own path but leaves independent paths running. Every run is recorded, so you can open the [logs](/logs-debugging) to see what each block received and returned after it finishes. + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/workflows/index.mdx b/apps/docs/content/docs/en/workflows/index.mdx new file mode 100644 index 00000000000..2a776c794b2 --- /dev/null +++ b/apps/docs/content/docs/en/workflows/index.mdx @@ -0,0 +1,107 @@ +--- +title: Overview +description: A workflow is a visual program made of blocks, a saved procedure your AI systems run. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { WorkflowPreview, CLASSIFY_WORKFLOW } from '@/components/workflow-preview' +import { FAQ } from '@/components/ui/faq' + +Your Sim workspace is where your AI systems live. A system is made of two things. **Workflows** are the procedures it runs. **Resources** are the data those procedures work with: tables, knowledge bases, and files. + +A workflow is a visual program made of blocks. Like a recipe, it's a fixed set of steps you write once and run again and again, each time with new input. Each block does one step of work, and connections set the order the blocks run in. + +Here's a simple one. It takes an incoming customer message, classifies its category and urgency, and returns the result: + + + +## The parts of a workflow + +### Trigger + +A **trigger** is where a workflow begins and what it hands in. Every workflow has exactly one. The [Start](/triggers/start) trigger takes input directly, which is what you use while building. In production you swap in a [chat](/triggers/start), [webhook](/triggers/webhook), [schedule](/triggers/schedule), or API trigger, and the downstream blocks don't change. + + + +In our example, the Start trigger receives the customer message. Later blocks read it by name, as ``. + +### Block + +A **block** is a single step, and each does one thing: an [Agent](/blocks/agent) reasons with a model, a [Function](/blocks/function) runs code, a [Condition](/blocks/condition) branches, a [Loop](/blocks/loop) repeats. Some blocks are deterministic (Function, Condition); others are model-driven (Agent) and can vary run to run. That difference is the first thing to know when debugging. + + + +Our example has one Agent block, configured with a model and a prompt, that reads the message and returns a classification. + + +A block is not the same as a tool. A **tool** is a capability an agent can call during a step: send a Slack message, search a knowledge base, run a snippet of code. An [Agent](/blocks/agent) block decides which tools to call and when. Blocks are the workflow's steps; tools are the actions an agent takes inside one. + + +### Connection + +A **connection** wires one block to the next and sets the execution order: the block at the arrow's head runs after the one at its tail. Once a block has run, the blocks after it can read its output by reference. + + + +You read an earlier output with a **connection tag**, written ``: name the block, then the value you want. The Agent's prompt reads the message with ``; a later block could read the Agent's answer with ``. + +Most workflow issues are data issues, not crashed blocks: a reference points at a value that isn't there, or a block on the path didn't run. See [how blocks pass data](/workflows/data-flow) for outputs, references, and types. + +### Output + +An **output** is what a block produces; later blocks read it through connection tags. By default the workflow's output is its **last block's** output. In our example that's the Agent's `{ category, urgency }`. There's no separate return step. + + + +On reuse, the consumer picks which outputs it wants by name: a [chat deployment](/deployment/chat), a [table column](/tables/workflow-columns), or an [API call](/deployment/api) each select block outputs individually. It's the same idea as connection tags, applied at the workflow's edge. (For precise HTTP control, add a [Response block](/blocks/response).) + +## Kinds of blocks [#blocks] + +Core blocks come in three kinds: blocks that **do work** ([Agent](/blocks/agent), [Function](/blocks/function), [API](/blocks/api)), blocks that **direct the flow** ([Condition](/blocks/condition), [Router](/blocks/router), [Loop](/blocks/loop), [Parallel](/blocks/parallel)), and blocks that **shape the run** ([Response](/blocks/response), [Guardrails](/blocks/guardrails), [Wait](/blocks/wait), and more). + +Two larger families do more specific jobs: + +- **[Integrations](/integrations)** connect to an external service — Gmail, Slack, Notion, a database — with hundreds available. An agent can also call them as tools. +- **Triggers** are the blocks that start a workflow. + +## How a workflow starts [#triggers] + +A trigger decides what starts the run and what input it receives. **Native triggers** need no connected account: [Start](/triggers/start) (manual, API, or chat), [Schedule](/triggers/schedule) (a timer), [Webhook](/triggers/webhook) (any inbound HTTP request), [RSS](/triggers/rss) (a new feed item), and [Table](/triggers/table) (a row change in a Sim table). **Integration triggers** fire on an event in a connected service — a GitHub push, a new email — and hand it to the workflow. + + +Every trigger runs the active [deployment](/deployment), so redeploy after changing a workflow for it to pick up the new version. + + +## How it runs + +When a workflow runs, blocks execute in dependency order: a block runs as soon as the blocks it depends on have finished, so independent branches run in parallel. Conditions, loops, and parallel blocks change the path data takes. + + + +## Workflows in context + +A workflow is where the rest of the workspace becomes behavior. On their own, tables, knowledge bases, files, and integrations are just resources. Workflows are where they *do* something. + +{/* VISUAL: system-context diagram. Mothership builds; tables/KBs/files/integrations feed; deployments expose; logs verify. */} + +- **Mothership** builds and edits workflows in natural language. +- **Tables, knowledge bases, files, and integrations** feed data, memory, artifacts, and actions into a workflow. +- **Deployments** expose a workflow as an API, chat, or MCP server. +- **Logs** record every run so you can verify what happened, step by step. + +## Next + + + + + + + + + diff --git a/apps/docs/content/docs/en/workflows/variables.mdx b/apps/docs/content/docs/en/workflows/variables.mdx new file mode 100644 index 00000000000..f87a45c8069 --- /dev/null +++ b/apps/docs/content/docs/en/workflows/variables.mdx @@ -0,0 +1,112 @@ +--- +title: Variables +description: Define reusable workflow variables referenced with angle brackets and environment variables referenced with double curly braces. +pageType: reference +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' + +A **variable** is a value you set yourself and reuse across a workflow. Sim has two kinds. **Workflow variables** hold data during a run, like a counter or a config object, and you reference them with ``. **Environment variables** hold secrets and configuration, like API keys, and you reference them with `{{KEY}}`. + +A variable is different from a **connection tag**. A variable is a value you define; a connection tag like `` reads the output a block produced earlier in the run. See [how blocks pass data](/workflows/data-flow) for connection tags. + +## Syntax at a glance + +| Syntax | References | Example | +|--------|-----------|---------| +| `` | A workflow variable | `` | +| `` | A nested property of an object variable | `` | +| `{{KEY}}` | An environment variable | `{{OPENAI_API_KEY}}` | +| `` | A block output (connection tag) | `` | +| `` / `` | The current iteration, inside a [Loop](/blocks/loop) container | `` | +| `` / `` | The current instance, inside a [Parallel](/blocks/parallel) container | `` | + +Type `<` in any block text field to open the picker and browse the variables and outputs you can reference. + +## Workflow variables + +Workflow variables are a global store any block can read or update during a run. Open the panel with **⋯ → Variables** in the top-right of the editor. Each variable has a **name**, a **type**, and a **value**. + +Reference one anywhere a field accepts input. For an object or array variable, use dot notation to reach a nested value, like ``. Name matching ignores case and spaces, so a variable named `My Counter` resolves from ``. Consistent names like `camelCase` are still the clearest. + +### Types + + + + ``` + "Hello, World!" + ``` + Text, for messages, names, and other strings. + + + ``` + 42 + ``` + A numeric value for calculations or comparisons. + + + ``` + true + ``` + A `true`/`false` flag. + + + ```json + { "name": "John", "age": 30 } + ``` + Structured data with named fields, reached with dot notation. + + + ```json + [1, 2, 3, "four", "five"] + ``` + An ordered list of values. + + + +### Scope + +Workflow variables are global: every block in the workflow can read and modify them. Use the [Variables block](/blocks/variables) to update a value mid-run. + +Each run starts fresh from the values defined in the panel. A change made during a run is visible to later blocks in that same run, but it never alters the saved initial value for future runs. + +## Environment variables + +Environment variables store sensitive values like API keys, tokens, and configuration that should never appear in logs or on the canvas. Create them under **Settings → Secrets** by adding a key-value pair. + +Reference them with double curly braces in any block field, including Agent system prompts and Function block code. The value is substituted before the block runs, so the secret never appears in logs or outputs. + +``` +{{API_KEY}} +``` + + + Environment variable names must start with a letter or underscore and contain only letters, numbers, and underscores, like `MY_API_KEY`. + + +### Personal vs. workspace + +| Scope | Visible to | Use for | +|-------|-----------|---------| +| **Workspace** | All workspace members, including external members | Shared API keys, team configuration | +| **Personal** | Only you | Your personal tokens, dev credentials | + +When a workspace and a personal variable share a key, the workspace value wins. + +### Versus credentials + +Environment variables hold raw string values you reference with `{{KEY}}`. [Credentials](/credentials) hold OAuth tokens and managed connections for services like Slack, GitHub, and Google, selected from a dropdown in a block's config. Use an environment variable for a raw API key or config value; use a credential when a service needs OAuth or managed token refresh. + +## Name conflicts + +When a reference could match more than one thing, Sim resolves it in a fixed order: loop and parallel context first, then workflow variables, then environment variables, then block outputs. If nothing matches, the raw reference is left in place unsubstituted, which usually breaks the block that reads it. Use distinct names for variables and blocks to avoid ambiguity. + +## Next + + + + + + diff --git a/apps/docs/content/docs/en/workspaces/fundamentals.mdx b/apps/docs/content/docs/en/workspaces/fundamentals.mdx new file mode 100644 index 00000000000..d590ec7c0f8 --- /dev/null +++ b/apps/docs/content/docs/en/workspaces/fundamentals.mdx @@ -0,0 +1,86 @@ +--- +title: Workspace fundamentals +description: A workspace holds your workflows and resources and decides who can access them. +pageType: concept +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Card, Cards } from 'fumadocs-ui/components/card' + +A **workspace** holds one set of AI systems: the workflows you build and the resources they use — tables, files, knowledge bases, integrations, and secrets. It also decides who sees them. Every resource belongs to exactly one workspace, and only that workspace's members can access it. A workflow in one workspace cannot read a table in another. + +Think of a workspace as a project folder for AI systems. Open it and everything one team needs is in one place: the procedures, the data, the connected accounts, the run history, and the settings. + +{/* VISUAL: nesting diagram. Outer ring: user or organization. Middle ring: workspace. Inside: workflows, tables, files, knowledge bases, integrations, secrets. Members with permission levels attached at the workspace ring. */} + +## What a workspace contains + +The sidebar is the map of a workspace. Each section is one kind of resource: + +{/* VISUAL: the workspace sidebar with sections labeled: Workflows, Tables, Files, Knowledge Base, Scheduled Tasks, Logs, Settings. Each row shows one example item. */} + +### Workflows + +A **workflow** is a saved, repeatable procedure made of blocks: the primary resource in a workspace. You edit it, deploy it to surfaces like an API or a chat, and version it. See [Workflows](/workflows) for the full model. + +### Tables + +A **table** is structured data in the workspace, used as a source or an output inside workflows. + +### Files + +A **file** is a document or binary stored in the workspace, readable by workflows and organized into folders. + +### Knowledge bases + +A **knowledge base** is a collection of documents or structured data that workflows search to give a model context at run time. + +### Integrations + +An **integration** is a connected account for a third-party service (Gmail, Slack, GitHub, and so on). Each carries its own access control, so a team shares one connection. See [Integrations](/integrations). + +### Secrets + +A **secret** is an API key or environment variable stored securely in the workspace. Secrets come in two scopes: **Workspace** secrets are shared with the workspace, and **Personal** secrets are private to you. See [Secrets](/credentials). + +### Logs + +A **log** is the execution trace of one workflow run: the trigger, the blocks that ran, and each block's input, output, and error. Logs are how you verify what happened. + + +**Deployments** are not a sidebar section. A deployment is a versioned snapshot of one workflow, published for outside use through an API, chat, or MCP server. Editing a workflow does not change a live deployment until you promote the new version, and rollback means promoting an earlier one. See [Deployments](/deployment). + + +## Access and isolation + +Everything is scoped to the workspace, so access, settings, and isolation work the same way: + +- **Access.** Membership is per workspace. A member sees every resource in it, at the level their permission allows. +- **Settings.** Each workspace has its own configuration: integrations, secrets, access control, API keys, and more. The Settings page lists the full menu. +- **Isolation.** Resources never span workspaces. To reuse a workflow elsewhere, move or copy it into that workspace. + +Members join with one of three **permission levels**: **Read**, **Write**, or **Admin** (the creator is **Owner**). Read can view, Write can build and run, Admin can also manage members and settings. See [Roles and permissions](/permissions/roles-and-permissions) for the full breakdown. + + +## Personal and organization workspaces + +Most workspaces are one of two kinds. + +A **personal workspace** lives under your own account. Use it for experimentation and individual work. Your plan sets how many you can create. + +An **organization workspace** (also called a shared workspace) lives under an organization, available on Team and Enterprise plans. You invite members, each with a permission level. Internal members join the organization and count toward its seat total. External members keep their own organization membership and don't use a seat — that's how partners and clients get access. For agencies and enterprises, this is the workspace you hand to the customer: the app they use, own, and maintain. + +A third kind, `grandfathered_shared`, exists for legacy accounts. Its invitation and billing rules differ from the two above; you will not create one. + + +Plan limits, seat counts, and the internal-versus-external distinction live in [Roles and permissions](/permissions/roles-and-permissions). This page covers what a workspace is, not how billing works. + + +## Next + + + + + + + diff --git a/apps/docs/content/docs/en/workspaces/organization.mdx b/apps/docs/content/docs/en/workspaces/organization.mdx new file mode 100644 index 00000000000..008efb98943 --- /dev/null +++ b/apps/docs/content/docs/en/workspaces/organization.mdx @@ -0,0 +1,78 @@ +--- +title: Organizing a workspace +description: Folders, colors, and naming conventions for keeping a growing workspace understandable. +pageType: concept +--- + +import { Card, Cards } from 'fumadocs-ui/components/card' + +A **folder** is a container in the sidebar that groups workflows. It is the primary way you organize a [workspace](/workspaces/fundamentals) once it holds more than a handful of workflows. Folders work like folders in a desktop file system: they nest, they collapse, and you arrange them by convention so the structure tells you where things live. + +A flat list of twenty workflows is hard to scan, but grouping the same twenty under three or four top-level folders gives you a map of where everything lives. + +{/* VISUAL: before/after sidebar. Left: a flat list of ~20 workflows, no grouping. Right: the same workflows under 3-4 top-level color-coded folders ("Internal", "Customer-Facing", "Ops"), some expanded to show nested subfolders. */} + +## The parts of a folder + +Here's an example: a folder named **Customer Deployments**, colored red, holding five workflows and two subfolders. + +### Name + +A **name** is the label you give a folder. It is plain text with no enforced format, so the convention is yours to set. Pick names that read as categories, not as one-off labels: `Internal`, `Customer-Facing`, `Ops`. Our example folder is named `Customer Deployments`. Naming is covered in [Conventions](#conventions) below. + +{/* VISUAL: a single sidebar folder row showing the expand chevron, color dot, and name "Customer Deployments". */} + +### Color + +A **color** is a hex value assigned to a folder for visual grouping, shown as a dot next to the name. It defaults to gray (`#6B7280`) and you can change it from the folder's menu. Color is the fastest way to read the sidebar at a glance. Reserve one color per top-level category (red for production, gray for scratch work) so you can find the right branch before reading a single name. Our example is red (`#EF4444`). + +{/* VISUAL: a short vertical stack of folders with distinct color dots: red "Production", gray "Internal", another color for "Customer-Facing", showing color as the grouping signal. */} + +### Nesting + +A folder can sit inside another folder. The inner one is a **subfolder**, and the structure is a tree: a top-level folder has no parent, a subfolder points at the folder that contains it, and that chain can go as deep as you need. Our example, `Customer Deployments`, holds two subfolders and itself sits under a `Production` folder. + +Lead with shallow trees. Two or three levels (`Production` > `Customer A` > `Deployments`) stay readable. Go deeper than that and you end up scrolling the sidebar instead of scanning it. + +{/* VISUAL: a three-level nested tree: "Production" (red, top level) > "Customer A" (yellow) > "Deployments" (purple), each row indented one step, showing the parent-to-child chain. */} + +### Order + +Folders display in a set **order**, top to bottom, that you control by dragging them in the sidebar. Drag a folder up or down to reorder it within its level, or drag it onto another folder to move it inside as a subfolder. Order is a convention too: put the folders a team touches daily at the top. + +### Locking + +A **locked** folder is read-only: its workflows can be viewed but not edited. Locking is off by default. Lock a `Production` folder so members can open and run its workflows without changing them by accident. Locking a folder also locks everything inside it, so a locked parent protects its subfolders and their workflows in one move. Who can lock and unlock follows the workspace [roles and permissions](/permissions/roles-and-permissions). + +{/* VISUAL: the folder context menu open on a folder row, showing the options: rename, change color, lock, duplicate, export, new subfolder, delete. */} + +### Archiving + +**Archiving** a folder removes it from your active sidebar without deleting it. An archived folder drops out of the normal view, and you restore it when you need it again. Use archiving for cleanup: a finished customer engagement or a retired experiment leaves the sidebar but stays recoverable. There is no permanent hard-delete in the folder menu, so archiving is the safe way to get something out of the way. + +## Conventions + +Naming conventions make the structure legible to someone who did not build it. Nothing here is enforced, so the value comes from applying one rule consistently across the workspace. + +- **Group by audience or function at the top level.** A common split is `Internal`, `Customer-Facing`, and `Ops`. Someone new can find the right branch from the top-level names alone. +- **Name folders as categories, workflows as actions.** A folder is a noun (`Billing`); a workflow is a thing it does (`Send overdue reminder`). The folder path plus the workflow name should read as a sentence. +- **Use color for the top level, names for everything below.** Color carries the coarse grouping; names carry the detail. Mixing both at every level turns into noise. +- **Mirror the convention everywhere.** The same category words you use for folders are worth reusing for [tables](/workspaces/fundamentals), [secrets](/credentials), and [integrations](/integrations), so a team learns one vocabulary instead of three. + +## One workspace or several + +Folders organize within a workspace. A separate workspace draws a hard boundary: resources never cross it, and access is granted per workspace. Reach for a new workspace when you need that boundary, not just tidier grouping. + +- **Group in folders** when everything belongs to the same team and the same access rules, and you only want it easier to navigate. +- **Split into workspaces** when a set of work needs its own members, its own integrations and secrets, or its own isolation. The classic case is one workspace per customer, where the workspace itself is the deliverable the customer owns. + +See [Workspace fundamentals](/workspaces/fundamentals) for what the boundary scopes and [Roles and permissions](/permissions/roles-and-permissions) for how members and seats work across workspaces. + +## Next + + + + + + + diff --git a/apps/docs/lib/source.ts b/apps/docs/lib/source.ts index 430bb038a13..d3f3682603f 100644 --- a/apps/docs/lib/source.ts +++ b/apps/docs/lib/source.ts @@ -92,10 +92,14 @@ export const source = loader( } ) +/** Diátaxis page type surfaced as a badge near the page title. */ +export type DocsPageType = 'tutorial' | 'guide' | 'reference' | 'concept' + /** Full page data type including MDX content and metadata */ export type PageData = DocData & DocMethods & { title: string description?: string full?: boolean + pageType?: DocsPageType } diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index f3a1aad5d89..6e42b63e39d 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -19,6 +19,83 @@ const config: NextConfig = { destination: '/introduction', permanent: true, }, + // building-agents/agents merged into the building-agents overview + { source: '/building-agents/agents', destination: '/building-agents', permanent: true }, + // form deployment removed + { source: '/deployment/form', destination: '/deployment', permanent: true }, + // copilot deprecated and removed + { source: '/copilot', destination: '/mothership', permanent: true }, + { source: '/copilot/:path*', destination: '/mothership', permanent: true }, + // connections/* and variables/* collapsed into single pages under workflows/ + { source: '/connections', destination: '/workflows/connections', permanent: true }, + { source: '/connections/:path*', destination: '/workflows/connections', permanent: true }, + { source: '/variables', destination: '/workflows/variables', permanent: true }, + { source: '/variables/:path*', destination: '/workflows/variables', permanent: true }, + // capabilities/* renamed to building-agents/* + { source: '/capabilities', destination: '/building-agents', permanent: true }, + { source: '/capabilities/agents', destination: '/building-agents/agents', permanent: true }, + { + source: '/capabilities/choosing', + destination: '/building-agents/choosing', + permanent: true, + }, + // execution/* was broken up; redirect old URLs to their new homes + { source: '/execution', destination: '/workflows', permanent: true }, + { source: '/execution/index', destination: '/workflows', permanent: true }, + { source: '/execution/basics', destination: '/workflows/how-it-runs', permanent: true }, + { source: '/execution/files', destination: '/files/passing-files', permanent: true }, + { source: '/execution/logging', destination: '/logs-debugging/logging', permanent: true }, + { source: '/execution/costs', destination: '/costs', permanent: true }, + { source: '/execution/api', destination: '/api-reference/getting-started', permanent: true }, + { source: '/execution/api-deployment', destination: '/deployment/api', permanent: true }, + { source: '/execution/chat', destination: '/deployment/chat', permanent: true }, + { source: '/execution/form', destination: '/deployment/form', permanent: true }, + { source: '/mcp/deploy-workflows', destination: '/deployment/mcp', permanent: true }, + // tools/ + triggers/ unified into per-service integrations/ pages. + // Specific moves first (Next applies the first matching redirect): + { + source: '/tools/custom-tools', + destination: '/building-agents/custom-tools', + permanent: true, + }, + { source: '/tools', destination: '/integrations', permanent: true }, + { source: '/tools/:slug', destination: '/integrations/:slug', permanent: true }, + // Old blocks/triggers index pages were folded into the workflows overview. + // Native trigger pages (/triggers/start|schedule|webhook|rss|table) still exist. + { source: '/blocks', destination: '/workflows#blocks', permanent: true }, + { source: '/triggers', destination: '/workflows#triggers', permanent: true }, + // Integration trigger pages: provider slug differs from the block type for a few. + { + source: '/triggers/jsm', + destination: '/integrations/jira_service_management', + permanent: true, + }, + { + source: '/triggers/google-calendar', + destination: '/integrations/google_calendar', + permanent: true, + }, + { + source: '/triggers/google-drive', + destination: '/integrations/google_drive', + permanent: true, + }, + { + source: '/triggers/google-sheets', + destination: '/integrations/google_sheets', + permanent: true, + }, + { + source: '/triggers/microsoft-teams', + destination: '/integrations/microsoft_teams', + permanent: true, + }, + { + source: + '/triggers/:slug(airtable|ashby|attio|azure_devops|calcom|calendly|circleback|confluence|emailbison|fathom|fireflies|github|gmail|gong|google_forms|grain|greenhouse|hubspot|imap|intercom|jira|lemlist|linear|monday|notion|outlook|resend|salesforce|sendblue|servicenow|slack|stripe|telegram|twilio_voice|typeform|vercel|webflow|whatsapp|zoom)', + destination: '/integrations/:slug', + permanent: true, + }, ] }, async rewrites() { diff --git a/apps/docs/package.json b/apps/docs/package.json index 49f658b42a5..5dafcf46383 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -32,7 +32,9 @@ "react": "19.2.4", "react-dom": "19.2.4", "shiki": "4.0.0", - "tailwind-merge": "^3.0.2" + "tailwind-merge": "^3.0.2", + "reactflow": "^11.11.4", + "framer-motion": "^12.5.0" }, "devDependencies": { "@sim/tsconfig": "workspace:*", diff --git a/apps/docs/public/static/integrations/hubspot/connect-hubspot-modal.png b/apps/docs/public/static/integrations/hubspot/connect-hubspot-modal.png new file mode 100644 index 00000000000..81c47c5beec Binary files /dev/null and b/apps/docs/public/static/integrations/hubspot/connect-hubspot-modal.png differ diff --git a/apps/docs/public/static/integrations/hubspot/hubspot-oauth-signin.png b/apps/docs/public/static/integrations/hubspot/hubspot-oauth-signin.png new file mode 100644 index 00000000000..f624164c161 Binary files /dev/null and b/apps/docs/public/static/integrations/hubspot/hubspot-oauth-signin.png differ diff --git a/apps/docs/public/static/integrations/hubspot/hubspot-page-add-to-sim.png b/apps/docs/public/static/integrations/hubspot/hubspot-page-add-to-sim.png new file mode 100644 index 00000000000..4e3c0cabd36 Binary files /dev/null and b/apps/docs/public/static/integrations/hubspot/hubspot-page-add-to-sim.png differ diff --git a/apps/docs/public/static/integrations/hubspot/integrations-page.png b/apps/docs/public/static/integrations/hubspot/integrations-page.png new file mode 100644 index 00000000000..ed9d8e828fc Binary files /dev/null and b/apps/docs/public/static/integrations/hubspot/integrations-page.png differ diff --git a/apps/docs/public/static/skills/add-skill-create.png b/apps/docs/public/static/skills/add-skill-create.png new file mode 100644 index 00000000000..db7323bcf9e Binary files /dev/null and b/apps/docs/public/static/skills/add-skill-create.png differ diff --git a/apps/docs/public/static/skills/add-skill-import.png b/apps/docs/public/static/skills/add-skill-import.png new file mode 100644 index 00000000000..03d9ed94577 Binary files /dev/null and b/apps/docs/public/static/skills/add-skill-import.png differ diff --git a/apps/docs/public/static/skills/skills-tab.png b/apps/docs/public/static/skills/skills-tab.png new file mode 100644 index 00000000000..3ff2b8c1ebb Binary files /dev/null and b/apps/docs/public/static/skills/skills-tab.png differ diff --git a/apps/docs/public/static/tables/workflow-columns/cell-menu.png b/apps/docs/public/static/tables/workflow-columns/cell-menu.png new file mode 100644 index 00000000000..780d84cc0e4 Binary files /dev/null and b/apps/docs/public/static/tables/workflow-columns/cell-menu.png differ diff --git a/apps/docs/public/static/tables/workflow-columns/column-mapping.png b/apps/docs/public/static/tables/workflow-columns/column-mapping.png new file mode 100644 index 00000000000..93871f78ab6 Binary files /dev/null and b/apps/docs/public/static/tables/workflow-columns/column-mapping.png differ diff --git a/apps/docs/public/static/tables/workflow-columns/configure-workflow.png b/apps/docs/public/static/tables/workflow-columns/configure-workflow.png new file mode 100644 index 00000000000..c5862fa5881 Binary files /dev/null and b/apps/docs/public/static/tables/workflow-columns/configure-workflow.png differ diff --git a/apps/docs/public/static/tables/workflow-columns/row-trace.png b/apps/docs/public/static/tables/workflow-columns/row-trace.png new file mode 100644 index 00000000000..f44ce82622e Binary files /dev/null and b/apps/docs/public/static/tables/workflow-columns/row-trace.png differ diff --git a/apps/docs/public/static/tables/workflow-columns/table-groups.png b/apps/docs/public/static/tables/workflow-columns/table-groups.png new file mode 100644 index 00000000000..6ac00a0e72d Binary files /dev/null and b/apps/docs/public/static/tables/workflow-columns/table-groups.png differ diff --git a/apps/docs/source.config.ts b/apps/docs/source.config.ts index d2931dda32b..6a03ead5d0a 100644 --- a/apps/docs/source.config.ts +++ b/apps/docs/source.config.ts @@ -1,8 +1,18 @@ -import { defineConfig, defineDocs } from 'fumadocs-mdx/config' +import { defineConfig, defineDocs, frontmatterSchema } from 'fumadocs-mdx/config' +import { z } from 'zod' +/** + * Diátaxis page type — an internal authoring taxonomy surfaced to readers as a + * small badge near the page title. Optional so existing pages render unchanged + * until backfilled. Only collections may be exported from this file, so the + * shared type lives in `@/lib/source` (`DocsPageType`). + */ export const docs = defineDocs({ dir: 'content/docs', docs: { + schema: frontmatterSchema.extend({ + pageType: z.enum(['tutorial', 'guide', 'reference', 'concept']).optional(), + }), postprocess: { includeProcessedMarkdown: true, }, diff --git a/apps/sim/lib/integrations/integrations.json b/apps/sim/lib/integrations/integrations.json index 324e27d3ea5..dcffc098145 100644 --- a/apps/sim/lib/integrations/integrations.json +++ b/apps/sim/lib/integrations/integrations.json @@ -3814,7 +3814,7 @@ "longDescription": "Integrate with your self-hosted DSPy programs for LLM-powered predictions. Supports Predict, Chain of Thought, and ReAct agents. DSPy is the framework for programming—not prompting—language models.", "bgColor": "#FFFFFF", "iconName": "DsPyIcon", - "docsUrl": "https://docs.sim.ai/tools/dspy", + "docsUrl": "https://docs.sim.ai/integrations/dspy", "operations": [ { "name": "Predict", diff --git a/bun.lock b/bun.lock index 6ccdd5bd67f..04fa7285294 100644 --- a/bun.lock +++ b/bun.lock @@ -27,6 +27,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "drizzle-orm": "^0.45.2", + "framer-motion": "^12.5.0", "fumadocs-core": "16.8.5", "fumadocs-mdx": "14.3.2", "fumadocs-openapi": "10.8.1", @@ -37,6 +38,7 @@ "postgres": "^3.4.5", "react": "19.2.4", "react-dom": "19.2.4", + "reactflow": "^11.11.4", "shiki": "4.0.0", "tailwind-merge": "^3.0.2", }, diff --git a/scripts/README.md b/scripts/README.md index 925345284d9..4d2dc8dcb79 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,93 +1,89 @@ -# Block Documentation Generator +# Integration documentation generator -This directory contains scripts to automatically generate documentation for all blocks in the Sim platform. +`generate-docs.ts` compiles the per-service **integration** pages under +`apps/docs/content/docs/en/integrations/` from the block/tool/trigger registry in +`apps/sim`. The ontology it encodes: everything is a block, and an integration is one +block that has **Actions** and, optionally, a **Trigger**. -## Available Scripts +> **Golden rule:** the generated `.mdx` files are *derived artifacts*, not the source of +> truth. Do not hand-edit them — your changes are overwritten on the next run. The only +> editable region is the `MANUAL-CONTENT` block (see below). To change what a page says, +> edit the TypeScript in `apps/sim` and regenerate. -- `generate-docs.ts`: Generates documentation for all blocks. Run via `bun run generate-docs` from `apps/sim`, or directly with `bun run scripts/generate-docs.ts` from the repo root. +## Where an integration lives canonically -## How It Works +For a service like Gmail, three TS sources define it: -The documentation generator: +| Source | What it is | What it feeds in the page | +| --- | --- | --- | +| `apps/sim/blocks/blocks/.ts` | The **block**: `type`, `name`, `category` (`tools` for integrations), `bgColor`, config sub-blocks, `tools.access` (which actions it exposes), an optional `triggers` capability, `outputs` | Header / `BlockInfoCard`, Usage Instructions, and *which* actions + trigger appear | +| `apps/sim/tools//*.ts` | Each **action's** params + outputs | Every `### ` → `#### Input` / `#### Output` under `## Actions` | +| `apps/sim/triggers//` | The **trigger's** config fields + outputs | The `## Triggers` section | +| `apps/sim/components/icons.tsx` | The brand glyph | The page icon | -1. Scans the `apps/sim/blocks/blocks/` directory for all block definition files -2. Extracts metadata from each block including: - - Name, description, and category - - Input and output specifications - - Configuration parameters -3. Generates standardized Markdown documentation for each block -4. Updates the navigation metadata in `meta.json` +The block references actions by id in `tools.access`; the generator looks each one up in +`apps/sim/tools/`. -## Running the Generator +## What the generator does -```bash -# From the repo root -bun run scripts/generate-docs.ts -``` - -Dependencies are managed by Bun workspaces — `bun install` at the repo root installs everything needed. - -## CI Integration - -The documentation generator runs automatically as part of the CI/CD pipeline whenever changes are pushed to the main branch. The updated documentation is committed back to the repository. - -## Adding Support for New Block Properties - -If you add new properties to block definitions that should be included in the documentation, update the `generateMarkdownForBlock` function in `scripts/generate-docs.ts`. - -## Preserving Manual Content +Run with `cd apps/sim && bun run generate-docs` (or `bun run scripts/generate-docs.ts` +from the repo root). One pass (`generateAllBlockDocs`): -The documentation generator now supports preserving manually added content when regenerating docs. This allows you to enhance the auto-generated documentation with custom examples, additional context, or any other content without losing your changes when the docs are regenerated. +1. **Copies icons** `apps/sim/components/icons.tsx` → `apps/docs/components/icons.tsx` and + builds `apps/docs/components/ui/icon-mapping.ts`. +2. **Block pass** — for each integration block (`category: 'tools'`, plus the `memory` / + `knowledge` / `table` exceptions), writes `integrations/.mdx`: + `BlockInfoCard` + Usage Instructions + `## Actions`. +3. **Trigger pass** (`generateAllTriggerDocs`) — reads `apps/sim/triggers//` and + **appends a `## Triggers` section** to that service's page, or writes a standalone page + for trigger-only services. +4. Writes `integrations/meta.json` and regenerates the landing page's `integrations.json`. -### How It Works +### Hand-written pages it never touches -1. The generator creates clean documentation without any placeholders or markers -2. If you add manual content to a file using special comment markers, that content will be preserved during regeneration -3. The manual content is intelligently inserted at the appropriate section when docs are regenerated +Core block pages (`blocks/*`), the native trigger pages (`triggers/{start,schedule,webhook,rss,table}`), +the integrations overview (`integrations/index.mdx`), and the service-account pages are +fully hand-written. The generator skips them via `HANDWRITTEN_INTEGRATION_DOCS`, +`HANDWRITTEN_TRIGGER_DOCS`, and `SKIP_TRIGGER_PROVIDERS`. Add a page name to those sets if +you hand-author a page the generator would otherwise produce. -### Using Manual Content Markers +## Manual content (the one editable region) -To add custom content to any tool's documentation, insert MDX comment blocks with section markers: +Each generated page may carry hand-written prose inside marker comments. The generator +preserves anything between the markers and overwrites everything else, so this survives +every regeneration: -```markdown -{/_ MANUAL-CONTENT-START:sectionName _/} -Your custom content here (Markdown formatting supported) -{/_ MANUAL-CONTENT-END _/} +```mdx +{/* MANUAL-CONTENT-START:intro */} +[AgentMail](https://agentmail.to/) is an API-first email platform… +{/* MANUAL-CONTENT-END */} ``` -Replace `sectionName` with one of the supported section names: +Supported section names: `intro` (after the `BlockInfoCard` — the most common), +`usage`, `configuration`, `outputs`, `notes`. The merge is by marker name +(`extractManualContent` + `mergeWithManualContent`), so a section is re-inserted at the +matching spot in the freshly generated structure. -- `intro` - Content at the top of the document after the BlockInfoCard -- `usage` - Additional usage instructions and examples -- `configuration` - Custom configuration details -- `outputs` - Additional output information or examples -- `notes` - Extra notes at the end of the document +> If you **move** the output folder, reseed manual content from the old location first — +> the generator only preserves markers it finds in the *existing output file*, so a fresh +> folder starts with none. -### Example +## Practical: to change… -To add custom examples to a tool doc: +- **An action's params/outputs, a trigger, or to add a service** → edit + `apps/sim/{blocks,tools,triggers}` and re-run the generator. +- **A page's prose intro** → edit its `MANUAL-CONTENT:intro` block directly; it survives regen. +- **The overview / service-account / core-block / native-trigger pages** → hand-edit freely. -````markdown -{/_ MANUAL-CONTENT-START:usage _/} +## Gotchas -## Examples +- **Never hand-edit `apps/docs/components/icons.tsx`** — step 1 overwrites it from the sim + app. Components that need an icon the sim app lacks should define it locally or use + `lucide-react` (see `components/workflow-preview/block-icons.tsx`). +- The generator is the source of truth for `integrations/` and its `meta.json`; manual + edits there are transient. -### Basic Usage +## CI -```json -{ - "parameter": "value", - "anotherParameter": "anotherValue" -} -``` -```` - -### Advanced Configuration - -Here's how to use this tool for a specific use case... -{/_ MANUAL-CONTENT-END _/} - -``` - -When the documentation is regenerated, your manual content will be preserved in the appropriate section automatically. The script will not add any placeholders or markers to files by default. -``` +The generator runs in CI on pushes to the main branch and commits the regenerated docs +back. Keep block/tool/trigger metadata accurate in `apps/sim` and the docs follow. diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 60a40994797..3a340d83f52 100755 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -21,7 +21,7 @@ const __dirname = path.dirname(__filename) const rootDir = path.resolve(__dirname, '..') const BLOCKS_PATH = path.join(rootDir, 'apps/sim/blocks/blocks') -const DOCS_OUTPUT_PATH = path.join(rootDir, 'apps/docs/content/docs/en/tools') +const DOCS_OUTPUT_PATH = path.join(rootDir, 'apps/docs/content/docs/en/integrations') const ICONS_PATH = path.join(rootDir, 'apps/sim/components/icons.tsx') const DOCS_ICONS_PATH = path.join(rootDir, 'apps/docs/components/icons.tsx') const INTEGRATIONS_DATA_PATH = path.join(rootDir, 'apps/sim/lib/integrations') @@ -30,13 +30,30 @@ const LANDING_INTEGRATIONS_DATA_PATH = path.join( 'apps/sim/app/(landing)/integrations/data' ) const TRIGGERS_PATH = path.join(rootDir, 'apps/sim/triggers') -const TRIGGER_DOCS_OUTPUT_PATH = path.join(rootDir, 'apps/docs/content/docs/en/triggers') +// Integration triggers are merged into the same per-service page as the service's +// actions (one block per integration: actions + an optional Trigger). +const TRIGGER_DOCS_OUTPUT_PATH = DOCS_OUTPUT_PATH + +/** Hand-written integration pages in DOCS_OUTPUT_PATH that the generator must never clobber. */ +const HANDWRITTEN_INTEGRATION_DOCS = new Set([ + 'index', + 'google-service-account', + 'atlassian-service-account', + 'hubspot-setup', +]) + +/** + * Native Sim resource blocks (category 'blocks') that still get a generated + * integration page. The writer's filter and the stale-doc cleanup must both + * honor this set, or cleanup deletes what the writer emits (losing manual content). + */ +const NATIVE_RESOURCE_BLOCK_TYPES = new Set(['memory', 'knowledge', 'table']) /** Trigger doc pages that are hand-written and must never be overwritten. */ -const HANDWRITTEN_TRIGGER_DOCS = new Set(['index', 'start', 'schedule', 'webhook', 'rss']) +const HANDWRITTEN_TRIGGER_DOCS = new Set(['index', 'start', 'schedule', 'webhook', 'rss', 'table']) /** Providers whose docs are already covered by hand-written pages. */ -const SKIP_TRIGGER_PROVIDERS = new Set(['generic', 'rss']) +const SKIP_TRIGGER_PROVIDERS = new Set(['generic', 'rss', 'table']) /** * Maps trigger provider names (from TriggerConfig.provider) to their @@ -48,6 +65,7 @@ const PROVIDER_TO_BLOCK_TYPE: Record = { 'google-calendar': 'google_calendar', 'google-drive': 'google_drive', 'google-sheets': 'google_sheets', + jsm: 'jira_service_management', } /** Human-readable display names for trigger providers. */ @@ -786,7 +804,7 @@ async function writeIntegrationsJson(iconMapping: Record): Promi const triggers: TriggerInfo[] = triggerIds .map((id) => triggerRegistry.get(id)) .filter((t): t is TriggerInfo => t !== undefined) - const docsUrl = (config as any).docsLink || `https://docs.sim.ai/tools/${baseType}` + const docsUrl = (config as any).docsLink || `https://docs.sim.ai/integrations/${baseType}` const slug = config.name .toLowerCase() @@ -980,7 +998,7 @@ function extractBlockConfigFromContent( const docsLink = extractStringPropertyFromContent(blockContent, 'docsLink', true) || baseConfig?.docsLink || - `https://docs.sim.ai/tools/${stripVersionSuffix(blockType)}` + `https://docs.sim.ai/integrations/${stripVersionSuffix(blockType)}` const integrationType = extractEnumPropertyFromContent(blockContent, 'integrationType') || @@ -2544,20 +2562,17 @@ function mergeWithManualContent( } const insertionPoint = insertionPoints[sectionName] + const wrapped = `{/* MANUAL-CONTENT-START:${sectionName} */}\n${content}\n{/* MANUAL-CONTENT-END */}` - if (insertionPoint) { - const match = mergedContent.match(insertionPoint.regex) - - if (match && match.index !== undefined) { - const insertPosition = match.index + match[0].length - mergedContent = `${mergedContent.slice(0, insertPosition)}\n\n{/* MANUAL-CONTENT-START:${sectionName} */}\n${content}\n{/* MANUAL-CONTENT-END */}\n${mergedContent.slice(insertPosition)}` - } else { - console.log( - `Could not find insertion point for ${sectionName}, regex pattern: ${insertionPoint.regex}` - ) - } + const match = insertionPoint ? mergedContent.match(insertionPoint.regex) : null + if (match && match.index !== undefined) { + const insertPosition = match.index + match[0].length + mergedContent = `${mergedContent.slice(0, insertPosition)}\n\n${wrapped}\n${mergedContent.slice(insertPosition)}` } else { - console.log(`No insertion point defined for section ${sectionName}`) + // Never drop manual content: when the anchor is missing (e.g. a `notes` + // section with no generated "## Notes" heading), append at the end. + console.log(`No insertion anchor for manual section "${sectionName}" — appending at end`) + mergedContent = `${mergedContent.replace(/\s*$/, '')}\n\n${wrapped}\n` } }) @@ -2587,9 +2602,28 @@ async function generateBlockDoc(blockPath: string) { continue } - // Canonical integrations filter: docs are written only for third-party tool blocks - // visible in the toolbar. Source of truth: `isIntegrationBlock`. - if (!isIntegrationBlock(blockConfig)) continue + if ( + blockConfig.type.includes('_trigger') || + blockConfig.type.includes('_webhook') || + blockConfig.type.includes('rss') + ) { + console.log(`Skipping ${blockConfig.type} - contains '_trigger'`) + continue + } + + if ( + (blockConfig.category === 'blocks' && + !NATIVE_RESOURCE_BLOCK_TYPES.has(stripVersionSuffix(blockConfig.type))) || + blockConfig.type === 'evaluator' || + blockConfig.type === 'number' || + blockConfig.type === 'webhook' || + blockConfig.type === 'schedule' || + blockConfig.type === 'mcp' || + blockConfig.type === 'generic_webhook' || + blockConfig.type === 'rss' + ) { + continue + } // Use stripped type for file name (removes _v2, _v3 suffixes for cleaner URLs) const displayType = stripVersionSuffix(blockConfig.type) @@ -2699,7 +2733,7 @@ async function generateMarkdownForBlock( let toolsSection = '' if (tools.access?.length) { - toolsSection = '## Tools\n\n' + toolsSection = '## Actions\n\n' for (const tool of tools.access) { // Strip version suffix from tool name for display @@ -2832,8 +2866,14 @@ async function getCanonicalToolDocNames(): Promise> { const configs = extractAllBlockConfigs(fileContent) for (const config of configs) { - if (!isIntegrationBlock(config)) continue - validToolDocs.add(stripVersionSuffix(config.type)) + // Match the writer filter: integration blocks, the documented + // native-resource blocks (category 'blocks'), and trigger-only service + // blocks (category 'triggers') whose pages the trigger pass writes. + const stripped = config.type ? stripVersionSuffix(config.type) : '' + const isDocumentedResource = NATIVE_RESOURCE_BLOCK_TYPES.has(stripped) + const isTriggerService = config.category === 'triggers' && !config.hideFromToolbar + if (!isIntegrationBlock(config) && !isDocumentedResource && !isTriggerService) continue + validToolDocs.add(stripped) } } @@ -2857,7 +2897,7 @@ function cleanupStaleToolDocs(validToolDocs: Set): void { for (const docFile of existingDocs) { const blockType = path.basename(docFile, '.mdx') - if (blockType === 'index') continue + if (HANDWRITTEN_INTEGRATION_DOCS.has(blockType)) continue if (validToolDocs.has(blockType)) continue const docPath = path.join(DOCS_OUTPUT_PATH, docFile) @@ -3474,24 +3514,22 @@ function toSemanticType(uiType: string): string { * Generate MDX content for a single trigger provider page. * Matches the structure of tool docs: ## Triggers, ### `trigger_id`, #### Configuration / Output. */ -function generateTriggerProviderDoc( - provider: string, - triggers: TriggerFullInfo[], - blockType: string, - providerColor: string -): string { - const providerName = formatTriggerProviderName(provider) - const count = triggers.length +/** + * Build the "## Triggers" section for an integration page. A trigger is a block + * that starts a workflow, so this is appended to the service's actions page (or + * used as the body of a trigger-only service page). + */ +function buildTriggersSection(triggers: TriggerFullInfo[]): string { const allPolling = triggers.every((t) => t.polling) const mixedTypes = triggers.some((t) => t.polling) && triggers.some((t) => !t.polling) let typeNote = '' if (allPolling) { typeNote = - '\nAll triggers below are **polling-based** — they check for new data on a schedule rather than receiving push notifications.\n' + '\nThese run on a schedule \\(**polling-based**\\) — they check for new data rather than receiving push notifications.\n' } else if (mixedTypes) { typeNote = - '\nSome triggers below are **polling-based** \\(checked on a schedule\\) while others are push-based webhooks.\n' + '\nSome of these are **polling-based** \\(checked on a schedule\\) while others are push-based webhooks.\n' } let triggersSection = '' @@ -3534,9 +3572,24 @@ function generateTriggerProviderDoc( triggersSection += separator } + return `## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. +${typeNote} +${triggersSection}` +} + +/** Standalone page for a trigger-only service (no actions block). */ +function generateTriggerProviderDoc( + provider: string, + triggers: TriggerFullInfo[], + blockType: string, + providerColor: string +): string { + const providerName = formatTriggerProviderName(provider) return `--- title: ${providerName} -description: Available ${providerName} triggers for automating workflows +description: ${providerName} triggers for automating workflows --- import { BlockInfoCard } from "@/components/ui/block-info-card" @@ -3546,35 +3599,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="${providerColor}" /> -${providerName} provides ${count} trigger${count === 1 ? '' : 's'} for automating workflows based on events. -${typeNote} -## Triggers - -${triggersSection}` -} - -/** - * Update triggers/meta.json, preserving hand-written entries and appending - * generated provider pages sorted alphabetically. - */ -function updateTriggerMetaJson(generatedProviders: string[]): void { - const metaJsonPath = path.join(TRIGGER_DOCS_OUTPUT_PATH, 'meta.json') - - let existingPages: string[] = [] - if (fs.existsSync(metaJsonPath)) { - try { - existingPages = JSON.parse(fs.readFileSync(metaJsonPath, 'utf-8')).pages ?? [] - } catch { - existingPages = [] - } - } - - const handWritten = existingPages.filter((p) => HANDWRITTEN_TRIGGER_DOCS.has(p)) - const sortedGenerated = [...generatedProviders].sort() - const pages = [...handWritten, ...sortedGenerated] - - fs.writeFileSync(metaJsonPath, `${JSON.stringify({ pages }, null, 2)}\n`) - console.log(`✓ Updated trigger meta.json with ${pages.length} entries`) +${buildTriggersSection(triggers)}` } /** @@ -3623,51 +3648,50 @@ async function generateAllTriggerDocs(): Promise { continue } - const outputFilePath = path.join(TRIGGER_DOCS_OUTPUT_PATH, `${provider}.mdx`) + // The trigger lives on the same per-service integration page as the + // service's actions (provider ≠ block type for a few services). + const blockType = PROVIDER_TO_BLOCK_TYPE[provider] ?? provider + const outputFilePath = path.join(DOCS_OUTPUT_PATH, `${blockType}.mdx`) + const baseName = path.basename(outputFilePath, '.mdx') - // Never overwrite hand-written docs - if (fs.existsSync(outputFilePath)) { - const baseName = path.basename(outputFilePath, '.mdx') - if (HANDWRITTEN_TRIGGER_DOCS.has(baseName)) { - console.log(`Skipping ${provider} — hand-written doc exists`) - continue - } + if (HANDWRITTEN_INTEGRATION_DOCS.has(baseName) || HANDWRITTEN_TRIGGER_DOCS.has(baseName)) { + console.log(`Skipping ${provider} — hand-written page`) + continue } - // Resolve the block type to use for BlockInfoCard (handles provider ≠ block type) - const blockType = PROVIDER_TO_BLOCK_TYPE[provider] ?? provider - const providerColor = colorMap.get(blockType) ?? '#6B7280' - - const existingContent = fs.existsSync(outputFilePath) + const existing = fs.existsSync(outputFilePath) ? fs.readFileSync(outputFilePath, 'utf-8') : null - // Only preserve manual sections that have actual user-authored content. - // Empty markers (left from a prior generation) are silently discarded so - // they don't accumulate on each subsequent run. - const rawSections = existingContent ? extractManualContent(existingContent) : {} - const manualSections = Object.fromEntries( - Object.entries(rawSections).filter(([, v]) => v.length > 0) - ) - - const markdown = generateTriggerProviderDoc(provider, triggers, blockType, providerColor) - - const finalContent = - Object.keys(manualSections).length > 0 - ? mergeWithManualContent(markdown, existingContent, manualSections) - : markdown + if (existing?.includes('\n## Actions')) { + // Actions page generated this run by the block pass — append the Triggers section. + if (!existing.includes('\n## Triggers')) { + fs.appendFileSync(outputFilePath, `\n${buildTriggersSection(triggers)}`) + } + } else { + // Trigger-only service (no actions block) — (re)write the standalone page, + // preserving manual content from the previous run. Cleanup spares these + // pages (category 'triggers' blocks are in the canonical set). + const providerColor = colorMap.get(blockType) ?? '#6B7280' + const markdown = generateTriggerProviderDoc(provider, triggers, blockType, providerColor) + const rawSections = existing ? extractManualContent(existing) : {} + const manualSections = Object.fromEntries( + Object.entries(rawSections).filter(([, v]) => v.length > 0) + ) + const finalContent = + Object.keys(manualSections).length > 0 + ? mergeWithManualContent(markdown, existing, manualSections) + : markdown + fs.writeFileSync(outputFilePath, finalContent) + } - fs.writeFileSync(outputFilePath, finalContent) - generatedProviders.push(provider) + generatedProviders.push(blockType) console.log( - `✓ Generated trigger docs for ${formatTriggerProviderName(provider)} (${triggers.length} trigger${triggers.length === 1 ? '' : 's'})` + `✓ Triggers for ${formatTriggerProviderName(provider)} (${triggers.length} trigger${triggers.length === 1 ? '' : 's'})` ) } - updateTriggerMetaJson(generatedProviders) - console.log( - `✓ Trigger documentation generation complete: ${generatedProviders.length} provider pages` - ) + console.log(`✓ Trigger sections merged into ${generatedProviders.length} integration pages`) } catch (error) { console.error('Error generating trigger documentation:', error) } @@ -3698,11 +3722,12 @@ async function generateAllBlockDocs() { await generateBlockDoc(blockFile) } - updateMetaJson() - - // Generate trigger provider documentation + // Merge trigger sections into the per-service pages (and write trigger-only pages) await generateAllTriggerDocs() + // Write the integrations meta after both passes so trigger-only pages are included + updateMetaJson() + return true } catch (error) { console.error('Error generating documentation:', error)