# Connector and provider operations

_How connection-backed operations are described and selected, followed by every legacy connector and provider operation implemented in the source registry._

Canonical: https://snoze.dev/help/integrations/

Snoze has two operation catalogs. Legacy **connector operations** build a
guarded HTTP request from connector-owned settings and run input. New
**provider operations** come from the integration-provider registry, use
browsable resources and richer field metadata, and declare whether they mutate
provider data or need confirmation.

Both require a workspace Connection. Availability depends on what the
workspace has connected and what the provider adapter implements. A catalog
entry is not evidence that a particular workspace is authorised for it.

## Legacy connector summaries

A `ConnectorOperationSummary` contains connector and operation machine names,
readable labels, a description, `settingsFields`, `inputFields`, and an
optional produced `outputShape`.

Each field declares name, label, required flag, and type: text, email, number,
boolean, or select. It may also declare select options, a secret flag, and a
placeholder. **Settings** are saved with the Action or Automation node, such as
a repository or project. **Run input** can be supplied each time, such as a
message or issue title. A declared Object shape gives later nodes named tokens;
without one, the raw parsed response is still available but its paths are not
catalogued.

An Automation connector node saves connector and operation, not a Connection
ID. At run time Snoze chooses the oldest installed matching connection,
tie-breaking by ID. Removing it promotes the next matching connection. An
Action connector configuration instead saves an exact `connectionId`.

The following entries are generated from the kernel connector definitions.

<!-- GENERATED:legacy-connector-operations:START -->

### Slack: Post message `connector:slack/post_message`

Post a message to a Slack channel.

- Settings: None.
- Run input: `channel` (Channel; text, required, placeholder: C012345); `text` (Message; text, required).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### GitHub: Create issue `connector:github/create_issue`

Create an issue in a GitHub repository.

- Settings: `owner` (Owner; text, required); `repository` (Repository; text, required).
- Run input: `title` (Title; text, required); `body` (Body; text, optional).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Discord: Create message `connector:discord/create_message`

Send a message to a Discord channel using a bot connection.

- Settings: `channelId` (Channel ID; text, required).
- Run input: `content` (Message; text, required).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Linear: Create issue `connector:linear/create_issue`

Create an issue in a Linear team.

- Settings: `teamId` (Team ID; text, required).
- Run input: `title` (Title; text, required); `description` (Description; text, optional).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Notion: Create page `connector:notion/create_page`

Create a page in a Notion page or database.

- Settings: `parentId` (Parent ID; text, required).
- Run input: `title` (Title; text, required).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### HubSpot: Create contact `connector:hubspot/create_contact`

Create a contact in HubSpot.

- Settings: None.
- Run input: `email` (Email; email, required); `firstname` (First name; text, optional); `lastname` (Last name; text, optional).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Stripe: Create customer `connector:stripe/create_customer`

Create a customer in Stripe.

- Settings: None.
- Run input: `email` (Email; email, required); `name` (Name; text, optional).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Jira: Create issue `connector:jira/create_issue`

Create an issue in Jira Cloud.

- Settings: `site` (Site; text, required, placeholder: acme.atlassian.net); `projectKey` (Project key; text, required).
- Run input: `summary` (Summary; text, required); `issueType` (Issue type; text, optional, placeholder: Task).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Zendesk: Create ticket `connector:zendesk/create_ticket`

Create a support ticket in Zendesk.

- Settings: `subdomain` (Subdomain; text, required).
- Run input: `subject` (Subject; text, required); `comment` (Comment; text, required).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

### Twilio: Send message `connector:twilio/send_message`

Send an SMS or WhatsApp message through Twilio.

- Settings: `accountSid` (Account SID; text, required); `from` (From number; text, required).
- Run input: `to` (To number; text, required); `body` (Message; text, required).
- Produced value: No named output shape is declared. The provider's parsed response is available as a raw step result, so later steps must use a raw path rather than a named token.

<!-- GENERATED:legacy-connector-operations:END -->

## Provider operation summaries

A provider operation contains provider and operation IDs, label, description,
resource types, and typed input fields. Field kinds are string, rich text,
number, boolean, JSON, resource, string array, duration, or enum. A resource
field can name its browse resource type and a parent field; an enum can carry
options; either may accept multiple values. Fields can also be advanced,
identify title/body roles and message-composer groups, and define a default
path from the triggering event.

The summary also declares output shape, destination text syntax, whether the
operation mutates data, whether it requires confirmation, and which mounted
object should refresh after success. An Automation provider node and a
Provider-operation Action both save an exact Connection ID. Their input is
checked against the live summary, and ResourceRefs are converted to external
IDs only at the adapter boundary.

The following catalog is generated from every provider and operation currently
registered by `@workspace/integrations`. It is intentionally broader than the
operations visible in any one workspace.

<!-- GENERATED:provider-operations:START -->

### Airtable: Custom API request `provider:airtable/api.custom_request`

Advanced request using this connection. Paths are relative to https://api.airtable.com/v0/

- Connection: Requires a connected Airtable account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://api.airtable.com/v0/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### ClickUp: Custom API request `provider:clickup/api.custom_request`

Advanced request using this connection. Paths are relative to https://api.clickup.com/api/v2/

- Connection: Requires a connected ClickUp account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://api.clickup.com/api/v2/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### ClickUp: Comment on ClickUp task `provider:clickup/task.comment`

Add a text comment to a task.

- Connection: Requires a connected ClickUp account. Resource types: `clickup.task`.
- Inputs: `taskId` (Task ID; string, optional); `commentText` (Comment; string, required, role: body); `notifyAll` (Notify all assignees; boolean, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `comment`.
- Text syntax: plain.

### ClickUp: Create ClickUp task `provider:clickup/task.create`

Create a task in a ClickUp List with native custom fields.

- Connection: Requires a connected ClickUp account. Resource types: `clickup.list`.
- Inputs: `listId` (List ID; string, optional); `name` (Task name; string, required, role: title); `description` (Description; string, optional, role: body); `assignees` (Assignee IDs; string_array, optional); `tags` (Tags; string_array, optional); `status` (Status; string, optional); `priority` (Priority; number, optional); `due_date` (Due date (milliseconds); number, optional); `custom_fields` (Custom fields; json, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `task`.
- Text syntax: plain.

### ClickUp: Update ClickUp task `provider:clickup/task.update`

Update status, ownership, dates, priority, or content.

- Connection: Requires a connected ClickUp account. Resource types: `clickup.task`.
- Inputs: `taskId` (Task ID; string, optional); `changes` (Task changes; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `task`.
- Text syntax: markdown.

### ClickUp: Create ClickUp time entry `provider:clickup/time_entry.create`

Record tracked time against a ClickUp task.

- Connection: Requires a connected ClickUp account. Resource types: `clickup.workspace`, `clickup.task`.
- Inputs: `teamId` (Workspace ID; string, optional); `taskId` (Task ID; string, required); `start` (Start (milliseconds); number, required); `duration` (Duration (milliseconds); number, required); `description` (Description; string, optional); `billable` (Billable; boolean, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `time_entry`.
- Text syntax: markdown.

### Discord: Add Discord member role `provider:discord/member.add_role`

Add a role to a server member.

- Connection: Requires a connected Discord account. Resource types: `discord.member`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild); `userId` (Member; resource, required, resource: discord.member, after: guildId); `roleId` (Role; resource, required, resource: discord.role, after: guildId).
- Produced value: Discord result: `success` (boolean).
- Effect: changes provider data; confirmation required; refreshes `member`.
- Text syntax: markdown.

### Discord: Edit Discord bot message `provider:discord/message.edit`

Edit a message created by the Snoze bot.

- Connection: Requires a connected Discord account. Resource types: `discord.message`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild); `channelId` (Channel; resource, required, resource: discord.channel, after: guildId); `messageId` (Message; resource, required, resource: discord.message, after: channelId); `content` (Content; rich_text, optional, composer: message); `embedTitle` (Embed title; string, optional, advanced, composer: embed); `embedDescription` (Embed text; rich_text, optional, advanced, composer: embed); `embedUrl` (Embed link; string, optional, advanced, composer: embedDetail, placeholder: https://…) — Open this URL when someone clicks the embed title; `embedAuthor` (Embed author; string, optional, advanced, composer: embedDetail); `embedAuthorUrl` (Author link; string, optional, advanced, composer: embedDetail, placeholder: https://…); `embedAuthorIconUrl` (Author icon URL; string, optional, advanced, composer: embedDetail); `embedColor` (Embed color; string, optional, advanced, composer: embedDetail, placeholder: #5865F2) — Hex color for the embed's accent bar; `embedImageUrl` (Embed image URL; string, optional, advanced, composer: embedDetail); `embedFooter` (Embed footer; string, optional, advanced, composer: embedDetail); `embedFooterIconUrl` (Footer icon URL; string, optional, advanced, composer: embedDetail); `embedThumbnailUrl` (Embed thumbnail URL; string, optional, advanced, composer: embedDetail); `embedFields` (Embed fields; json, optional, advanced, composer: embedDetail) — A list of name, value, and optional inline properties; `embedTimestamp` (Embed timestamp; string, optional, advanced, composer: embedDetail, placeholder: 2026-08-19T12:00:00Z); `embedPayload` (Payload embed; json, optional, advanced, composer: hidden); `embedPayloadOptions` (Payload presentation; json, optional, advanced, composer: hidden); `embeds` (Embeds (raw JSON); json, optional, advanced, composer: raw).
- Produced value: Discord message: `id` (text), `content` (rich_text), `channel_id` (text), `timestamp` (date).
- Effect: changes provider data; refreshes `message`.
- Text syntax: markdown.

### Discord: Post Discord message `provider:discord/message.post`

Post a bot message with embeds and components.

- Connection: Requires a connected Discord account. Resource types: `discord.channel`, `discord.thread`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild); `channelId` (Channel; resource, required, resource: discord.channel, after: guildId); `content` (Content; rich_text, optional, composer: message); `embedTitle` (Embed title; string, optional, advanced, composer: embed); `embedDescription` (Embed text; rich_text, optional, advanced, composer: embed); `embedUrl` (Embed link; string, optional, advanced, composer: embedDetail, placeholder: https://…) — Open this URL when someone clicks the embed title; `embedAuthor` (Embed author; string, optional, advanced, composer: embedDetail); `embedAuthorUrl` (Author link; string, optional, advanced, composer: embedDetail, placeholder: https://…); `embedAuthorIconUrl` (Author icon URL; string, optional, advanced, composer: embedDetail); `embedColor` (Embed color; string, optional, advanced, composer: embedDetail, placeholder: #5865F2) — Hex color for the embed's accent bar; `embedImageUrl` (Embed image URL; string, optional, advanced, composer: embedDetail); `embedFooter` (Embed footer; string, optional, advanced, composer: embedDetail); `embedFooterIconUrl` (Footer icon URL; string, optional, advanced, composer: embedDetail); `embedThumbnailUrl` (Embed thumbnail URL; string, optional, advanced, composer: embedDetail); `embedFields` (Embed fields; json, optional, advanced, composer: embedDetail) — A list of name, value, and optional inline properties; `embedTimestamp` (Embed timestamp; string, optional, advanced, composer: embedDetail, placeholder: 2026-08-19T12:00:00Z); `embedPayload` (Payload embed; json, optional, advanced, composer: hidden); `embedPayloadOptions` (Payload presentation; json, optional, advanced, composer: hidden); `embeds` (Embeds (raw JSON); json, optional, advanced, composer: raw); `components` (Components; json, optional, advanced, composer: raw).
- Produced value: Discord message: `id` (text), `content` (rich_text), `channel_id` (text), `timestamp` (date).
- Effect: changes provider data; confirmation required; refreshes `message`.
- Text syntax: markdown.

### Discord: React to Discord message `provider:discord/message.react`

Add an emoji reaction to a message.

- Connection: Requires a connected Discord account. Resource types: `discord.message`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild); `channelId` (Channel; resource, required, resource: discord.channel, after: guildId); `messageId` (Message; resource, required, resource: discord.message, after: channelId); `emoji` (Emoji; string, required).
- Produced value: Discord result: `success` (boolean).
- Effect: changes provider data; refreshes `message`.
- Text syntax: markdown.

### Discord: Reply to Discord message `provider:discord/message.reply`

Reply to a message in a channel or thread.

- Connection: Requires a connected Discord account. Resource types: `discord.message`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild, event default: payload.guildId); `channelId` (Channel; resource, required, resource: discord.channel, after: guildId, event default: payload.object.channel_id); `messageId` (Message; resource, required, resource: discord.message, after: channelId, event default: payload.object.id); `content` (Content; rich_text, optional, composer: message); `embedTitle` (Embed title; string, optional, advanced, composer: embed); `embedDescription` (Embed text; rich_text, optional, advanced, composer: embed); `embedUrl` (Embed link; string, optional, advanced, composer: embedDetail, placeholder: https://…) — Open this URL when someone clicks the embed title; `embedAuthor` (Embed author; string, optional, advanced, composer: embedDetail); `embedAuthorUrl` (Author link; string, optional, advanced, composer: embedDetail, placeholder: https://…); `embedAuthorIconUrl` (Author icon URL; string, optional, advanced, composer: embedDetail); `embedColor` (Embed color; string, optional, advanced, composer: embedDetail, placeholder: #5865F2) — Hex color for the embed's accent bar; `embedImageUrl` (Embed image URL; string, optional, advanced, composer: embedDetail); `embedFooter` (Embed footer; string, optional, advanced, composer: embedDetail); `embedFooterIconUrl` (Footer icon URL; string, optional, advanced, composer: embedDetail); `embedThumbnailUrl` (Embed thumbnail URL; string, optional, advanced, composer: embedDetail); `embedFields` (Embed fields; json, optional, advanced, composer: embedDetail) — A list of name, value, and optional inline properties; `embedTimestamp` (Embed timestamp; string, optional, advanced, composer: embedDetail, placeholder: 2026-08-19T12:00:00Z); `embedPayload` (Payload embed; json, optional, advanced, composer: hidden); `embedPayloadOptions` (Payload presentation; json, optional, advanced, composer: hidden).
- Produced value: Discord message: `id` (text), `content` (rich_text), `channel_id` (text), `timestamp` (date).
- Effect: changes provider data; confirmation required; refreshes `message`.
- Text syntax: markdown.

### Discord: Create Discord thread `provider:discord/thread.create`

Create a thread under a channel or message.

- Connection: Requires a connected Discord account. Resource types: `discord.channel`, `discord.message`.
- Inputs: `guildId` (Server; resource, required, resource: discord.guild); `channelId` (Channel; resource, required, resource: discord.channel, after: guildId); `messageId` (Message; resource, optional, resource: discord.message, after: channelId); `name` (Thread name; string, required); `autoArchiveDuration` (Auto archive minutes; number, optional, advanced).
- Produced value: Discord thread: `id` (text), `name` (text), `parent_id` (text).
- Effect: changes provider data; refreshes `thread`.
- Text syntax: markdown.

### Discord: Execute Discord webhook `provider:discord/webhook.execute`

Post a message through a Discord channel webhook.

- Connection: Requires a connected Discord account. Resource types: none declared.
- Inputs: `webhookUrl` (Webhook URL; string, required); `content` (Message; rich_text, optional, composer: message); `embedTitle` (Embed title; string, optional, advanced, composer: embed); `embedDescription` (Embed text; rich_text, optional, advanced, composer: embed); `embedUrl` (Embed link; string, optional, advanced, composer: embedDetail, placeholder: https://…) — Open this URL when someone clicks the embed title; `embedAuthor` (Embed author; string, optional, advanced, composer: embedDetail); `embedAuthorUrl` (Author link; string, optional, advanced, composer: embedDetail, placeholder: https://…); `embedAuthorIconUrl` (Author icon URL; string, optional, advanced, composer: embedDetail); `embedColor` (Embed color; string, optional, advanced, composer: embedDetail, placeholder: #5865F2) — Hex color for the embed's accent bar; `embedImageUrl` (Embed image URL; string, optional, advanced, composer: embedDetail); `embedFooter` (Embed footer; string, optional, advanced, composer: embedDetail); `embedFooterIconUrl` (Footer icon URL; string, optional, advanced, composer: embedDetail); `embedThumbnailUrl` (Embed thumbnail URL; string, optional, advanced, composer: embedDetail); `embedFields` (Embed fields; json, optional, advanced, composer: embedDetail) — A list of name, value, and optional inline properties; `embedTimestamp` (Embed timestamp; string, optional, advanced, composer: embedDetail, placeholder: 2026-08-19T12:00:00Z); `embedPayload` (Payload embed; json, optional, advanced, composer: hidden); `embedPayloadOptions` (Payload presentation; json, optional, advanced, composer: hidden); `embeds` (Embeds (raw JSON); json, optional, advanced, composer: raw).
- Produced value: Discord message: `id` (text), `content` (rich_text), `channel_id` (text), `timestamp` (date).
- Effect: changes provider data; confirmation required; refreshes `message`.
- Text syntax: markdown.

### GitHub: Custom API request `provider:github/api.custom_request`

Advanced request using this connection. Paths are relative to https://api.github.com/

- Connection: Requires a connected GitHub account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://api.github.com/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### GitHub: Close GitHub issue `provider:github/repository.close_issue`

Update the state of a GitHub issue or pull request.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation.
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data.
- Text syntax: markdown.

### GitHub: Close pull request `provider:github/repository.close_pull_request`

Update the state of a GitHub issue or pull request.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation.
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data.
- Text syntax: markdown.

### GitHub: Comment on issue or pull request `provider:github/repository.comment_issue`

Add a comment to an issue or pull request.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`, `github.issue`, `github.pull_request`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Issue number; number, required) — Usually filled from the pull request or issue that triggered this automation; `body` (Comment; rich_text, required, role: body).
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### GitHub: Create GitHub issue `provider:github/repository.create_issue`

Create an issue in a linked repository.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `title` (Title; string, required, role: title); `body` (Body; rich_text, optional, role: body); `labels` (Labels; resource, optional, multiple, resource: github.label, after: repository).
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### GitHub: Comment on a pull request line `provider:github/repository.create_review_comment`

Add an inline review comment on a specific file + line.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation; `body` (Comment; rich_text, required, role: body); `commit_id` (Commit SHA; string, required, advanced); `path` (File path; string, required); `line` (Line; number, required); `side` (Diff side; enum, optional, advanced, options: RIGHT | LEFT).
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data.
- Text syntax: markdown.

### GitHub: Fetch pull request review context `provider:github/repository.get_pull_request_context`

Fetch PR metadata, changed files and patches, issue comments, reviews, inline comments, commits, and checks for an AI review.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`, `github.pull_request`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Pull request number; number, required) — Usually filled from the pull request or issue that triggered this automation.
- Produced value: Pull request review context: `pull` (object) { `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url) }, `files` (list) { `path` (text), `sha` (text), `content` (rich_text) }, `comments` (list) { `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url) }.
- Effect: read-only.
- Text syntax: markdown.

### GitHub: Merge pull request `provider:github/repository.merge_pull_request`

Merge a GitHub pull request.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation; `method` (Merge method; enum, optional, options: merge | squash | rebase).
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### GitHub: Reopen GitHub issue `provider:github/repository.reopen_issue`

Update the state of a GitHub issue or pull request.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation.
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data.
- Text syntax: markdown.

### GitHub: Submit pull request review `provider:github/repository.submit_review`

Approve, request changes on, or comment on a pull request as a review.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `number` (Number; number, required) — Usually filled from the pull request or issue that triggered this automation; `event` (Review decision; enum, required, options: COMMENT | APPROVE | REQUEST_CHANGES); `body` (Review body; rich_text, optional, role: body).
- Produced value: GitHub object: `id` (number), `number` (number), `title` (text), `body` (rich_text), `state` (status), `html_url` (url).
- Effect: changes provider data.
- Text syntax: markdown.

### GitHub: Commit file change `provider:github/repository.update_file`

Create or update a file and commit it to a repository branch.

- Connection: Requires a connected GitHub account. Resource types: `github.repository`, `github.file`.
- Inputs: `repository` (Repository; resource, optional, resource: github.repository); `path` (Path; string, required); `content` (Content; rich_text, required); `message` (Commit message; string, required); `branch` (Branch; resource, optional, resource: github.branch, after: repository); `sha` (Current file SHA; string, optional, advanced).
- Produced value: GitHub file: `path` (text), `sha` (text), `content` (rich_text).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### Google Workspace: Custom API request `provider:google_workspace/api.custom_request`

Advanced request using this connection. Paths are relative to https://www.googleapis.com/

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://www.googleapis.com/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### Google Workspace: Create calendar event `provider:google_workspace/calendar_event.create`

Create an event in Google Calendar.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `calendarId` (Calendar; resource, optional, resource: google.calendar) — Leave empty for your main calendar; `summary` (Title; string, optional, role: title); `start` (Starts; string, optional, placeholder: 2026-10-01T09:00:00Z) — A date alone (2026-10-01) makes an all-day event; `end` (Ends; string, optional, placeholder: 2026-10-01T10:00:00Z) — For an all-day event, the day after the last day. Leave empty for a one-day event; `description` (Description; rich_text, optional, role: body); `timeZone` (Time zone; string, optional, advanced, placeholder: Europe/Berlin) — Times without an offset are read in this zone. Without one they are UTC; `event` (Full event (Google Calendar JSON); json, optional, advanced).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `calendar_event`.
- Text syntax: plain.

### Google Workspace: Delete calendar event `provider:google_workspace/calendar_event.delete`

Delete an event from Google Calendar.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `calendarId` (Calendar; resource, optional, resource: google.calendar) — Leave empty for your main calendar; `eventId` (Event; string, required) — Map the event ID from the trigger or an earlier step.
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `calendar_event`.
- Text syntax: markdown.

### Google Workspace: Update calendar event `provider:google_workspace/calendar_event.update`

Change an event's time, guests, or details.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `calendarId` (Calendar; resource, optional, resource: google.calendar) — Leave empty for your main calendar; `eventId` (Event; string, required) — Map the event ID from the trigger or an earlier step; `changes` (Changes (Google Calendar JSON); json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `calendar_event`.
- Text syntax: markdown.

### Google Workspace: Edit Google document `provider:google_workspace/docs.batch_update`

Apply edits to a Google Doc, keeping everything else intact.

- Connection: Requires a connected Google Workspace account. Resource types: `google.docs.document`.
- Inputs: `requests` (Edits (Google Docs JSON); json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### Google Workspace: Create Drive file `provider:google_workspace/drive_file.create`

Create a text file in Google Drive.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `name` (Name; string, required, role: title); `content` (Content; rich_text, optional, role: body); `parentId` (Folder; resource, optional, resource: google.drive.folder) — Leave empty to create it in My Drive.
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `drive_file`.
- Text syntax: plain.

### Google Workspace: Create Drive folder `provider:google_workspace/drive.create_folder`

Create a folder in Google Drive.

- Connection: Requires a connected Google Workspace account. Resource types: `google.drive.folder`.
- Inputs: `name` (Name; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `drive_file`.
- Text syntax: markdown.

### Google Workspace: Rename Drive item `provider:google_workspace/drive.rename`

Rename a file or folder in Google Drive.

- Connection: Requires a connected Google Workspace account. Resource types: `google.drive.folder`, `google.drive.file`, `google.docs.document`, `google.sheets.spreadsheet`.
- Inputs: `name` (Name; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### Google Workspace: Create Gmail draft `provider:google_workspace/gmail.draft_create`

Write a draft to review and send yourself.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `to` (To; string_array, optional, placeholder: Type an email address and press Enter); `subject` (Subject; string, optional, role: title); `body` (Message; rich_text, optional, role: body); `cc` (Cc; string_array, optional, advanced); `bcc` (Bcc; string_array, optional, advanced).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `gmail_message`.
- Text syntax: plain.

### Google Workspace: Change Gmail labels `provider:google_workspace/gmail.modify_labels`

Add or remove labels on an email.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `messageId` (Email; string, required, event default: payload.email.id) — The triggering email, unless you map another; `addLabelIds` (Add labels; resource, optional, multiple, resource: google.gmail.label); `removeLabelIds` (Remove labels; resource, optional, multiple, resource: google.gmail.label).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `gmail_message`.
- Text syntax: markdown.

### Google Workspace: Reply to Gmail thread `provider:google_workspace/gmail.reply`

Reply in the email's thread, to whoever wrote last.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `threadId` (Thread; string, required, event default: payload.email.threadId) — The triggering email's thread, unless you map another; `body` (Message; rich_text, required, role: body); `to` (To; string_array, optional, advanced) — Leave empty to reply to the sender; `cc` (Cc; string_array, optional, advanced); `bcc` (Bcc; string_array, optional, advanced).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `gmail_message`.
- Text syntax: plain.

### Google Workspace: Send Gmail message `provider:google_workspace/gmail.send`

Send an email from the connected Gmail account.

- Connection: Requires a connected Google Workspace account. Resource types: none declared.
- Inputs: `to` (To; string_array, required, placeholder: Type an email address and press Enter); `subject` (Subject; string, optional, role: title); `body` (Message; rich_text, required, role: body); `cc` (Cc; string_array, optional, advanced); `bcc` (Bcc; string_array, optional, advanced).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `gmail_message`.
- Text syntax: plain.

### Google Workspace: Update sheet cells `provider:google_workspace/sheets.update_values`

Write values into a range of a Google Sheet.

- Connection: Requires a connected Google Workspace account. Resource types: `google.sheets.spreadsheet`.
- Inputs: `range` (Range; string, required, placeholder: Sheet1!A1:C3); `values` (Values (rows of cells); json, required, placeholder: [["Name", "Total"]]).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### HubSpot: Custom API request `provider:hubspot/api.custom_request`

Advanced request using this connection. Paths are relative to https://api.hubapi.com/

- Connection: Requires a connected HubSpot account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://api.hubapi.com/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### HubSpot: Create HubSpot contact `provider:hubspot/contact.create`

Create a CRM contact.

- Connection: Requires a connected HubSpot account. Resource types: none declared.
- Inputs: `email` (Email; string, required); `firstname` (First name; string, optional); `lastname` (Last name; string, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `contact`.
- Text syntax: markdown.

### HubSpot: Update HubSpot deal `provider:hubspot/deal.update`

Update properties on a CRM deal.

- Connection: Requires a connected HubSpot account. Resource types: none declared.
- Inputs: `dealId` (Deal ID; string, required); `properties` (Properties; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `deal`.
- Text syntax: markdown.

### HubSpot: Create HubSpot ticket `provider:hubspot/ticket.create`

Create a CRM ticket.

- Connection: Requires a connected HubSpot account. Resource types: none declared.
- Inputs: `subject` (Subject; string, required, role: title); `content` (Description; string, optional, role: body); `priority` (Priority; string, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `ticket`.
- Text syntax: plain.

### Jira: Comment on Jira issue `provider:jira/issue.comment`

Add an Atlassian document-format comment.

- Connection: Requires a connected Jira account. Resource types: `jira.issue`.
- Inputs: `issueIdOrKey` (Issue; string, optional); `body` (Comment body; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### Jira: Create Jira issue `provider:jira/issue.create`

Create an issue with native Jira fields.

- Connection: Requires a connected Jira account. Resource types: `jira.project`.
- Inputs: `fields` (Issue fields; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### Jira: Transition Jira issue `provider:jira/issue.transition`

Move an issue through its configured workflow.

- Connection: Requires a connected Jira account. Resource types: `jira.issue`.
- Inputs: `issueIdOrKey` (Issue; string, optional); `transitionId` (Transition ID; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### Jira: Update Jira issue `provider:jira/issue.update`

Update fields on a Jira issue.

- Connection: Requires a connected Jira account. Resource types: `jira.issue`.
- Inputs: `issueIdOrKey` (Issue; string, optional); `fields` (Fields; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### Jira: Log Jira work `provider:jira/worklog.create`

Add a worklog with duration and start time.

- Connection: Requires a connected Jira account. Resource types: `jira.issue`.
- Inputs: `issueIdOrKey` (Issue; string, optional); `timeSpentSeconds` (Seconds; number, required); `started` (Started; string, optional); `comment` (Comment; json, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `worklog`.
- Text syntax: markdown.

### Linear: Comment on Linear issue `provider:linear/issue.comment`

Add a comment to a Linear issue.

- Connection: Requires a connected Linear account. Resource types: none declared.
- Inputs: `issueId` (Issue; resource, required, resource: linear.issue); `body` (Comment; string, required, role: body).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `issue`.
- Text syntax: markdown.

### Linear: Create Linear issue `provider:linear/issue.create`

Create an issue in a Linear team.

- Connection: Requires a connected Linear account. Resource types: none declared.
- Inputs: `teamId` (Team; resource, required, resource: linear.team); `title` (Title; string, required, role: title); `description` (Description; string, optional, role: body).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `issue`.
- Text syntax: markdown.

### Linear: Update Linear issue `provider:linear/issue.update`

Update any supported Linear issue field.

- Connection: Requires a connected Linear account. Resource types: none declared.
- Inputs: `issueId` (Issue; resource, required, resource: linear.issue); `changes` (Changes; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `issue`.
- Text syntax: markdown.

### Microsoft 365: Custom API request `provider:microsoft_365/api.custom_request`

Advanced request using this connection. Paths are relative to https://graph.microsoft.com/v1.0/

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://graph.microsoft.com/v1.0/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### Microsoft 365: Create Outlook event `provider:microsoft_365/calendar_event.create`

Create an Outlook calendar event with attendees and recurrence.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `event` (Event; json, required); `calendarId` (Calendar ID; string, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `calendar_event`.
- Text syntax: markdown.

### Microsoft 365: Delete Outlook event `provider:microsoft_365/calendar_event.delete`

Delete an event from Outlook Calendar.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `eventId` (Event ID; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `calendar_event`.
- Text syntax: markdown.

### Microsoft 365: Update Outlook event `provider:microsoft_365/calendar_event.update`

Update an existing Outlook calendar event.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `eventId` (Event ID; string, required); `changes` (Changes; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `calendar_event`.
- Text syntax: markdown.

### Microsoft 365: Reply to Outlook email `provider:microsoft_365/email.reply`

Reply to a message in its existing conversation.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `messageId` (Message ID; string, required); `comment` (Reply; string, required, role: body).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required.
- Text syntax: plain.

### Microsoft 365: Send Outlook email `provider:microsoft_365/email.send`

Send an email through the connected Microsoft account.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `to` (To; string_array, required, placeholder: Type an email address and press Enter); `subject` (Subject; string, optional, role: title); `body` (Message; rich_text, required, role: body); `cc` (Cc; string_array, optional, advanced); `bcc` (Bcc; string_array, optional, advanced); `saveToSentItems` (Save to sent items; boolean, optional, advanced).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required.
- Text syntax: plain.

### Microsoft 365: Update workbook cells `provider:microsoft_365/excel.update_range`

Write values to an Excel workbook range.

- Connection: Requires a connected Microsoft 365 account. Resource types: `microsoft.excel.workbook`.
- Inputs: `worksheet` (Worksheet; string, required); `range` (Range; string, required); `values` (Values; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### Microsoft 365: Create OneDrive folder `provider:microsoft_365/onedrive.create_folder`

Create a folder in OneDrive.

- Connection: Requires a connected Microsoft 365 account. Resource types: `microsoft.onedrive.folder`.
- Inputs: `name` (Name; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### Microsoft 365: Rename OneDrive item `provider:microsoft_365/onedrive.rename`

Rename a file or folder in OneDrive.

- Connection: Requires a connected Microsoft 365 account. Resource types: `microsoft.onedrive.folder`, `microsoft.onedrive.file`, `microsoft.excel.workbook`, `microsoft.word.document`.
- Inputs: `name` (Name; string, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data.
- Text syntax: markdown.

### Microsoft 365: Post Microsoft Teams message `provider:microsoft_365/teams.message.post`

Post a message to a Teams channel.

- Connection: Requires a connected Microsoft 365 account. Resource types: none declared.
- Inputs: `teamId` (Team ID; string, required); `channelId` (Channel ID; string, required); `body` (Message body; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `team`.
- Text syntax: markdown.

### Notion: Custom API request `provider:notion/api.custom_request`

Advanced request using this connection. Paths are relative to https://api.notion.com/v1/

- Connection: Requires a connected Notion account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://api.notion.com/v1/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### Notion: Comment in Notion `provider:notion/comment.create`

Add a rich-text comment to a page or discussion.

- Connection: Requires a connected Notion account. Resource types: `notion.page`.
- Inputs: `parent` (Page/discussion parent; json, optional); `rich_text` (Rich text; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `comment`.
- Text syntax: markdown.

### Notion: Create Notion database `provider:notion/database.create`

Create a database with a native property schema.

- Connection: Requires a connected Notion account. Resource types: `notion.page`.
- Inputs: `parent` (Parent; json, optional); `title` (Title; json, required); `properties` (Property schema; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `database`.
- Text syntax: markdown.

### Notion: Update Notion database `provider:notion/database.update`

Update title, description, or property schema.

- Connection: Requires a connected Notion account. Resource types: `notion.database`.
- Inputs: `databaseId` (Database ID; string, optional); `changes` (Changes; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `database`.
- Text syntax: markdown.

### Notion: Append Notion blocks `provider:notion/page.append_blocks`

Append rich content blocks to a page.

- Connection: Requires a connected Notion account. Resource types: `notion.page`.
- Inputs: `pageId` (Page ID; string, optional); `children` (Blocks; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `block`.
- Text syntax: markdown.

### Notion: Create Notion page `provider:notion/page.create`

Create a page under another page or in a database.

- Connection: Requires a connected Notion account. Resource types: `notion.page`, `notion.database`.
- Inputs: `parent` (Parent; json, optional); `properties` (Properties; json, required); `children` (Blocks; json, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `page`.
- Text syntax: markdown.

### Notion: Update Notion page `provider:notion/page.update`

Update page properties, icon, cover, or archived state.

- Connection: Requires a connected Notion account. Resource types: `notion.page`.
- Inputs: `pageId` (Page ID; string, optional); `changes` (Changes; json, required).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; refreshes `page`.
- Text syntax: markdown.

### Slack: Custom API request `provider:slack/api.custom_request`

Advanced request using this connection. Paths are relative to https://slack.com/api/

- Connection: Requires a connected Slack account. Resource types: none declared.
- Inputs: `method` (Method; enum, required, options: GET | POST | PUT | PATCH | DELETE); `path` (API path; string, required, placeholder: Path within this provider’s API) — Relative to https://slack.com/api/; `query` (Query parameters; json, optional); `body` (JSON body; json, optional); `pageCount` (Numbered pages (1–10); number, optional, advanced) — GET only, using a numbered page parameter. Cursor and next-link pagination are not supported. Stops on an empty list; `pageParameter` (Page query parameter; string, optional, advanced, placeholder: page); `startPage` (First page number; number, optional, advanced); `itemsPath` (Items path in response; string, optional, advanced, placeholder: data.items (leave empty for a root array)).
- Produced value: API result: `response` (unknown), `items` (list), `pages` (number), `pageLimitReached` (boolean).
- Effect: changes provider data; confirmation required.
- Text syntax: markdown.

### Slack: Post Slack message `provider:slack/message.post`

Post a message to a channel or thread.

- Connection: Requires a connected Slack account. Resource types: none declared.
- Inputs: `channel` (Channel; resource, required, resource: slack.channel); `text` (Message; rich_text, required, role: body); `threadTs` (Thread timestamp; string, optional, advanced) — Fill to reply in a thread instead of the channel.
- Produced value: Slack message: `channel` (text), `ts` (text), `text` (rich_text).
- Effect: changes provider data; confirmation required; refreshes `message`.
- Text syntax: slack.

### Slack: Reply in Slack thread `provider:slack/message.reply`

Reply in the thread of the message that triggered this run.

- Connection: Requires a connected Slack account. Resource types: none declared.
- Inputs: `channel` (Channel; resource, required, resource: slack.channel, event default: payload.event.channel); `text` (Message; rich_text, required, role: body); `threadTs` (Thread timestamp; string, required, event default: payload.event.ts).
- Produced value: Slack message: `channel` (text), `ts` (text), `text` (rich_text).
- Effect: changes provider data; confirmation required; refreshes `message`.
- Text syntax: slack.

### Slack: Update Slack message `provider:slack/message.update`

Update a message posted by the connected app.

- Connection: Requires a connected Slack account. Resource types: none declared.
- Inputs: `channel` (Channel; resource, required, resource: slack.channel); `ts` (Message timestamp; string, required); `text` (Message; rich_text, required, role: body).
- Produced value: Slack message: `channel` (text), `ts` (text), `text` (rich_text).
- Effect: changes provider data; refreshes `message`.
- Text syntax: slack.

### Slack: Add Slack reaction `provider:slack/reaction.add`

Add an emoji reaction to a message.

- Connection: Requires a connected Slack account. Resource types: none declared.
- Inputs: `channel` (Channel; resource, required, resource: slack.channel, event default: payload.event.channel); `timestamp` (Message timestamp; string, required, event default: payload.event.ts); `name` (Emoji name; string, required).
- Produced value: Slack result: `ok` (boolean).
- Effect: changes provider data; refreshes `message`.
- Text syntax: markdown.

### Stripe: Create Stripe customer `provider:stripe/customer.create`

Create a customer in Stripe.

- Connection: Requires a connected Stripe account. Resource types: none declared.
- Inputs: `email` (Email; string, required); `name` (Name; string, optional).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required; refreshes `customer`.
- Text syntax: markdown.

### Stripe: Create Stripe invoice `provider:stripe/invoice.create`

Create a draft invoice for a customer.

- Connection: Requires a connected Stripe account. Resource types: none declared.
- Inputs: `customer` (Customer ID; string, required); `description` (Description; string, optional, role: body).
- Produced value: No named output shape is declared; use the raw result path.
- Effect: changes provider data; confirmation required.
- Text syntax: plain.

<!-- GENERATED:provider-operations:END -->

## Custom API requests with a connection

Choose **Custom API request** when an app's supported actions do not cover the
endpoint you need. This operation is available for GitHub, Slack, Notion,
Google Workspace, Microsoft 365, HubSpot, Airtable, and ClickUp. It uses the
selected workspace Connection and its existing permissions. A connection does
not automatically grant access to every endpoint or resource in that API.
Discord does not offer this operation: its shared bot's native actions enforce
the installed server boundary.

Select GET, POST, PUT, PATCH, or DELETE and enter a relative **API path** within
the base shown for that provider. For example, a GitHub GET request to
`repos/your-organization/your-repository/issues` can use query parameters
`{ "state": "open", "per_page": 20 }`. Supply your own accessible repository.
Query parameters must be an object containing text, numbers, booleans, or null;
null values are omitted. GET accepts query parameters rather than a body.
Other methods may send a JSON body that matches the provider's endpoint.

Snoze supplies authentication from the Connection. Custom hosts, authorization
headers, other custom headers, and redirects are not supported. Paths cannot
escape the provider's configured API base. Notion requests use API version
`2022-06-28`. There is no multipart upload, binary response, or arbitrary URL
mode. Treat a test of a writing method as a real provider action. The operation
is conservatively marked as mutating and requiring confirmation in the
catalog, even when the chosen method is GET.

### Numbered pagination

For APIs that accept numbered pages, set **Numbered pages** to a whole number
from 1 to 10. The default is one request. Multiple pages are supported only for
GET. **Page query parameter** defaults to `page`, and **First page number**
defaults to 1 and accepts non-negative integers. For a single request, put any
needed page parameter directly in the query object.

**Items path in response** selects an array, such as `data.items`; leave it
empty when the response itself is an array. Pagination stops at an empty array
or the configured page limit. A missing or non-array items path fails a paged
request. Cursor pagination, next-page URLs, and continuation tokens are not
followed automatically. Each response is limited to 1 MiB, and a request may
collect at most 10,000 items across its pages.

The result contains `response` (the last response), `items` (the collected
array), `pages` (requests completed), and `pageLimitReached`. The last flag
means the configured multi-page limit was reached without an empty page; it
does not prove that all matching results were collected or that another page
exists. For a single object response with no items path, use `response`; the
collected `items` list remains empty.

## Choosing the integration path

- Use a provider operation when the provider registry offers one: it gives
  resource pickers, confirmation metadata, and named outputs.
- Use a legacy connector operation where that is the implemented typed path.
- Use a Data source when the goal is to synchronise external collections into
  a database rather than perform one remote operation.
- Use Custom API request for an unsupported endpoint in one of the connected
  providers listed above. It reuses that connection's credentials and stays
  inside its API base.
- Use an HTTP-request Action for another endpoint when no typed operation exists. Its response
  is bounded and inspectable, but it cannot offer provider-owned input controls
  or output tokens.

Provider triggers are a separate catalog. See
[Automation event catalog](https://snoze.dev/help/automation-triggers/) for every event and its
scope and produced payload.