> ## Documentation Index
> Fetch the complete documentation index at: https://docs.frogbot.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Available pieces

> Choose pieces for integration actions, linked accounts, and sign-in.

Install the package for your integration and create an instance with its factory. Use factory `auth` for developer credentials and [connection entries](https://docs.frogbot.ai/connections/overview.md) to let users link their own accounts.

## Credentials and identity

| Piece | Package | Factory | Credential options |
| - | - | - | - |
| Google | `@frogbotai/piece-google` | `createGoogle` | Identity-only OAuth for [sign-in](https://docs.frogbot.ai/authentication/sign-in.md); no actions. |
| Google Sheets | `@frogbotai/piece-google-sheets` | `createGoogleSheets` | OAuth app or `{ accessToken, refreshToken? }`. |
| Google Drive | `@frogbotai/piece-google-drive` | `createGoogleDrive` | OAuth app or `{ accessToken, refreshToken? }`. |
| Google Calendar | `@frogbotai/piece-google-calendar` | `createGoogleCalendar` | OAuth app or `{ accessToken, refreshToken? }`. |
| Gmail | `@frogbotai/piece-gmail` | `createGmail` | OAuth app or `{ accessToken, refreshToken? }`. |
| Linear | `@frogbotai/piece-linear` | `createLinear` | OAuth app, `{ apiKey }`, or `{ accessToken }`. |
| Resend | `@frogbotai/piece-resend` | `createResend` | `{ apiKey }`. |

### Google factory options

`createGoogleSheets`, `createGoogleDrive`, `createGoogleCalendar`, and `createGmail` accept the same options:

| Option | Type | Default | Description |
| - | - | - | - |
| `slug` | `string` | `'google-sheets'`, `'google-drive'`, `'google-calendar'`, or `'gmail'` | Instance slug. It prefixes tool slugs, such as `google-sheets_appendRow`. |
| `auth.accessToken` | `string` | Required with `auth` | A Google OAuth access token with the product's scopes. |
| `auth.refreshToken` | `string` | — | Accepted with the access token. FrogBot refreshes only tokens stored by OAuth [connections](https://docs.frogbot.ai/connections/overview.md), so keep a factory `accessToken` current yourself. |
| `oauth` | `OAuthApp` | — | Your Google OAuth app, usually `google.oauth`. Enables `oauth: true` connection entries. |
| `scopes` | Scope names, or `({ defaultScopes }) => names` | The product's default scopes | OAuth scopes for this instance, such as `({ defaultScopes }) => [...defaultScopes, 'gmail.labels']`. The identity scopes are always requested. See [Choose OAuth scopes](https://docs.frogbot.ai/connections/overview.md#choose-oauth-scopes). |

`createGoogle` accepts `slug` (default `'google'`), `oauth` for [sign-in](https://docs.frogbot.ai/authentication/sign-in.md), and `auth: { accessToken }`. It has no actions, so its `auth` is not used for API calls. See [factory options](https://docs.frogbot.ai/pieces/overview.md#factory-options) for the shared options. Linear and Resend options are on the [Linear](https://docs.frogbot.ai/pieces/linear.md#connect-an-agent) and [Email](https://docs.frogbot.ai/email/overview.md#configure-resend) pages.

### Link Linear

```bash theme={"theme":"tokyo-night"}
pnpm add @frogbotai/piece-linear
```

```ts theme={"theme":"tokyo-night"}
import { createLinear } from '@frogbotai/piece-linear'
import type { ConnectionEntry } from 'frogbot'

export const linear = createLinear()
export const connections: ConnectionEntry[] = [{ piece: linear, secret: true }]
```

Pass `connections` to your root config, then open **Settings → Linked accounts**. For a custom client, submit the raw schema input:

```bash theme={"theme":"tokyo-night"}
curl --request POST http://localhost:3000/api/connections/linear \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/json" \
  --data '{"apiKey":"lin_api_..."}'
```

### Share Google app credentials

```ts theme={"theme":"tokyo-night"}
import { createGmail } from '@frogbotai/piece-gmail'
import { createGoogle } from '@frogbotai/piece-google'
import type { ConnectionEntry } from 'frogbot'

export const google = createGoogle({
  oauth: {
    clientId: process.env.GOOGLE_CLIENT_ID!,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET!
  }
})
export const gmail = createGmail({ oauth: google.oauth })
export const connections: ConnectionEntry[] = [{ piece: gmail, oauth: true }]
```

Google's identity recipe requests OpenID, email, and profile access. Gmail adds mailbox scopes, and a `scopes` option on `createGmail` changes only Gmail's consent screen, not the shared app. Put `google` in a collection's `auth.signIn` for login and pass `connections` to the root config for Gmail linking. Sheets, Drive, and Calendar share `google.oauth` the same way, with a separate entry and callback for each product. See the complete [product connection example](https://docs.frogbot.ai/connections/overview.md#configure-linking) and [redirect setup](https://docs.frogbot.ai/connections/overview.md#configure-oauth-redirects).

## Google actions

Sheets, Drive, and Calendar provide 52 actions in total. Select action properties directly in an agent's `tools` array, such as `[googleSheets.findRows, googleDrive.getFile, googleCalendar.listEvents]`.

| Piece | Actions | Examples | Exported action-name list |
| - | - | - | - |
| Sheets | 27 | `appendRow`, `insertRow`, `updateRow`, `findRows`, `getRows`, `createWorksheet`, `readRange`, `exportWorksheet` | `googleSheetsActions` |
| Drive | 16 | `createFolder`, `uploadFile`, `downloadFile`, `getFile`, `listFiles`, `searchFiles`, `createPermission`, `trashFile` | `googleDriveActions` |
| Calendar | 9 | `createEvent`, `createQuickEvent`, `updateEvent`, `listEvents`, `getEvent`, `findFreeBusyPeriods`, `addAttendees` | `googleCalendarActions` |

Import each action-name list from its product package for the complete inventory. All three also expose `customApiCall`.

Actions are callable properties on each piece instance. Tool slugs use the instance slug and action name, such as `google-sheets_appendRow`.

* Sheets `appendRow` appends to the table; `insertRow` inserts after `afterRow` (default `1`, just below the header). Row writes use `spreadsheetId`, numeric `sheetId`, and `values` as an ordered array or column-letter object; `updateRow` also requires a one-based `row`.
* Drive `getFile` returns metadata. `downloadFile` saves a FrogBot file and returns its reference, not extracted text. `uploadFile` accepts `file: { fileId, name? }` referring to an accessible FrogBot file.
* Calendar `createEvent` uses `calendarId`, `title`, and `startDateTime`, with optional `endDateTime` (default duration: 30 minutes). Date-times must include a timezone. `findFreeBusyPeriods` takes `calendarIds`, `startDate`, and `endDate` and returns busy intervals and per-calendar errors.

## Custom API calls

Gmail, Sheets, Drive, Calendar and the provider packages in [More packages](#more-packages), except Exa, Front, Linear and Monday, have a `customApiCall` action for endpoints their other actions don't cover. It sends the request with the connected credential and works the same way in every piece.

```ts theme={"theme":"tokyo-night"}
const res = await gmail.customApiCall({
  input: { method: 'GET', path: '/users/me/profile' },
  req
})

res.status // 200
res.headers['content-type'] // header names are lowercase
res.body.emailAddress // parsed JSON
```

| Option | Type | Default | Description |
| - | - | - | - |
| `method` | `'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE' \| 'HEAD'` | Required | HTTP method. `GET` and `HEAD` take no `body`. |
| `path` | `string` | Required | Path relative to the piece's API base, such as `/users/me/profile` for Gmail. A query string in the path is kept. Absolute URLs and paths containing `//`, `\`, `..` or a leading `@` are refused. Slack and Telegram take a method name, such as `chat.postMessage` or `getMe`. |
| `query` | `Record<string, string \| number \| boolean \| array>` | — | Query parameters. Array values are sent as repeated keys: `{ a: [1, 2] }` becomes `a=1&a=2`. |
| `headers` | `Record<string, string>` | — | Request headers. `Authorization`, `Proxy-Authorization`, `Cookie`, `Host` and the piece's own credential headers are refused. |
| `bodyType` | `'json' \| 'form' \| 'raw' \| 'formData'` | `'json'` | How `body` is sent. `form` encodes nested objects as `a[b]=c` and arrays of objects as `a[0][b]=c`; arrays of scalars repeat the key (`a=1&a=2`), except in Stripe, which indexes them (`a[0]=1`); `raw` sends a string as is; `formData` sends `multipart/form-data`. Stripe and Twilio send `json` bodies form-encoded. |
| `body` | JSON value | — | Request body. |
| `responseType` | `'json' \| 'text' \| 'binary'` | `'json'` | `json` parses JSON responses and keeps other bodies as text. `binary` saves the response as a file. |
| `fileName` | `string` | The last path segment | Name of the saved file for `binary` responses. |
| `failsafe` | `boolean` | `false` | Return the response for a non-2xx status instead of throwing. |
| `timeoutSeconds` | `number` | `30` | Abort the request after this many seconds. The request is also aborted with `req.signal`. |

The result is always `{ status, headers, body }`. An empty body is `null`. A non-2xx status throws an error with the piece, the status and the first 500 characters of the body, unless `failsafe` is `true`. Redirects are never followed: a 3xx throws, or is returned with `failsafe`. Slack and Telegram also throw when a 2xx response has `ok: false`.

With `responseType: 'binary'`, `body` is the saved file, `{ id, name, mimeType, size, url }`. The file is created as the caller, with access control. Binary calls need an upload collection with `file: true`; without one the call throws before sending the request.

## More packages

Each shipped package is a native FrogBot piece and defines its own actions, triggers, and credential requirements.

| Category | Packages under `@frogbotai/` |
| - | - |
| Communication | `piece-slack`, `piece-discord`, `piece-telegram-bot`, `piece-microsoft-teams`, `piece-twilio`, `piece-front`, `piece-zoom` |
| Productivity | `piece-notion`, `piece-airtable`, `piece-monday`, `piece-trello`, `piece-dropbox` |
| Business and development | `piece-attio`, `piece-stripe`, `piece-xero`, `piece-github`, `piece-pagerduty`, `piece-posthog` |
| Search | `piece-brave-search`, `piece-exa` |

## Pieces without provider credentials

The utility packages are `piece-text-helper`, `piece-math-helper`, `piece-date-helper`, `piece-crypto`, `piece-csv`, `piece-xml`, `piece-qrcode`, `piece-data-summarizer`, `piece-http`, `piece-graphql`, `piece-file-helper`, `piece-image-helper`, and `piece-pdf`, all under `@frogbotai/`.

See [Pieces](https://docs.frogbot.ai/pieces/overview.md) for selecting agent tools and [Connections](https://docs.frogbot.ai/connections/overview.md) for credential resolution, replacement, and refresh behavior.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.