diff --git a/.cursor/skills/add-hosted-key/SKILL.md b/.cursor/skills/add-hosted-key/SKILL.md index a6e0f07052d..2181910f8d9 100644 --- a/.cursor/skills/add-hosted-key/SKILL.md +++ b/.cursor/skills/add-hosted-key/SKILL.md @@ -192,7 +192,7 @@ In the block config (`blocks/blocks/{service}.ts`), add `hideWhenHosted: true` t }, ``` -The visibility is controlled by `isSubBlockHiddenByHostedKey()` in `lib/workflows/subblocks/visibility.ts`, which checks the `isHosted` feature flag. +The visibility is controlled by `isSubBlockHidden()` in `lib/workflows/subblocks/visibility.ts`, which checks both the `isHosted` feature flag (`hideWhenHosted`) and optional env var conditions (`hideWhenEnvSet`). ### Excluding Specific Operations from Hosted Key Support diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index 44b5e1de985..4662b1c0d3f 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -3483,6 +3483,25 @@ export function MySQLIcon(props: SVGProps) { ) } +export function FireworksIcon(props: SVGProps) { + return ( + + + + ) +} + export function OpenRouterIcon(props: SVGProps) { return ( ) => ( ) -export function HIPAABadgeIcon(props: SVGProps) { - const id = useId() - const clipId = `hipaa_clip_${id}` - - return ( - - - - - - - - - - - - - ) -} - export function GoogleFormsIcon(props: SVGProps) { return ( @@ -6396,6 +6387,41 @@ export function RipplingIcon(props: SVGProps) { ) } +export function RootlyIcon(props: SVGProps) { + return ( + + + + + + + + + + ) +} + export function HexIcon(props: SVGProps) { return ( diff --git a/apps/docs/components/ui/icon-mapping.ts b/apps/docs/components/ui/icon-mapping.ts index ef92dc123f3..b8edc84d2bf 100644 --- a/apps/docs/components/ui/icon-mapping.ts +++ b/apps/docs/components/ui/icon-mapping.ts @@ -139,6 +139,7 @@ import { ResendIcon, RevenueCatIcon, RipplingIcon, + RootlyIcon, S3Icon, SalesforceIcon, SearchIcon, @@ -320,6 +321,7 @@ export const blockTypeToIconMap: Record = { resend: ResendIcon, revenuecat: RevenueCatIcon, rippling: RipplingIcon, + rootly: RootlyIcon, s3: S3Icon, salesforce: SalesforceIcon, search: SearchIcon, diff --git a/apps/docs/content/docs/de/blocks/guardrails.mdx b/apps/docs/content/docs/de/blocks/guardrails.mdx index 78c1f39d8e0..9d322fe219a 100644 --- a/apps/docs/content/docs/de/blocks/guardrails.mdx +++ b/apps/docs/content/docs/de/blocks/guardrails.mdx @@ -131,7 +131,7 @@ Erkennt personenbezogene Daten mithilfe von Microsoft Presidio. Unterstützt üb **Anwendungsfälle:** - Blockieren von Inhalten mit sensiblen persönlichen Informationen - Maskieren von personenbezogenen Daten vor der Protokollierung oder Speicherung -- Einhaltung der DSGVO, HIPAA und anderer Datenschutzbestimmungen +- Einhaltung der DSGVO und anderer Datenschutzbestimmungen - Bereinigung von Benutzereingaben vor der Verarbeitung ## Konfiguration diff --git a/apps/docs/content/docs/en/blocks/guardrails.mdx b/apps/docs/content/docs/en/blocks/guardrails.mdx index ad91892dbca..f363a4c5f07 100644 --- a/apps/docs/content/docs/en/blocks/guardrails.mdx +++ b/apps/docs/content/docs/en/blocks/guardrails.mdx @@ -132,7 +132,7 @@ Detects personally identifiable information using Microsoft Presidio. Supports o **Use Cases:** - Block content containing sensitive personal information - Mask PII before logging or storing data -- Compliance with GDPR, HIPAA, and other privacy regulations +- Compliance with GDPR and other privacy regulations - Sanitize user inputs before processing ## Configuration diff --git a/apps/docs/content/docs/en/credentials/google-service-account.mdx b/apps/docs/content/docs/en/credentials/google-service-account.mdx new file mode 100644 index 00000000000..a54d86f0384 --- /dev/null +++ b/apps/docs/content/docs/en/credentials/google-service-account.mdx @@ -0,0 +1,206 @@ +--- +title: Google Service Accounts +description: Set up Google service accounts with domain-wide delegation for Gmail, Sheets, Drive, Calendar, and other Google services +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Step, Steps } from 'fumadocs-ui/components/steps' +import { Image } from '@/components/ui/image' +import { FAQ } from '@/components/ui/faq' + +Google service accounts with domain-wide delegation let your workflows access Google APIs on behalf of users in your Google Workspace domain — without requiring each user to complete an OAuth consent flow. This is ideal for automated workflows that need to send emails, read spreadsheets, or manage files across your organization. + +For example, you could build a workflow that iterates through a list of employees, impersonates each one to read their Google Docs, and uploads the contents to a shared knowledge base — all without requiring any of those users to sign in. + +## Prerequisites + +Before adding a service account to Sim, you need to configure it in the Google Cloud Console and Google Workspace Admin Console. + +### 1. Create a Service Account in Google Cloud + + + + Go to the [Google Cloud Console](https://console.cloud.google.com/) and select your project (or create one) + + + Navigate to **IAM & Admin** → **Service Accounts** + + + Click **Create Service Account**, give it a name and description, then click **Create and Continue** + +
+ Google Cloud Console — Create service account form +
+ + + Skip the optional role and user access steps and click **Done** + + + Click on the newly created service account, go to the **Keys** tab, and click **Add Key** → **Create new key** + + + Select **JSON** as the key type and click **Create**. A JSON key file will download — keep this safe + +
+ Google Cloud Console — Create private key dialog with JSON selected +
+
+ + + +The JSON key file contains your service account's private key. Treat it like a password — do not commit it to source control or share it publicly. + + +### 2. Enable the Required APIs + +In the Google Cloud Console, go to **APIs & Services** → **Library** and enable the APIs for the services your workflows will use. See the [scopes reference](#scopes-reference) below for the full list of APIs by service. + +### 3. Set Up Domain-Wide Delegation + + + + In the Google Cloud Console, go to **IAM & Admin** → **Service Accounts**, click on your service account, and copy the **Client ID** (the numeric ID, not the email) + + + Open the [Google Workspace Admin Console](https://admin.google.com/) and navigate to **Security** → **Access and data control** → **API controls** + + + Click **Manage Domain Wide Delegation**, then click **Add new** + + + Paste the **Client ID** from your service account, then add the OAuth scopes for the services your workflows need. Copy the full scope URLs from the [scopes reference](#scopes-reference) below — only authorize scopes for services you plan to use. + +
+ Google Workspace Admin Console — Add a new client ID with OAuth scopes +
+
+ + Click **Authorize** + +
+ + +Domain-wide delegation must be configured by a Google Workspace admin. If you are not an admin, send the Client ID and required scopes to your admin. + + +### Scopes Reference + +The table below lists every Google service that supports service account authentication in Sim, the API to enable in Google Cloud Console, and the delegation scopes to authorize. Copy the scope string for each service you need and paste it into the Google Workspace Admin Console. + + + + + + + + + + + + + + + + + + + + + + + + +
ServiceAPI to EnableDelegation Scopes
GmailGmail API{'https://www.googleapis.com/auth/gmail.send'}
{'https://www.googleapis.com/auth/gmail.modify'}
{'https://www.googleapis.com/auth/gmail.labels'}
Google SheetsGoogle Sheets API, Google Drive API{'https://www.googleapis.com/auth/drive'}
{'https://www.googleapis.com/auth/drive.file'}
Google DriveGoogle Drive API{'https://www.googleapis.com/auth/drive'}
{'https://www.googleapis.com/auth/drive.file'}
Google DocsGoogle Docs API, Google Drive API{'https://www.googleapis.com/auth/drive'}
{'https://www.googleapis.com/auth/drive.file'}
Google SlidesGoogle Slides API, Google Drive API{'https://www.googleapis.com/auth/drive'}
{'https://www.googleapis.com/auth/drive.file'}
Google FormsGoogle Forms API, Google Drive API{'https://www.googleapis.com/auth/drive'}
{'https://www.googleapis.com/auth/forms.body'}
{'https://www.googleapis.com/auth/forms.responses.readonly'}
Google CalendarGoogle Calendar API{'https://www.googleapis.com/auth/calendar'}
Google ContactsPeople API{'https://www.googleapis.com/auth/contacts'}
BigQueryBigQuery API{'https://www.googleapis.com/auth/bigquery'}
Google TasksTasks API{'https://www.googleapis.com/auth/tasks'}
Google VaultVault API, Cloud Storage API{'https://www.googleapis.com/auth/ediscovery'}
{'https://www.googleapis.com/auth/devstorage.read_only'}
Google GroupsAdmin SDK API{'https://www.googleapis.com/auth/admin.directory.group'}
{'https://www.googleapis.com/auth/admin.directory.group.member'}
Google MeetGoogle Meet API{'https://www.googleapis.com/auth/meetings.space.created'}
{'https://www.googleapis.com/auth/meetings.space.readonly'}
+ + +You only need to enable APIs and authorize scopes for the services you plan to use. When authorizing multiple services, combine their scope strings with commas into a single entry in the Admin Console. + + +## Adding the Service Account to Sim + +Once Google Cloud and Workspace are configured, add the service account as a credential in Sim. + + + + Open your workspace **Settings** and go to the **Integrations** tab + + + Search for "Google Service Account" and click **Connect** + +
+ Integrations page showing Google Service Account +
+
+ + Paste the full contents of your JSON key file into the text area +
+ Add Google Service Account dialog +
+
+ + Give the credential a display name (the service account email is used by default) + + + Click **Save** + +
+ +The JSON key file is validated for the required fields (`type`, `client_email`, `private_key`, `project_id`) and encrypted before being stored. + +## Using Delegated Access in Workflows + +When you use a Google block (Gmail, Sheets, Drive, etc.) in a workflow and select a service account credential, an **Impersonate User Email** field appears below the credential selector. + +Enter the email address of the Google Workspace user you want the service account to act as. For example, if you enter `alice@yourcompany.com`, the workflow will send emails from Alice's account, read her spreadsheets, or access her calendar — depending on the scopes you authorized. + +
+ Gmail block in a workflow showing the Impersonated Account field with a service account credential +
+ + +The impersonated email must belong to a user in the Google Workspace domain where you configured domain-wide delegation. Impersonating external email addresses will fail. + + + diff --git a/apps/docs/content/docs/en/credentials/meta.json b/apps/docs/content/docs/en/credentials/meta.json new file mode 100644 index 00000000000..78cd836b509 --- /dev/null +++ b/apps/docs/content/docs/en/credentials/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Credentials", + "pages": ["index", "google-service-account"], + "defaultOpen": false +} diff --git a/apps/docs/content/docs/en/tools/meta.json b/apps/docs/content/docs/en/tools/meta.json index 20dd3a4bf9f..6071d7c7a73 100644 --- a/apps/docs/content/docs/en/tools/meta.json +++ b/apps/docs/content/docs/en/tools/meta.json @@ -134,6 +134,7 @@ "resend", "revenuecat", "rippling", + "rootly", "s3", "salesforce", "search", diff --git a/apps/docs/content/docs/en/tools/rippling.mdx b/apps/docs/content/docs/en/tools/rippling.mdx index b029318cf27..88160e37d23 100644 --- a/apps/docs/content/docs/en/tools/rippling.mdx +++ b/apps/docs/content/docs/en/tools/rippling.mdx @@ -1,6 +1,6 @@ --- title: Rippling -description: Manage employees, leave, departments, and company data in Rippling +description: Manage workers, departments, custom objects, and company data in Rippling --- import { BlockInfoCard } from "@/components/ui/block-info-card" @@ -11,139 +11,303 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" /> {/* MANUAL-CONTENT-START:intro */} -[Rippling](https://www.rippling.com/) is a unified workforce management platform that brings together HR, IT, and Finance into a single system. Rippling lets companies manage payroll, benefits, devices, apps, and more — all from one place — while automating the tedious manual work that typically bogs down HR teams. Its robust API provides programmatic access to employee data, organizational structure, leave management, and onboarding workflows. +[Rippling](https://www.rippling.com/) is a unified workforce management platform that brings together HR, IT, and Finance into a single system. Rippling lets companies manage payroll, benefits, devices, apps, and more — all from one place — while automating the tedious manual work that typically bogs down HR teams. Its Platform REST API provides programmatic access to workers, users, departments, teams, custom objects, business partners, supergroups, and more. **Why Rippling?** -- **Unified Employee System of Record:** A single source of truth for employee profiles, departments, teams, levels, and work locations — no more syncing data across disconnected tools. -- **Leave Management:** Full visibility into leave requests, balances, and types with the ability to approve or decline requests programmatically. -- **Company Insights:** Access company activity events, custom fields, and organizational hierarchy to power reporting and compliance workflows. -- **Onboarding Automation:** Push candidates directly into Rippling's onboarding flow, eliminating manual data entry when bringing on new hires. -- **Group Management:** Create and update groups for third-party app provisioning via SCIM-compatible endpoints. +- **Comprehensive Workforce Data:** Access workers, users, companies, entitlements, departments, teams, titles, employment types, job functions, work locations, and custom fields — your complete organizational graph in one API. +- **Custom Objects Platform:** Create, manage, and query custom objects with typed fields, records, and bulk operations — extend Rippling's data model to fit your business. +- **Business Partner Management:** Track vendors, contractors, and external partners with full CRUD operations and grouping support via business partner groups. +- **Supergroup Access Control:** Manage dynamic permission groups with granular inclusion and exclusion member lists for fine-grained access control. +- **Platform Extensibility:** Build custom apps, pages, settings, and object categories that live natively inside Rippling's UI. +- **Automated Reporting:** Trigger report runs programmatically and poll for results to build fully automated reporting pipelines. **Using Rippling in Sim** -Sim's Rippling integration connects your agentic workflows directly to your Rippling account using an API key. With 19 operations spanning employees, departments, teams, leave, groups, and candidates, you can build powerful HR automations without writing backend code. +Sim's Rippling integration connects your agentic workflows directly to your Rippling account using an API key. With 86 operations spanning workers, users, departments, teams, titles, work locations, business partners, supergroups, custom objects, custom apps, custom pages, custom settings, object categories, reports, and draft hires, you can build powerful HR and platform automations without writing backend code. **Key benefits of using Rippling in Sim:** -- **Employee directory automation:** List, search, and retrieve employee details — including terminated employees — to power onboarding checklists, offboarding workflows, and org chart updates. -- **Leave workflow automation:** Monitor leave requests, check balances, and programmatically approve or decline requests based on custom business rules. -- **Organizational intelligence:** Query departments, teams, levels, work locations, and custom fields to build dynamic org reports or trigger actions based on structural changes. -- **Candidate onboarding:** Push candidates from your ATS or recruiting pipeline directly into Rippling's onboarding flow, complete with job title, department, and start date. -- **Activity monitoring:** Track company activity events to build audit trails, compliance dashboards, or alert workflows when key changes occur. - -Whether you're automating new hire onboarding, building leave approval workflows, or syncing employee data across your tool stack, Rippling in Sim gives you direct, secure access to your HR platform — no middleware required. Simply configure your API key, select the operation you need, and let Sim handle the rest. +- **Worker and user management:** List, search, and retrieve worker and user details to power onboarding checklists, offboarding workflows, and org chart updates. +- **Organizational intelligence:** Query departments, teams, titles, employment types, job functions, work locations, and custom fields to build dynamic org reports or trigger actions based on structural changes. +- **Custom object automation:** Create custom objects, define fields, and manage records — including bulk create, update, and delete operations — to extend Rippling's data model for your workflows. +- **Business partner workflows:** Manage vendors and external partners with full lifecycle operations including grouping and categorization. +- **Platform app development:** Create and manage custom apps, pages, settings, and object categories that extend Rippling's native functionality. +- **Report automation:** Trigger report runs and poll for results to build automated reporting pipelines without manual intervention. +- **Draft hire onboarding:** Push one or more draft hires into Rippling's onboarding flow in a single call, complete with all required employee data. + +Whether you're automating new hire onboarding, managing custom object data, building organizational reports, or extending Rippling's platform with custom apps, Rippling in Sim gives you direct, secure access to the full Rippling Platform REST API — no middleware required. Simply configure your API key, select the operation you need, and let Sim handle the rest. {/* MANUAL-CONTENT-END */} ## Usage Instructions -Integrate Rippling into your workflow. Manage employees, departments, teams, leave requests, work locations, groups, candidates, and company information. +Integrate Rippling Platform into your workflow. Manage workers, users, departments, teams, titles, work locations, business partners, supergroups, custom objects, custom apps, custom pages, custom settings, object categories, reports, and draft hires. ## Tools -### `rippling_list_employees` +### `rippling_list_workers` -List all employees in Rippling with optional pagination +List all workers with optional filtering and pagination #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of employees to return \(default 100, max 100\) | -| `offset` | number | No | Offset for pagination | +| `filter` | string | No | Filter expression | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `employees` | array | List of employees | -| ↳ `id` | string | Employee ID | -| ↳ `firstName` | string | First name | -| ↳ `lastName` | string | Last name | -| ↳ `workEmail` | string | Work email address | -| ↳ `personalEmail` | string | Personal email address | -| ↳ `roleState` | string | Employment status | -| ↳ `department` | string | Department name or ID | +| `workers` | array | List of workers | +| ↳ `id` | string | Worker ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `user_id` | string | Associated user ID | +| ↳ `is_manager` | boolean | Whether the worker is a manager | +| ↳ `manager_id` | string | Manager worker ID | +| ↳ `legal_entity_id` | string | Legal entity ID | +| ↳ `country` | string | Worker country code | +| ↳ `start_date` | string | Employment start date | +| ↳ `end_date` | string | Employment end date | +| ↳ `number` | number | Worker number | +| ↳ `work_email` | string | Work email address | +| ↳ `personal_email` | string | Personal email address | +| ↳ `status` | string | Worker status \(INIT, HIRED, ACCEPTED, ACTIVE, TERMINATED\) | +| ↳ `employment_type_id` | string | Employment type ID | +| ↳ `department_id` | string | Department ID | +| ↳ `teams_id` | json | Array of team IDs | | ↳ `title` | string | Job title | -| ↳ `startDate` | string | Employment start date | -| ↳ `endDate` | string | Employment end date | -| ↳ `manager` | string | Manager ID or name | -| ↳ `phone` | string | Phone number | -| `totalCount` | number | Number of employees returned on this page | +| ↳ `level_id` | string | Level ID | +| ↳ `compensation_id` | string | Compensation ID | +| ↳ `overtime_exemption` | string | Overtime exemption status \(EXEMPT, NON_EXEMPT\) | +| ↳ `title_effective_date` | string | Title effective date | +| ↳ `business_partners_id` | json | Array of business partner IDs | +| ↳ `location` | json | Worker location \(type, work_location_id\) | +| ↳ `gender` | string | Gender | +| ↳ `date_of_birth` | string | Date of birth | +| ↳ `race` | string | Race | +| ↳ `ethnicity` | string | Ethnicity | +| ↳ `citizenship` | string | Citizenship country code | +| ↳ `termination_details` | json | Termination details | +| ↳ `custom_fields` | json | Custom fields \(expandable\) | +| ↳ `country_fields` | json | Country-specific fields | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_worker` + +Get a specific worker by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `expand` | string | No | Comma-separated fields to expand | -### `rippling_get_employee` +#### Output -Get details for a specific employee by ID +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Worker ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `user_id` | string | User ID | +| `is_manager` | boolean | Is manager | +| `manager_id` | string | Manager ID | +| `legal_entity_id` | string | Legal entity ID | +| `country` | string | Country | +| `start_date` | string | Start date | +| `end_date` | string | End date | +| `number` | number | Worker number | +| `work_email` | string | Work email | +| `personal_email` | string | Personal email | +| `status` | string | Status | +| `employment_type_id` | string | Employment type ID | +| `department_id` | string | Department ID | +| `teams_id` | json | Team IDs | +| `title` | string | Job title | +| `level_id` | string | Level ID | +| `compensation_id` | string | Compensation ID | +| `overtime_exemption` | string | Overtime exemption | +| `title_effective_date` | string | Title effective date | +| `business_partners_id` | json | Business partner IDs | +| `location` | json | Worker location | +| `gender` | string | Gender | +| `date_of_birth` | string | Date of birth | +| `race` | string | Race | +| `ethnicity` | string | Ethnicity | +| `citizenship` | string | Citizenship | +| `termination_details` | json | Termination details | +| `custom_fields` | json | Custom fields | +| `country_fields` | json | Country-specific fields | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_users` + +List all users with optional pagination #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `employeeId` | string | Yes | The ID of the employee to retrieve | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Employee ID | -| `firstName` | string | First name | -| `lastName` | string | Last name | -| `workEmail` | string | Work email address | -| `personalEmail` | string | Personal email address | -| `roleState` | string | Employment status | -| `department` | string | Department name or ID | -| `title` | string | Job title | -| `startDate` | string | Employment start date | -| `endDate` | string | Employment end date | -| `manager` | string | Manager ID or name | -| `phone` | string | Phone number | +| `users` | array | List of users | +| ↳ `id` | string | User ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `active` | boolean | Whether the user is active | +| ↳ `username` | string | Unique username | +| ↳ `display_name` | string | Display name | +| ↳ `preferred_language` | string | Preferred language | +| ↳ `locale` | string | Locale | +| ↳ `timezone` | string | Timezone \(IANA format\) | +| ↳ `number` | string | Permanent profile number | +| ↳ `name` | json | User name object \(given_name, family_name, etc.\) | +| ↳ `emails` | json | Array of email objects | +| ↳ `phone_numbers` | json | Array of phone number objects | +| ↳ `addresses` | json | Array of address objects | +| ↳ `photos` | json | Array of photo objects | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_user` + +Get a specific user by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | -### `rippling_list_employees_with_terminated` +#### Output -List all employees in Rippling including terminated employees with optional pagination +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `active` | boolean | Is active | +| `username` | string | Username | +| `display_name` | string | Display name | +| `preferred_language` | string | Preferred language | +| `locale` | string | Locale | +| `timezone` | string | Timezone | +| `number` | string | Profile number | +| `name` | json | User name object | +| `emails` | json | Email addresses | +| `phone_numbers` | json | Phone numbers | +| `addresses` | json | Addresses | +| `photos` | json | Photos | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_companies` + +List all companies #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of employees to return \(default 100, max 100\) | -| `offset` | number | No | Offset for pagination | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `employees` | array | List of employees including terminated | -| ↳ `id` | string | Employee ID | -| ↳ `firstName` | string | First name | -| ↳ `lastName` | string | Last name | -| ↳ `workEmail` | string | Work email address | -| ↳ `personalEmail` | string | Personal email address | -| ↳ `roleState` | string | Employment status | -| ↳ `department` | string | Department name or ID | -| ↳ `title` | string | Job title | -| ↳ `startDate` | string | Employment start date | -| ↳ `endDate` | string | Employment end date | -| ↳ `manager` | string | Manager ID or name | +| `companies` | array | List of companies | +| ↳ `id` | string | Company ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Company name | +| ↳ `legal_name` | string | Legal name | +| ↳ `doing_business_as_name` | string | DBA name | | ↳ `phone` | string | Phone number | -| `totalCount` | number | Number of employees returned on this page | +| ↳ `primary_email` | string | Primary email | +| ↳ `parent_legal_entity_id` | string | Parent legal entity ID | +| ↳ `legal_entities_id` | json | Array of legal entity IDs | +| ↳ `physical_address` | json | Physical address of the holding entity | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_current_user` + +Get SSO information for the current user + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `expand` | string | No | Comma-separated fields to expand | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `work_email` | string | Work email | +| `company_id` | string | Company ID | +| `company` | json | Expanded company object | + +### `rippling_list_entitlements` + +List all entitlements + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `entitlements` | array | List of entitlements | +| ↳ `id` | string | Entitlement ID | +| ↳ `description` | string | Entitlement description | +| ↳ `display_name` | string | Display name | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | ### `rippling_list_departments` -List all departments in the Rippling organization +List all departments #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of departments to return | -| `offset` | number | No | Offset for pagination | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output @@ -151,21 +315,112 @@ List all departments in the Rippling organization | --------- | ---- | ----------- | | `departments` | array | List of departments | | ↳ `id` | string | Department ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | | ↳ `name` | string | Department name | -| ↳ `parent` | string | Parent department ID | -| `totalCount` | number | Number of departments returned on this page | +| ↳ `parent_id` | string | Parent department ID | +| ↳ `reference_code` | string | Reference code | +| ↳ `department_hierarchy_id` | json | Array of department IDs in hierarchy | +| ↳ `parent` | json | Expanded parent department | +| ↳ `department_hierarchy` | json | Expanded department hierarchy | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_department` + +Get a specific department by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `expand` | string | No | Comma-separated fields to expand | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Department ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `name` | string | Department name | +| `parent_id` | string | Parent department ID | +| `reference_code` | string | Reference code | +| `department_hierarchy_id` | json | Array of department IDs in hierarchy | +| `parent` | json | Expanded parent department | +| `department_hierarchy` | json | Expanded department hierarchy | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_department` + +Create a new department + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | Department name | +| `parentId` | string | No | Parent department ID | +| `referenceCode` | string | No | Reference code | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Department ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `parent_id` | string | Parent department ID | +| `reference_code` | string | Reference code | +| `department_hierarchy_id` | json | Department hierarchy IDs | +| `parent` | json | Expanded parent department | +| `department_hierarchy` | json | Expanded department hierarchy | + +### `rippling_update_department` + +Update an existing department + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `name` | string | No | Department name | +| `parentId` | string | No | Parent department ID | +| `referenceCode` | string | No | Reference code | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Department ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `parent_id` | string | Parent department ID | +| `reference_code` | string | Reference code | +| `department_hierarchy_id` | json | Department hierarchy IDs | +| `parent` | json | Expanded parent department | +| `department_hierarchy` | json | Expanded department hierarchy | ### `rippling_list_teams` -List all teams in Rippling +List all teams #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of teams to return | -| `offset` | number | No | Offset for pagination | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output @@ -173,334 +428,1885 @@ List all teams in Rippling | --------- | ---- | ----------- | | `teams` | array | List of teams | | ↳ `id` | string | Team ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | | ↳ `name` | string | Team name | -| ↳ `parent` | string | Parent team ID | -| `totalCount` | number | Number of teams returned on this page | +| ↳ `parent_id` | string | Parent team ID | +| ↳ `parent` | json | Expanded parent team | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | -### `rippling_list_levels` +### `rippling_get_team` -List all position levels in Rippling +Get a specific team by ID #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of levels to return | -| `offset` | number | No | Offset for pagination | +| `id` | string | Yes | No description | +| `expand` | string | No | Comma-separated fields to expand | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `levels` | array | List of position levels | -| ↳ `id` | string | Level ID | -| ↳ `name` | string | Level name | -| ↳ `parent` | string | Parent level ID | -| `totalCount` | number | Number of levels returned on this page | +| `id` | string | Team ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `parent_id` | string | Parent team ID | +| `parent` | json | Expanded parent team | +| `__meta` | json | Metadata including redacted_fields | -### `rippling_list_work_locations` +### `rippling_list_employment_types` -List all work locations in Rippling +List all employment types #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of work locations to return | -| `offset` | number | No | Offset for pagination | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `workLocations` | array | List of work locations | -| ↳ `id` | string | Work location ID | -| ↳ `nickname` | string | Location nickname | -| ↳ `street` | string | Street address | -| ↳ `city` | string | City | -| ↳ `state` | string | State or province | -| ↳ `zip` | string | ZIP or postal code | -| ↳ `country` | string | Country | -| `totalCount` | number | Number of work locations returned on this page | +| `employmentTypes` | array | List of employmentTypes | +| ↳ `id` | string | Employment type ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `label` | string | Employment type label | +| ↳ `name` | string | Employment type name | +| ↳ `type` | string | Type \(CONTRACTOR, EMPLOYEE\) | +| ↳ `compensation_time_period` | string | Compensation period \(HOURLY, SALARIED\) | +| ↳ `amount_worked` | string | Amount worked \(PART-TIME, FULL-TIME, TEMPORARY\) | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_employment_type` + +Get a specific employment type by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Employment type ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `label` | string | Label | +| `name` | string | Name | +| `type` | string | Type \(CONTRACTOR, EMPLOYEE\) | +| `compensation_time_period` | string | Compensation period \(HOURLY, SALARIED\) | +| `amount_worked` | string | Amount worked \(PART-TIME, FULL-TIME, TEMPORARY\) | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_titles` + +List all titles + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `titles` | array | List of titles | +| ↳ `id` | string | Title ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Title name | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_title` + +Get a specific title by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Title ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Title name | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_title` + +Create a new title + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | No description | + +#### Output -### `rippling_get_company` +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Title ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Title name | -Get details for the current company in Rippling +### `rippling_update_title` + +Update an existing title #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `name` | string | No | No description | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Company ID | -| `name` | string | Company name | -| `address` | json | Company address with street, city, state, zip, country | -| `email` | string | Company email address | -| `phone` | string | Company phone number | -| `workLocations` | array | List of work location IDs | +| `id` | string | Title ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Title name | -### `rippling_get_company_activity` +### `rippling_delete_title` -Get activity events for the current company in Rippling +Delete a title #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `startDate` | string | No | Start date filter in ISO format \(e.g. 2024-01-01\) | -| `endDate` | string | No | End date filter in ISO format \(e.g. 2024-12-31\) | -| `limit` | number | No | Maximum number of activity events to return | -| `next` | string | No | Cursor for fetching the next page of results | +| `id` | string | Yes | ID of the resource to delete | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `events` | array | List of company activity events | -| ↳ `id` | string | Event ID | -| ↳ `type` | string | Event type | -| ↳ `description` | string | Event description | -| ↳ `createdAt` | string | Event creation timestamp | -| ↳ `actor` | json | Actor who triggered the event \(id, name\) | -| `totalCount` | number | Number of activity events returned on this page | -| `nextCursor` | string | Cursor for fetching the next page of results | +| `deleted` | boolean | Whether the resource was deleted | ### `rippling_list_custom_fields` -List all custom fields defined in Rippling +List all custom fields #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of custom fields to return | -| `offset` | number | No | Offset for pagination | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `customFields` | array | List of custom fields | +| `customFields` | array | List of customFields | | ↳ `id` | string | Custom field ID | -| ↳ `type` | string | Field type | -| ↳ `title` | string | Field title | -| ↳ `mandatory` | boolean | Whether the field is mandatory | -| `totalCount` | number | Number of custom fields returned on this page | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Field name | +| ↳ `description` | string | Field description | +| ↳ `required` | boolean | Whether the field is required | +| ↳ `type` | string | Field type \(TEXT, DATE, NUMBER, CURRENCY, etc.\) | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | -### `rippling_get_current_user` +### `rippling_list_job_functions` -Get the current authenticated user details +List all job functions #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | User ID | -| `workEmail` | string | Work email address | -| `company` | string | Company ID | +| `jobFunctions` | array | List of jobFunctions | +| ↳ `id` | string | Job function ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Job function name | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_job_function` + +Get a specific job function by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Job function ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_work_locations` + +List all work locations + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `workLocations` | array | List of workLocations | +| ↳ `id` | string | Work location ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Location name | +| ↳ `address` | json | Address object | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_work_location` + +Get a specific work location by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Location ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `address` | json | Address object | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_work_location` + +Create a new work location + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | Location name | +| `streetAddress` | string | Yes | Street address | +| `locality` | string | No | No description | +| `region` | string | No | State/region | +| `postalCode` | string | No | Postal code | +| `country` | string | No | Country code | +| `addressType` | string | No | Address type \(HOME, WORK, OTHER\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Location ID | +| `created_at` | string | Created timestamp | +| `updated_at` | string | Updated timestamp | +| `name` | string | Name | +| `address` | json | Address | + +### `rippling_update_work_location` + +Update a work location + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `name` | string | No | Location name | +| `streetAddress` | string | No | Street address | +| `locality` | string | No | No description | +| `region` | string | No | State/region | +| `postalCode` | string | No | Postal code | +| `country` | string | No | Country code | +| `addressType` | string | No | Address type \(HOME, WORK, OTHER\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Location ID | +| `created_at` | string | Created timestamp | +| `updated_at` | string | Updated timestamp | +| `name` | string | Name | +| `address` | json | Address | + +### `rippling_delete_work_location` + +Delete a work location + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_business_partners` + +List all business partners + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `filter` | string | No | Filter expression | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `businessPartners` | array | List of businessPartners | +| ↳ `id` | string | Business partner ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `business_partner_group_id` | string | Business partner group ID | +| ↳ `worker_id` | string | Worker ID | +| ↳ `client_group_id` | string | Client group ID | +| ↳ `client_group_member_count` | number | Client group member count | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_business_partner` + +Get a specific business partner by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `expand` | string | No | Comma-separated fields to expand | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `business_partner_group_id` | string | Group ID | +| `worker_id` | string | Worker ID | +| `client_group_id` | string | Client group ID | +| `client_group_member_count` | number | Client group member count | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_business_partner` + +Create a new business partner + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `businessPartnerGroupId` | string | Yes | Business partner group ID | +| `workerId` | string | Yes | Worker ID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `business_partner_group_id` | string | Group ID | +| `worker_id` | string | Worker ID | +| `client_group_id` | string | Client group ID | +| `client_group_member_count` | number | Client group member count | + +### `rippling_delete_business_partner` + +Delete a business partner + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_business_partner_groups` + +List all business partner groups + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `expand` | string | No | Comma-separated fields to expand | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `businessPartnerGroups` | array | List of businessPartnerGroups | +| ↳ `id` | string | Business partner group ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Group name | +| ↳ `domain` | string | Domain \(HR, IT, FINANCE, RECRUITING, OTHER\) | +| ↳ `default_business_partner_id` | string | Default business partner ID | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_business_partner_group` + +Get a specific business partner group by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `expand` | string | No | Comma-separated fields to expand | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `domain` | string | Domain | +| `default_business_partner_id` | string | Default partner ID | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_business_partner_group` + +Create a new business partner group + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | Group name | +| `domain` | string | No | Domain \(HR, IT, FINANCE, RECRUITING, OTHER\) | +| `defaultBusinessPartnerId` | string | No | Default business partner ID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `domain` | string | Domain | +| `default_business_partner_id` | string | Default partner ID | + +### `rippling_delete_business_partner_group` + +Delete a business partner group + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_supergroups` + +List all supergroups + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `filter` | string | No | Filter expression \(filterable fields: app_owner_id, group_type\) | +| `orderBy` | string | No | Sort field. Prefix with - for descending | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `supergroups` | array | List of supergroups | +| ↳ `id` | string | Supergroup ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `display_name` | string | Display name | +| ↳ `description` | string | Description | +| ↳ `app_owner_id` | string | App owner ID | +| ↳ `group_type` | string | Group type | +| ↳ `name` | string | Name | +| ↳ `sub_group_type` | string | Sub group type | +| ↳ `read_only` | boolean | Whether the group is read only | +| ↳ `parent` | string | Parent group ID | +| ↳ `mutually_exclusive_key` | string | Mutually exclusive key | +| ↳ `cumulatively_exhaustive_default` | boolean | Whether the group is the cumulatively exhaustive default | +| ↳ `include_terminated` | boolean | Whether the group includes terminated roles | +| ↳ `allow_non_employees` | boolean | Whether the group allows non-employees | +| ↳ `can_override_role_states` | boolean | Whether the group can override role states | +| ↳ `priority` | number | Group priority | +| ↳ `is_invisible` | boolean | Whether the group is invisible | +| ↳ `ignore_prov_group_matching` | boolean | Whether to ignore provisioning group matching | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_supergroup` + +Get a specific supergroup by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Supergroup ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `display_name` | string | Display name | +| `description` | string | Description | +| `app_owner_id` | string | App owner ID | +| `group_type` | string | Group type | +| `name` | string | Name | +| `sub_group_type` | string | Sub group type | +| `read_only` | boolean | Whether the group is read only | +| `parent` | string | Parent group ID | +| `mutually_exclusive_key` | string | Mutually exclusive key | +| `cumulatively_exhaustive_default` | boolean | Whether the group is the cumulatively exhaustive default | +| `include_terminated` | boolean | Whether the group includes terminated roles | +| `allow_non_employees` | boolean | Whether the group allows non-employees | +| `can_override_role_states` | boolean | Whether the group can override role states | +| `priority` | number | Group priority | +| `is_invisible` | boolean | Whether the group is invisible | +| `ignore_prov_group_matching` | boolean | Whether to ignore provisioning group matching | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_supergroup_members` + +List members of a supergroup + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `groupId` | string | Yes | Supergroup ID | +| `expand` | string | No | Fields to expand \(e.g., worker\) | +| `orderBy` | string | No | Sort field | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `members` | array | List of members | +| ↳ `id` | string | Member ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `full_name` | string | Full name | +| ↳ `work_email` | string | Work email | +| ↳ `worker_id` | string | Worker ID | +| ↳ `worker` | json | Expanded worker object | +| `totalCount` | number | Number of members returned | +| `nextLink` | string | Next page link | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_supergroup_inclusion_members` + +List inclusion members of a supergroup + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `groupId` | string | Yes | Supergroup ID | +| `expand` | string | No | Fields to expand \(e.g., worker\) | +| `orderBy` | string | No | Sort field | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `members` | array | List of members | +| ↳ `id` | string | Member ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `full_name` | string | Full name | +| ↳ `work_email` | string | Work email | +| ↳ `worker_id` | string | Worker ID | +| ↳ `worker` | json | Expanded worker object | +| `totalCount` | number | Number of members returned | +| `nextLink` | string | Next page link | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_list_supergroup_exclusion_members` + +List exclusion members of a supergroup + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `groupId` | string | Yes | Supergroup ID | +| `expand` | string | No | Fields to expand \(e.g., worker\) | +| `orderBy` | string | No | Sort field | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `members` | array | List of members | +| ↳ `id` | string | Member ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `full_name` | string | Full name | +| ↳ `work_email` | string | Work email | +| ↳ `worker_id` | string | Worker ID | +| ↳ `worker` | json | Expanded worker object | +| `totalCount` | number | Number of members returned | +| `nextLink` | string | Next page link | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_update_supergroup_inclusion_members` + +Update inclusion members of a supergroup + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `groupId` | string | Yes | Supergroup ID | +| `operations` | json | Yes | Operations array \[\{op: "add"\|"remove", value: \[\{id: "member_id"\}\]\}\] | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `ok` | boolean | Whether the operation succeeded | + +### `rippling_update_supergroup_exclusion_members` + +Update exclusion members of a supergroup + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `groupId` | string | Yes | Supergroup ID | +| `operations` | json | Yes | Operations array \[\{op: "add"\|"remove", value: \[\{id: "member_id"\}\]\}\] | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `ok` | boolean | Whether the operation succeeded | + +### `rippling_list_custom_objects` + +List all custom objects + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `customObjects` | array | List of customObjects | +| ↳ `id` | string | Custom object ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Object name | +| ↳ `description` | string | Description | +| ↳ `api_name` | string | API name | +| ↳ `plural_label` | string | Plural label | +| ↳ `category_id` | string | Category ID | +| ↳ `native_category_id` | string | Native category ID | +| ↳ `managed_package_install_id` | string | Package install ID | +| ↳ `owner_id` | string | Owner ID | +| ↳ `enable_history` | boolean | Whether history is enabled | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | + +### `rippling_get_custom_object` + +Get a custom object by API name + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | custom object api name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | +| `api_name` | string | API name | +| `plural_label` | string | Plural label | +| `category_id` | string | Category ID | +| `enable_history` | boolean | History enabled | +| `native_category_id` | string | Native category ID | +| `managed_package_install_id` | string | Package install ID | +| `owner_id` | string | Owner ID | + +### `rippling_create_custom_object` + +Create a new custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | No description | +| `description` | string | No | Description | +| `category` | string | No | Category | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | +| `api_name` | string | API name | +| `plural_label` | string | Plural label | +| `category_id` | string | Category ID | +| `enable_history` | boolean | History enabled | +| `native_category_id` | string | Native category ID | +| `managed_package_install_id` | string | Package install ID | +| `owner_id` | string | Owner ID | + +### `rippling_update_custom_object` + +Update a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `name` | string | No | No description | +| `description` | string | No | Description | +| `category` | string | No | Category | +| `pluralLabel` | string | No | Plural label | +| `ownerRole` | string | No | Owner role | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | +| `api_name` | string | API name | +| `plural_label` | string | Plural label | +| `category_id` | string | Category ID | +| `enable_history` | boolean | History enabled | +| `native_category_id` | string | Native category ID | +| `managed_package_install_id` | string | Package install ID | +| `owner_id` | string | Owner ID | + +### `rippling_delete_custom_object` + +Delete a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_custom_object_fields` + +List all fields for a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `fields` | array | List of fields | +| ↳ `id` | string | Field ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Field name | +| ↳ `custom_object` | string | Parent custom object | +| ↳ `description` | string | Description | +| ↳ `api_name` | string | API name | +| ↳ `data_type` | json | Data type configuration | +| ↳ `is_unique` | boolean | Whether the field is unique | +| ↳ `is_immutable` | boolean | Whether the field is immutable | +| ↳ `is_standard` | boolean | Whether the field is standard | +| ↳ `enable_history` | boolean | Whether history is enabled | +| ↳ `managed_package_install_id` | string | Package install ID | +| `totalCount` | number | Number of fields returned | +| `nextLink` | string | Next page link | + +### `rippling_get_custom_object_field` + +Get a specific field of a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `fieldApiName` | string | Yes | Field API name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Field ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `custom_object` | string | Custom object | +| `description` | string | Description | +| `api_name` | string | API name | +| `data_type` | json | Data type configuration | +| `is_unique` | boolean | Is unique | +| `is_immutable` | boolean | Is immutable | +| `is_standard` | boolean | Is standard | +| `enable_history` | boolean | History enabled | +| `managed_package_install_id` | string | Package install ID | + +### `rippling_create_custom_object_field` + +Create a field on a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `name` | string | Yes | Field name | +| `description` | string | No | Description | +| `dataType` | json | Yes | Data type configuration | +| `required` | boolean | No | Whether the field is required | +| `rqlDefinition` | json | No | RQL definition object | +| `isUnique` | boolean | No | Whether field is unique | +| `formulaAttrMetas` | json | No | Formula attribute metadata | +| `section` | json | No | Section configuration | +| `enableHistory` | boolean | No | Enable history tracking | +| `derivedFieldFormula` | string | No | Derived field formula expression | +| `derivedAggregatedField` | json | No | Derived aggregated field configuration | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Field ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `custom_object` | string | Custom object | +| `description` | string | Description | +| `api_name` | string | API name | +| `data_type` | json | Data type configuration | +| `is_unique` | boolean | Is unique | +| `is_immutable` | boolean | Is immutable | +| `is_standard` | boolean | Is standard | +| `enable_history` | boolean | History enabled | +| `managed_package_install_id` | string | Package install ID | + +### `rippling_update_custom_object_field` + +Update a field on a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `fieldApiName` | string | Yes | Field API name | +| `name` | string | No | Field name | +| `description` | string | No | Description | +| `dataType` | json | No | Data type | +| `required` | boolean | No | Whether the field is required | +| `rqlDefinition` | json | No | RQL definition object | +| `isUnique` | boolean | No | Is unique | +| `formulaAttrMetas` | json | No | Formula attribute metadata | +| `section` | json | No | Section configuration | +| `enableHistory` | boolean | No | Enable history | +| `derivedFieldFormula` | string | No | Derived field formula expression | +| `nameFieldDetails` | json | No | Name field details configuration | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Field ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `custom_object` | string | Custom object | +| `description` | string | Description | +| `api_name` | string | API name | +| `data_type` | json | Data type configuration | +| `is_unique` | boolean | Is unique | +| `is_immutable` | boolean | Is immutable | +| `is_standard` | boolean | Is standard | +| `enable_history` | boolean | History enabled | +| `managed_package_install_id` | string | Package install ID | + +### `rippling_delete_custom_object_field` + +Delete a field from a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `fieldApiName` | string | Yes | Field API name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the field was deleted | + +### `rippling_list_custom_object_records` + +List all records for a custom object + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `records` | array | List of records | +| ↳ `id` | string | Record ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Record name | +| ↳ `external_id` | string | External ID | +| ↳ `created_by` | json | Created by user \(id, display_value, image\) | +| ↳ `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| ↳ `owner_role` | json | Owner role \(id, display_value, image\) | +| ↳ `system_updated_at` | string | System update timestamp | +| ↳ `data` | json | Full record data including dynamic fields | +| `totalCount` | number | Number of records returned | +| `nextLink` | string | Next page link | + +### `rippling_get_custom_object_record` + +Get a specific custom object record + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `codrId` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Record ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `name` | string | Record name | +| `external_id` | string | External ID | +| `created_by` | json | Created by user \(id, display_value, image\) | +| `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| `owner_role` | json | Owner role \(id, display_value, image\) | +| `system_updated_at` | string | System update timestamp | +| `data` | json | Full record data | + +### `rippling_get_custom_object_record_by_external_id` + +Get a custom object record by external ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `externalId` | string | Yes | External ID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Record ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `name` | string | Record name | +| `external_id` | string | External ID | +| `created_by` | json | Created by user \(id, display_value, image\) | +| `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| `owner_role` | json | Owner role \(id, display_value, image\) | +| `system_updated_at` | string | System update timestamp | +| `data` | json | Full record data | + +### `rippling_query_custom_object_records` + +Query custom object records with filters + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `query` | string | No | Query expression | +| `limit` | number | No | Maximum number of records to return | +| `cursor` | string | No | Pagination cursor | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `records` | array | Matching records | +| ↳ `id` | string | Record ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Record name | +| ↳ `external_id` | string | External ID | +| ↳ `created_by` | json | Created by user \(id, display_value, image\) | +| ↳ `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| ↳ `owner_role` | json | Owner role \(id, display_value, image\) | +| ↳ `system_updated_at` | string | System update timestamp | +| ↳ `data` | json | Full record data | +| `totalCount` | number | Number of records returned | +| `cursor` | string | Cursor for next page of results | + +### `rippling_create_custom_object_record` + +Create a custom object record + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `externalId` | string | No | External ID for the record | +| `data` | json | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Record ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `name` | string | Record name | +| `external_id` | string | External ID | +| `created_by` | json | Created by user \(id, display_value, image\) | +| `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| `owner_role` | json | Owner role \(id, display_value, image\) | +| `system_updated_at` | string | System update timestamp | +| `data` | json | Full record data | + +### `rippling_update_custom_object_record` + +Update a custom object record + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `codrId` | string | Yes | Record ID | +| `externalId` | string | No | External ID for the record | +| `data` | json | No | Updated record data | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Record ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `name` | string | Record name | +| `external_id` | string | External ID | +| `created_by` | json | Created by user \(id, display_value, image\) | +| `last_modified_by` | json | Last modified by user \(id, display_value, image\) | +| `owner_role` | json | Owner role \(id, display_value, image\) | +| `system_updated_at` | string | System update timestamp | +| `data` | json | Full record data | + +### `rippling_delete_custom_object_record` + +Delete a custom object record + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `codrId` | string | Yes | Record ID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the record was deleted | + +### `rippling_bulk_create_custom_object_records` + +Bulk create custom object records + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `rowsToWrite` | json | Yes | Array of records to create \[\{external_id?, data\}\] | +| `allOrNothing` | boolean | No | If true, fail entire batch on any error | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `createdRecords` | array | Created custom object records | +| `totalCount` | number | Number of records created | + +### `rippling_bulk_update_custom_object_records` + +Bulk update custom object records + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `rowsToUpdate` | json | Yes | Array of records to update | +| `allOrNothing` | boolean | No | If true, fail entire batch on any error | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `updatedRecords` | array | Updated custom object records | +| `totalCount` | number | Number of records updated | + +### `rippling_bulk_delete_custom_object_records` + +Bulk delete custom object records + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `customObjectApiName` | string | Yes | Custom object API name | +| `rowsToDelete` | json | Yes | Array of records to delete | +| `allOrNothing` | boolean | No | If true, fail entire batch on any error | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the bulk delete succeeded | + +### `rippling_list_custom_apps` + +List all custom apps + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `customApps` | array | List of customApps | +| ↳ `id` | string | App ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | App name | +| ↳ `api_name` | string | API name | +| ↳ `description` | string | Description | +| ↳ `icon` | string | Icon URL | +| ↳ `pages` | json | Array of page summaries | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_custom_app` + +Get a specific custom app + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | App ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `api_name` | string | API name | +| `description` | string | Description | +| `icon` | string | Icon URL | +| `pages` | json | Array of page summaries | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_custom_app` + +Create a new custom app + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | No description | +| `apiName` | string | Yes | No description | +| `description` | string | No | Description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | App ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `api_name` | string | API name | +| `description` | string | Description | +| `icon` | string | Icon URL | +| `pages` | json | Array of page summaries | + +### `rippling_update_custom_app` + +Update a custom app + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `name` | string | No | No description | +| `apiName` | string | No | API name | +| `description` | string | No | Description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | App ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `api_name` | string | API name | +| `description` | string | Description | +| `icon` | string | Icon URL | +| `pages` | json | Array of page summaries | + +### `rippling_delete_custom_app` + +Delete a custom app + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_custom_pages` + +List all custom pages + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `customPages` | array | List of customPages | +| ↳ `id` | string | Page ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Page name | +| ↳ `components` | json | Page components | +| ↳ `actions` | json | Page actions | +| ↳ `canvas_actions` | json | Canvas actions | +| ↳ `variables` | json | Page variables | +| ↳ `media` | json | Page media | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_custom_page` + +Get a specific custom page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `components` | json | Page components | +| `actions` | json | Page actions | +| `canvas_actions` | json | Canvas actions | +| `variables` | json | Page variables | +| `media` | json | Page media | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_custom_page` + +Create a new custom page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `name` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `components` | json | Page components | +| `actions` | json | Page actions | +| `canvas_actions` | json | Canvas actions | +| `variables` | json | Page variables | +| `media` | json | Page media | + +### `rippling_update_custom_page` + +Update a custom page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `name` | string | No | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Page ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `components` | json | Page components | +| `actions` | json | Page actions | +| `canvas_actions` | json | Canvas actions | +| `variables` | json | Page variables | +| `media` | json | Page media | + +### `rippling_delete_custom_page` + +Delete a custom page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | + +### `rippling_list_custom_settings` + +List all custom settings + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `orderBy` | string | No | Sort field. Prefix with - for descending | +| `cursor` | string | No | Pagination cursor from previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `customSettings` | array | List of custom settings | +| ↳ `id` | string | Setting ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `display_name` | string | Display name | +| ↳ `api_name` | string | API name | +| ↳ `data_type` | string | Data type | +| ↳ `secret_value` | string | Secret value | +| ↳ `string_value` | string | String value | +| ↳ `number_value` | number | Number value | +| ↳ `boolean_value` | boolean | Boolean value | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_get_custom_setting` + +Get a specific custom setting + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Setting ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `display_name` | string | Display name | +| `api_name` | string | API name | +| `data_type` | string | Data type | +| `secret_value` | string | Secret value | +| `string_value` | string | String value | +| `number_value` | number | Number value | +| `boolean_value` | boolean | Boolean value | +| `__meta` | json | Metadata including redacted_fields | + +### `rippling_create_custom_setting` + +Create a new custom setting + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `displayName` | string | No | Display name | +| `apiName` | string | No | Unique API name | +| `dataType` | string | No | Data type of the setting | +| `secretValue` | string | No | Secret value \(for secret data type\) | +| `stringValue` | string | No | String value \(for string data type\) | +| `numberValue` | number | No | Number value \(for number data type\) | +| `booleanValue` | boolean | No | Boolean value \(for boolean data type\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Setting ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `display_name` | string | Display name | +| `api_name` | string | API name | +| `data_type` | string | Data type | +| `secret_value` | string | Secret value | +| `string_value` | string | String value | +| `number_value` | number | Number value | +| `boolean_value` | boolean | Boolean value | + +### `rippling_update_custom_setting` + +Update a custom setting + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | No description | +| `displayName` | string | No | Display name | +| `apiName` | string | No | Unique API name | +| `dataType` | string | No | Data type of the setting | +| `secretValue` | string | No | Secret value \(for secret data type\) | +| `stringValue` | string | No | String value \(for string data type\) | +| `numberValue` | number | No | Number value \(for number data type\) | +| `booleanValue` | boolean | No | Boolean value \(for boolean data type\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Setting ID | +| `created_at` | string | Record creation date | +| `updated_at` | string | Record update date | +| `display_name` | string | Display name | +| `api_name` | string | API name | +| `data_type` | string | Data type | +| `secret_value` | string | Secret value | +| `string_value` | string | String value | +| `number_value` | number | Number value | +| `boolean_value` | boolean | Boolean value | + +### `rippling_delete_custom_setting` + +Delete a custom setting + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rippling API key | +| `id` | string | Yes | ID of the resource to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the resource was deleted | -### `rippling_list_leave_requests` +### `rippling_list_object_categories` -List leave requests in Rippling with optional filtering by date range and status +List all object categories #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `startDate` | string | No | Filter by start date \(ISO date string\) | -| `endDate` | string | No | Filter by end date \(ISO date string\) | -| `status` | string | No | Filter by status \(e.g. pending, approved, declined\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `leaveRequests` | array | List of leave requests | -| ↳ `id` | string | Leave request ID | -| ↳ `requestedBy` | string | Employee ID who requested leave | -| ↳ `status` | string | Request status \(pending/approved/declined\) | -| ↳ `startDate` | string | Leave start date | -| ↳ `endDate` | string | Leave end date | -| ↳ `reason` | string | Reason for leave | -| ↳ `leaveType` | string | Type of leave | -| ↳ `createdAt` | string | When the request was created | -| `totalCount` | number | Total number of leave requests returned | +| `objectCategories` | array | List of objectCategories | +| ↳ `id` | string | Category ID | +| ↳ `created_at` | string | Record creation date | +| ↳ `updated_at` | string | Record update date | +| ↳ `name` | string | Category name | +| ↳ `description` | string | Description | +| `totalCount` | number | Number of items returned | +| `nextLink` | string | Link to next page of results | -### `rippling_process_leave_request` +### `rippling_get_object_category` -Approve or decline a leave request in Rippling +Get a specific object category #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `leaveRequestId` | string | Yes | The ID of the leave request to process | -| `action` | string | Yes | Action to take on the leave request \(approve or decline\) | +| `id` | string | Yes | No description | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Leave request ID | -| `status` | string | Updated status of the leave request | -| `requestedBy` | string | Employee ID who requested leave | -| `startDate` | string | Leave start date | -| `endDate` | string | Leave end date | +| `id` | string | Category ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | -### `rippling_list_leave_balances` +### `rippling_create_object_category` -List leave balances for all employees in Rippling +Create a new object category #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `limit` | number | No | Maximum number of leave balances to return | -| `offset` | number | No | Offset for pagination | +| `name` | string | Yes | Category name | +| `description` | string | No | Description | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `leaveBalances` | array | List of employee leave balances | -| ↳ `employeeId` | string | Employee ID | -| ↳ `balances` | array | Leave balance entries | -| ↳ `leaveType` | string | Type of leave | -| ↳ `minutesRemaining` | number | Minutes of leave remaining | -| `totalCount` | number | Number of leave balances returned on this page | +| `id` | string | Category ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | -### `rippling_get_leave_balance` +### `rippling_update_object_category` -Get leave balance for a specific employee by role ID +Update an object category #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `roleId` | string | Yes | The employee/role ID to retrieve leave balance for | +| `id` | string | Yes | No description | +| `name` | string | No | Category name | +| `description` | string | No | Description | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `employeeId` | string | Employee ID | -| `balances` | array | Leave balance entries | -| ↳ `leaveType` | string | Type of leave | -| ↳ `minutesRemaining` | number | Minutes of leave remaining | +| `id` | string | Category ID | +| `created_at` | string | Creation date | +| `updated_at` | string | Update date | +| `name` | string | Name | +| `description` | string | Description | -### `rippling_list_leave_types` +### `rippling_delete_object_category` -List company leave types configured in Rippling +Delete an object category #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `managedBy` | string | No | Filter leave types by manager | +| `id` | string | Yes | ID of the resource to delete | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `leaveTypes` | array | List of company leave types | -| ↳ `id` | string | Leave type ID | -| ↳ `name` | string | Leave type name | -| ↳ `managedBy` | string | Manager of this leave type | -| `totalCount` | number | Total number of leave types returned | +| `deleted` | boolean | Whether the resource was deleted | -### `rippling_create_group` +### `rippling_get_report_run` -Create a new group in Rippling +Get a report run by ID #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `name` | string | Yes | Name of the group | -| `spokeId` | string | Yes | Third-party app identifier | -| `users` | json | No | Array of user ID strings to add to the group | +| `runId` | string | Yes | No description | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Group ID | -| `name` | string | Group name | -| `spokeId` | string | Third-party app identifier | -| `users` | array | Array of user IDs in the group | -| `version` | number | Group version number | +| `id` | string | Report run ID | +| `report_id` | string | Report ID | +| `status` | string | Run status | +| `file_url` | string | URL to download the report file | +| `expires_at` | string | Expiration timestamp for the file URL | +| `output_type` | string | Output format \(JSON or CSV\) | +| `__meta` | json | Metadata including redacted_fields | -### `rippling_update_group` +### `rippling_trigger_report_run` -Update an existing group in Rippling +Trigger a new report run #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `groupId` | string | Yes | The ID of the group to update | -| `name` | string | No | New name for the group | -| `spokeId` | string | No | Third-party app identifier | -| `users` | json | No | Array of user ID strings to set for the group | -| `version` | number | No | Group version number for optimistic concurrency | +| `reportId` | string | Yes | Report ID to run | +| `includeObjectIds` | boolean | No | Include object IDs in the report | +| `includeTotalRows` | boolean | No | Include total row count | +| `formatDateFields` | json | No | Date field formatting configuration | +| `formatCurrencyFields` | json | No | Currency field formatting configuration | +| `outputType` | string | No | Output type \(JSON or CSV\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Group ID | -| `name` | string | Group name | -| `spokeId` | string | Third-party app identifier | -| `users` | array | Array of user IDs in the group | -| `version` | number | Group version number | +| `id` | string | Report run ID | +| `report_id` | string | Report ID | +| `status` | string | Run status | +| `file_url` | string | URL to download the report file | +| `expires_at` | string | Expiration timestamp for the file URL | +| `output_type` | string | Output format \(JSON or CSV\) | -### `rippling_push_candidate` +### `rippling_create_draft_hires` -Push a candidate to onboarding in Rippling +Create bulk draft hires #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Rippling API key | -| `firstName` | string | Yes | Candidate first name | -| `lastName` | string | Yes | Candidate last name | -| `email` | string | Yes | Candidate email address | -| `phone` | string | No | Candidate phone number | -| `jobTitle` | string | No | Job title for the candidate | -| `department` | string | No | Department for the candidate | -| `startDate` | string | No | Start date in ISO 8601 format \(e.g., 2025-01-15\) | +| `draftHires` | json | Yes | Array of draft hire objects | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Candidate ID | -| `firstName` | string | Candidate first name | -| `lastName` | string | Candidate last name | -| `email` | string | Candidate email address | -| `status` | string | Candidate onboarding status | +| `invalidItems` | json | Failed draft hires | +| `successfulResults` | json | Successful draft hires | +| `totalInvalid` | number | Number of failures | +| `totalSuccessful` | number | Number of successes | diff --git a/apps/docs/content/docs/en/tools/rootly.mdx b/apps/docs/content/docs/en/tools/rootly.mdx new file mode 100644 index 00000000000..58b3cb1e907 --- /dev/null +++ b/apps/docs/content/docs/en/tools/rootly.mdx @@ -0,0 +1,510 @@ +--- +title: Rootly +description: Manage incidents, alerts, and on-call with Rootly +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Rootly](https://rootly.com/) is an incident management platform that helps teams respond to, mitigate, and learn from incidents — all without leaving Slack or your existing tools. Rootly automates on-call alerting, incident workflows, status page updates, and retrospectives so engineering teams can resolve issues faster and reduce toil. + +**Why Rootly?** +- **End-to-End Incident Management:** Create, track, update, and resolve incidents with full lifecycle support — from initial triage through retrospective. +- **On-Call Alerting:** Create and manage alerts with deduplication, routing, and escalation to ensure the right people are notified immediately. +- **Timeline Events:** Add structured timeline events to incidents for clear, auditable incident narratives. +- **Service Catalog:** Maintain a catalog of services and map them to incidents for precise impact tracking. +- **Severity & Prioritization:** Use configurable severity levels to prioritize incidents and drive appropriate response urgency. +- **Retrospectives:** Access post-incident retrospectives to identify root causes, capture learnings, and drive reliability improvements. + +**Using Rootly in Sim** + +Sim's Rootly integration connects your agentic workflows directly to your Rootly account using an API key. With operations spanning incidents, alerts, services, severities, teams, environments, functionalities, incident types, and retrospectives, you can build powerful incident management automations without writing backend code. + +**Key benefits of using Rootly in Sim:** +- **Automated incident creation:** Trigger incident creation from monitoring alerts, customer reports, or anomaly detection workflows with full metadata including severity, services, and teams. +- **Incident lifecycle automation:** Automatically update incident status, add timeline events, and attach mitigation or resolution messages as your response progresses. +- **Alert management:** Create and list alerts with deduplication support to integrate Rootly into your existing monitoring and notification pipelines. +- **Organizational awareness:** Query services, severities, teams, environments, functionalities, and incident types to build context-aware incident workflows. +- **Retrospective insights:** List and filter retrospectives to feed post-incident learnings into continuous improvement workflows. + +Whether you're automating incident response, building on-call alerting pipelines, or driving post-incident learning, Rootly in Sim gives you direct, secure access to the Rootly API — no middleware required. Simply configure your API key, select the operation you need, and let Sim handle the rest. +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Integrate Rootly incident management into workflows. Create and manage incidents, alerts, services, severities, and retrospectives. + + + +## Tools + +### `rootly_create_incident` + +Create a new incident in Rootly with optional severity, services, and teams. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `title` | string | No | The title of the incident \(auto-generated if not provided\) | +| `summary` | string | No | A summary of the incident | +| `severityId` | string | No | Severity ID to attach to the incident | +| `status` | string | No | Incident status \(in_triage, started, detected, acknowledged, mitigated, resolved, closed, cancelled, scheduled, in_progress, completed\) | +| `kind` | string | No | Incident kind \(normal, normal_sub, test, test_sub, example, example_sub, backfilled, scheduled, scheduled_sub\) | +| `serviceIds` | string | No | Comma-separated service IDs to attach | +| `environmentIds` | string | No | Comma-separated environment IDs to attach | +| `groupIds` | string | No | Comma-separated team/group IDs to attach | +| `incidentTypeIds` | string | No | Comma-separated incident type IDs to attach | +| `functionalityIds` | string | No | Comma-separated functionality IDs to attach | +| `labels` | string | No | Labels as JSON object, e.g. \{"platform":"osx","version":"1.29"\} | +| `private` | boolean | No | Create as a private incident \(cannot be undone\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `incident` | object | The created incident | +| ↳ `id` | string | Unique incident ID | +| ↳ `sequentialId` | number | Sequential incident number | +| ↳ `title` | string | Incident title | +| ↳ `slug` | string | Incident slug | +| ↳ `kind` | string | Incident kind | +| ↳ `summary` | string | Incident summary | +| ↳ `status` | string | Incident status | +| ↳ `private` | boolean | Whether the incident is private | +| ↳ `url` | string | URL to the incident | +| ↳ `shortUrl` | string | Short URL to the incident | +| ↳ `severityName` | string | Severity name | +| ↳ `severityId` | string | Severity ID | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| ↳ `startedAt` | string | Start date | +| ↳ `mitigatedAt` | string | Mitigation date | +| ↳ `resolvedAt` | string | Resolution date | +| ↳ `closedAt` | string | Closed date | + +### `rootly_get_incident` + +Retrieve a single incident by ID from Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `incidentId` | string | Yes | The ID of the incident to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `incident` | object | The incident details | +| ↳ `id` | string | Unique incident ID | +| ↳ `sequentialId` | number | Sequential incident number | +| ↳ `title` | string | Incident title | +| ↳ `slug` | string | Incident slug | +| ↳ `kind` | string | Incident kind | +| ↳ `summary` | string | Incident summary | +| ↳ `status` | string | Incident status | +| ↳ `private` | boolean | Whether the incident is private | +| ↳ `url` | string | URL to the incident | +| ↳ `shortUrl` | string | Short URL to the incident | +| ↳ `severityName` | string | Severity name | +| ↳ `severityId` | string | Severity ID | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| ↳ `startedAt` | string | Start date | +| ↳ `mitigatedAt` | string | Mitigation date | +| ↳ `resolvedAt` | string | Resolution date | +| ↳ `closedAt` | string | Closed date | + +### `rootly_update_incident` + +Update an existing incident in Rootly (status, severity, summary, etc.). + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `incidentId` | string | Yes | The ID of the incident to update | +| `title` | string | No | Updated incident title | +| `summary` | string | No | Updated incident summary | +| `severityId` | string | No | Updated severity ID | +| `status` | string | No | Updated status \(in_triage, started, detected, acknowledged, mitigated, resolved, closed, cancelled, scheduled, in_progress, completed\) | +| `kind` | string | No | Incident kind \(normal, normal_sub, test, test_sub, example, example_sub, backfilled, scheduled, scheduled_sub\) | +| `private` | boolean | No | Set incident as private \(cannot be undone\) | +| `serviceIds` | string | No | Comma-separated service IDs | +| `environmentIds` | string | No | Comma-separated environment IDs | +| `groupIds` | string | No | Comma-separated team/group IDs | +| `incidentTypeIds` | string | No | Comma-separated incident type IDs to attach | +| `functionalityIds` | string | No | Comma-separated functionality IDs to attach | +| `labels` | string | No | Labels as JSON object, e.g. \{"platform":"osx","version":"1.29"\} | +| `mitigationMessage` | string | No | How was the incident mitigated? | +| `resolutionMessage` | string | No | How was the incident resolved? | +| `cancellationMessage` | string | No | Why was the incident cancelled? | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `incident` | object | The updated incident | +| ↳ `id` | string | Unique incident ID | +| ↳ `sequentialId` | number | Sequential incident number | +| ↳ `title` | string | Incident title | +| ↳ `slug` | string | Incident slug | +| ↳ `kind` | string | Incident kind | +| ↳ `summary` | string | Incident summary | +| ↳ `status` | string | Incident status | +| ↳ `private` | boolean | Whether the incident is private | +| ↳ `url` | string | URL to the incident | +| ↳ `shortUrl` | string | Short URL to the incident | +| ↳ `severityName` | string | Severity name | +| ↳ `severityId` | string | Severity ID | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| ↳ `startedAt` | string | Start date | +| ↳ `mitigatedAt` | string | Mitigation date | +| ↳ `resolvedAt` | string | Resolution date | +| ↳ `closedAt` | string | Closed date | + +### `rootly_list_incidents` + +List incidents from Rootly with optional filtering by status, severity, and more. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `status` | string | No | Filter by status \(in_triage, started, detected, acknowledged, mitigated, resolved, closed, cancelled, scheduled, in_progress, completed\) | +| `severity` | string | No | Filter by severity slug | +| `search` | string | No | Search term to filter incidents | +| `services` | string | No | Filter by service slugs \(comma-separated\) | +| `teams` | string | No | Filter by team slugs \(comma-separated\) | +| `environments` | string | No | Filter by environment slugs \(comma-separated\) | +| `sort` | string | No | Sort order \(e.g., -created_at, created_at, -started_at\) | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `incidents` | array | List of incidents | +| ↳ `id` | string | Unique incident ID | +| ↳ `sequentialId` | number | Sequential incident number | +| ↳ `title` | string | Incident title | +| ↳ `slug` | string | Incident slug | +| ↳ `kind` | string | Incident kind | +| ↳ `summary` | string | Incident summary | +| ↳ `status` | string | Incident status | +| ↳ `private` | boolean | Whether the incident is private | +| ↳ `url` | string | URL to the incident | +| ↳ `shortUrl` | string | Short URL to the incident | +| ↳ `severityName` | string | Severity name | +| ↳ `severityId` | string | Severity ID | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| ↳ `startedAt` | string | Start date | +| ↳ `mitigatedAt` | string | Mitigation date | +| ↳ `resolvedAt` | string | Resolution date | +| ↳ `closedAt` | string | Closed date | +| `totalCount` | number | Total number of incidents returned | + +### `rootly_create_alert` + +Create a new alert in Rootly for on-call notification and routing. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `summary` | string | Yes | The summary of the alert | +| `description` | string | No | A detailed description of the alert | +| `source` | string | Yes | The source of the alert \(e.g., api, manual, datadog, pagerduty\) | +| `status` | string | No | Alert status on creation \(open, triggered\) | +| `serviceIds` | string | No | Comma-separated service IDs to attach | +| `groupIds` | string | No | Comma-separated team/group IDs to attach | +| `environmentIds` | string | No | Comma-separated environment IDs to attach | +| `externalId` | string | No | External ID for the alert | +| `externalUrl` | string | No | External URL for the alert | +| `deduplicationKey` | string | No | Alerts sharing the same deduplication key are treated as a single alert | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `alert` | object | The created alert | +| ↳ `id` | string | Unique alert ID | +| ↳ `summary` | string | Alert summary | +| ↳ `description` | string | Alert description | +| ↳ `source` | string | Alert source | +| ↳ `status` | string | Alert status | +| ↳ `externalId` | string | External ID | +| ↳ `externalUrl` | string | External URL | +| ↳ `deduplicationKey` | string | Deduplication key | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | + +### `rootly_list_alerts` + +List alerts from Rootly with optional filtering by status, source, and services. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `status` | string | No | Filter by status \(open, triggered, acknowledged, resolved\) | +| `source` | string | No | Filter by source \(e.g., api, datadog, pagerduty\) | +| `services` | string | No | Filter by service slugs \(comma-separated\) | +| `environments` | string | No | Filter by environment slugs \(comma-separated\) | +| `groups` | string | No | Filter by team/group slugs \(comma-separated\) | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `alerts` | array | List of alerts | +| ↳ `id` | string | Unique alert ID | +| ↳ `summary` | string | Alert summary | +| ↳ `description` | string | Alert description | +| ↳ `source` | string | Alert source | +| ↳ `status` | string | Alert status | +| ↳ `externalId` | string | External ID | +| ↳ `externalUrl` | string | External URL | +| ↳ `deduplicationKey` | string | Deduplication key | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of alerts returned | + +### `rootly_add_incident_event` + +Add a timeline event to an existing incident in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `incidentId` | string | Yes | The ID of the incident to add the event to | +| `event` | string | Yes | The summary/description of the event | +| `visibility` | string | No | Event visibility \(internal or external\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `eventId` | string | The ID of the created event | +| `event` | string | The event summary | +| `visibility` | string | Event visibility \(internal or external\) | +| `occurredAt` | string | When the event occurred | +| `createdAt` | string | Creation date | +| `updatedAt` | string | Last update date | + +### `rootly_list_services` + +List services from Rootly with optional search filtering. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Search term to filter services | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `services` | array | List of services | +| ↳ `id` | string | Unique service ID | +| ↳ `name` | string | Service name | +| ↳ `slug` | string | Service slug | +| ↳ `description` | string | Service description | +| ↳ `color` | string | Service color | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of services returned | + +### `rootly_list_severities` + +List severity levels configured in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Search term to filter severities | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `severities` | array | List of severity levels | +| ↳ `id` | string | Unique severity ID | +| ↳ `name` | string | Severity name | +| ↳ `slug` | string | Severity slug | +| ↳ `description` | string | Severity description | +| ↳ `severity` | string | Severity level \(critical, high, medium, low\) | +| ↳ `color` | string | Severity color | +| ↳ `position` | number | Display position | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of severities returned | + +### `rootly_list_teams` + +List teams (groups) configured in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Search term to filter teams | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `teams` | array | List of teams | +| ↳ `id` | string | Unique team ID | +| ↳ `name` | string | Team name | +| ↳ `slug` | string | Team slug | +| ↳ `description` | string | Team description | +| ↳ `color` | string | Team color | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of teams returned | + +### `rootly_list_environments` + +List environments configured in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Search term to filter environments | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `environments` | array | List of environments | +| ↳ `id` | string | Unique environment ID | +| ↳ `name` | string | Environment name | +| ↳ `slug` | string | Environment slug | +| ↳ `description` | string | Environment description | +| ↳ `color` | string | Environment color | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of environments returned | + +### `rootly_list_incident_types` + +List incident types configured in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Filter incident types by name | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `incidentTypes` | array | List of incident types | +| ↳ `id` | string | Unique incident type ID | +| ↳ `name` | string | Incident type name | +| ↳ `slug` | string | Incident type slug | +| ↳ `description` | string | Incident type description | +| ↳ `color` | string | Incident type color | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of incident types returned | + +### `rootly_list_functionalities` + +List functionalities configured in Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `search` | string | No | Search term to filter functionalities | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `functionalities` | array | List of functionalities | +| ↳ `id` | string | Unique functionality ID | +| ↳ `name` | string | Functionality name | +| ↳ `slug` | string | Functionality slug | +| ↳ `description` | string | Functionality description | +| ↳ `color` | string | Functionality color | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of functionalities returned | + +### `rootly_list_retrospectives` + +List incident retrospectives (post-mortems) from Rootly. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Rootly API key | +| `status` | string | No | Filter by status \(draft, published\) | +| `search` | string | No | Search term to filter retrospectives | +| `pageSize` | number | No | Number of items per page \(default: 20\) | +| `pageNumber` | number | No | Page number for pagination | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `retrospectives` | array | List of retrospectives | +| ↳ `id` | string | Unique retrospective ID | +| ↳ `title` | string | Retrospective title | +| ↳ `status` | string | Status \(draft or published\) | +| ↳ `url` | string | URL to the retrospective | +| ↳ `startedAt` | string | Incident start date | +| ↳ `mitigatedAt` | string | Mitigation date | +| ↳ `resolvedAt` | string | Resolution date | +| ↳ `createdAt` | string | Creation date | +| ↳ `updatedAt` | string | Last update date | +| `totalCount` | number | Total number of retrospectives returned | + + diff --git a/apps/docs/content/docs/en/tools/tailscale.mdx b/apps/docs/content/docs/en/tools/tailscale.mdx index 17d71352e3a..aa03f5c9b04 100644 --- a/apps/docs/content/docs/en/tools/tailscale.mdx +++ b/apps/docs/content/docs/en/tools/tailscale.mdx @@ -10,6 +10,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="#2E2D2D" /> +{/* MANUAL-CONTENT-START:intro */} ## Overview [Tailscale](https://tailscale.com) is a zero-config mesh VPN built on WireGuard that makes it easy to connect devices, services, and users across any network. The Tailscale block lets you automate network management tasks like device provisioning, access control, route management, and DNS configuration directly from your Sim workflows. @@ -39,6 +40,14 @@ Every operation requires a **tailnet** parameter. This is typically your organiz - **Key lifecycle**: Create, list, inspect, and revoke auth keys - **User auditing**: List all users in the tailnet and their roles - **Policy review**: Retrieve the current ACL policy for inspection or backup +{/* MANUAL-CONTENT-END */} + + +## Usage Instructions + +Interact with the Tailscale API to manage devices, DNS, ACLs, auth keys, users, and routes across your tailnet. + + ## Tools @@ -100,8 +109,6 @@ Get details of a specific device by ID | `blocksIncomingConnections` | boolean | Whether the device blocks incoming connections | | `lastSeen` | string | Last seen timestamp | | `created` | string | Creation timestamp | -| `enabledRoutes` | array | Approved subnet routes | -| `advertisedRoutes` | array | Requested subnet routes | | `isExternal` | boolean | Whether the device is external | | `updateAvailable` | boolean | Whether an update is available | | `machineKey` | string | Machine key | @@ -263,6 +270,7 @@ Set the DNS nameservers for the tailnet | Parameter | Type | Description | | --------- | ---- | ----------- | | `dns` | array | Updated list of DNS nameserver addresses | +| `magicDNS` | boolean | Whether MagicDNS is enabled | ### `tailscale_get_dns_preferences` @@ -375,7 +383,7 @@ Create a new auth key for the tailnet to pre-authorize devices | `reusable` | boolean | No | Whether the key can be used more than once | | `ephemeral` | boolean | No | Whether devices authenticated with this key are ephemeral | | `preauthorized` | boolean | No | Whether devices are pre-authorized \(skip manual approval\) | -| `tags` | string | Yes | Comma-separated list of tags for devices using this key \(e.g., "tag:server,tag:prod"\) | +| `tags` | string | No | Comma-separated list of tags for devices using this key \(e.g., "tag:server,tag:prod"\) | | `description` | string | No | Description for the auth key | | `expirySeconds` | number | No | Key expiry time in seconds \(default: 90 days\) | diff --git a/apps/docs/content/docs/es/blocks/guardrails.mdx b/apps/docs/content/docs/es/blocks/guardrails.mdx index fd0697af10e..41b804ee89e 100644 --- a/apps/docs/content/docs/es/blocks/guardrails.mdx +++ b/apps/docs/content/docs/es/blocks/guardrails.mdx @@ -131,7 +131,7 @@ Detecta información de identificación personal utilizando Microsoft Presidio. **Casos de uso:** - Bloquear contenido que contiene información personal sensible - Enmascarar PII antes de registrar o almacenar datos -- Cumplimiento de GDPR, HIPAA y otras regulaciones de privacidad +- Cumplimiento de GDPR y otras regulaciones de privacidad - Sanear entradas de usuario antes del procesamiento ## Configuración diff --git a/apps/docs/content/docs/fr/blocks/guardrails.mdx b/apps/docs/content/docs/fr/blocks/guardrails.mdx index 83d2e0582db..9b3e218d2bf 100644 --- a/apps/docs/content/docs/fr/blocks/guardrails.mdx +++ b/apps/docs/content/docs/fr/blocks/guardrails.mdx @@ -131,7 +131,7 @@ Détecte les informations personnelles identifiables à l'aide de Microsoft Pres **Cas d'utilisation :** - Bloquer le contenu contenant des informations personnelles sensibles - Masquer les PII avant de journaliser ou stocker des données -- Conformité avec le RGPD, HIPAA et autres réglementations sur la confidentialité +- Conformité avec le RGPD et autres réglementations sur la confidentialité - Assainir les entrées utilisateur avant traitement ## Configuration diff --git a/apps/docs/content/docs/ja/blocks/guardrails.mdx b/apps/docs/content/docs/ja/blocks/guardrails.mdx index 5e908dc8c67..85083fa8e8c 100644 --- a/apps/docs/content/docs/ja/blocks/guardrails.mdx +++ b/apps/docs/content/docs/ja/blocks/guardrails.mdx @@ -131,7 +131,7 @@ Microsoft Presidioを使用して個人を特定できる情報を検出しま **ユースケース:** - 機密性の高い個人情報を含むコンテンツをブロック - データのログ記録や保存前にPIIをマスク -- GDPR、HIPAA、その他のプライバシー規制への準拠 +- GDPR、その他のプライバシー規制への準拠 - 処理前のユーザー入力のサニタイズ ## 設定 diff --git a/apps/docs/content/docs/zh/blocks/guardrails.mdx b/apps/docs/content/docs/zh/blocks/guardrails.mdx index 76871f884df..cd2854e25ca 100644 --- a/apps/docs/content/docs/zh/blocks/guardrails.mdx +++ b/apps/docs/content/docs/zh/blocks/guardrails.mdx @@ -131,7 +131,7 @@ Guardrails 模块通过针对多种验证类型检查内容,验证并保护您 **使用场景:** - 阻止包含敏感个人信息的内容 - 在记录或存储数据之前屏蔽 PII -- 符合 GDPR、HIPAA 和其他隐私法规 +- 符合 GDPR 和其他隐私法规 - 在处理之前清理用户输入 ## 配置 diff --git a/apps/docs/public/static/credentials/add-service-account.png b/apps/docs/public/static/credentials/add-service-account.png new file mode 100644 index 00000000000..fed97166106 Binary files /dev/null and b/apps/docs/public/static/credentials/add-service-account.png differ diff --git a/apps/docs/public/static/credentials/gcp-add-client-id.png b/apps/docs/public/static/credentials/gcp-add-client-id.png new file mode 100644 index 00000000000..df1a1e69530 Binary files /dev/null and b/apps/docs/public/static/credentials/gcp-add-client-id.png differ diff --git a/apps/docs/public/static/credentials/gcp-create-private-key.png b/apps/docs/public/static/credentials/gcp-create-private-key.png new file mode 100644 index 00000000000..183d932562f Binary files /dev/null and b/apps/docs/public/static/credentials/gcp-create-private-key.png differ diff --git a/apps/docs/public/static/credentials/gcp-create-service-account.png b/apps/docs/public/static/credentials/gcp-create-service-account.png new file mode 100644 index 00000000000..db3a45bf3bc Binary files /dev/null and b/apps/docs/public/static/credentials/gcp-create-service-account.png differ diff --git a/apps/docs/public/static/credentials/integrations-service-account.png b/apps/docs/public/static/credentials/integrations-service-account.png new file mode 100644 index 00000000000..83f232afea3 Binary files /dev/null and b/apps/docs/public/static/credentials/integrations-service-account.png differ diff --git a/apps/docs/public/static/credentials/workflow-impersonated-account.png b/apps/docs/public/static/credentials/workflow-impersonated-account.png new file mode 100644 index 00000000000..12a23fc56e8 Binary files /dev/null and b/apps/docs/public/static/credentials/workflow-impersonated-account.png differ diff --git a/apps/sim/.env.example b/apps/sim/.env.example index 8db5d82c1af..fe9514e358e 100644 --- a/apps/sim/.env.example +++ b/apps/sim/.env.example @@ -29,6 +29,14 @@ API_ENCRYPTION_KEY=your_api_encryption_key # Use `openssl rand -hex 32` to gener # VLLM_BASE_URL=http://localhost:8000 # Base URL for your self-hosted vLLM (OpenAI-compatible) # VLLM_API_KEY= # Optional bearer token if your vLLM instance requires auth # FIREWORKS_API_KEY= # Optional Fireworks AI API key for model listing +# NEXT_PUBLIC_BEDROCK_DEFAULT_CREDENTIALS=true # Set when using AWS default credential chain (IAM roles, ECS task roles, IRSA). Hides credential fields in Agent block UI. +# AZURE_OPENAI_ENDPOINT= # Azure OpenAI endpoint (hides field in UI when set alongside NEXT_PUBLIC_AZURE_CONFIGURED) +# AZURE_OPENAI_API_KEY= # Azure OpenAI API key +# AZURE_OPENAI_API_VERSION= # Azure OpenAI API version +# AZURE_ANTHROPIC_ENDPOINT= # Azure Anthropic endpoint (AI Foundry) +# AZURE_ANTHROPIC_API_KEY= # Azure Anthropic API key +# AZURE_ANTHROPIC_API_VERSION= # Azure Anthropic API version (e.g., 2023-06-01) +# NEXT_PUBLIC_AZURE_CONFIGURED=true # Set when Azure credentials are pre-configured above. Hides endpoint/key/version fields in Agent block UI. # Admin API (Optional - for self-hosted GitOps) # ADMIN_API_KEY= # Use `openssl rand -hex 32` to generate. Enables admin API for workflow export/import. diff --git a/apps/sim/app/(home)/components/enterprise/enterprise.tsx b/apps/sim/app/(home)/components/enterprise/enterprise.tsx index da8a88461c6..798ac88eff8 100644 --- a/apps/sim/app/(home)/components/enterprise/enterprise.tsx +++ b/apps/sim/app/(home)/components/enterprise/enterprise.tsx @@ -4,11 +4,11 @@ * SEO: * - `
`. * - `

` for the section title. - * - Compliance certs (SOC 2, HIPAA) as visible `` text. + * - Compliance cert (SOC 2) as visible `` text. * - Enterprise CTA links to contact form via `` with `rel="noopener noreferrer"`. * * GEO: - * - Entity-rich: "Sim is SOC 2 and HIPAA compliant" — not "We are compliant." + * - Entity-rich: "Sim is SOC 2 compliant" — not "We are compliant." * - `
    ` checklist of features (SSO, RBAC, audit logs, SLA, on-premise deployment) * as an atomic answer block for "What enterprise features does Sim offer?". */ @@ -66,7 +66,7 @@ const FEATURE_TAGS = [ function TrustStrip() { return (
    - {/* SOC 2 + HIPAA combined */} + {/* SOC 2 */}
    - SOC 2 & HIPAA + SOC 2 - Type II · PHI protected → + Type II →
    diff --git a/apps/sim/app/(home)/components/footer/footer.tsx b/apps/sim/app/(home)/components/footer/footer.tsx index 0f167ee787f..33ef8dcf9b0 100644 --- a/apps/sim/app/(home)/components/footer/footer.tsx +++ b/apps/sim/app/(home)/components/footer/footer.tsx @@ -26,6 +26,7 @@ const RESOURCES_LINKS: FooterItem[] = [ { label: 'Blog', href: '/blog' }, // { label: 'Templates', href: '/templates' }, { label: 'Docs', href: 'https://docs.sim.ai', external: true }, + { label: 'Models', href: '/models' }, // { label: 'Academy', href: '/academy' }, { label: 'Partners', href: '/partners' }, { label: 'Careers', href: 'https://jobs.ashbyhq.com/sim', external: true }, diff --git a/apps/sim/app/(home)/components/hero/hero.tsx b/apps/sim/app/(home)/components/hero/hero.tsx index 96953d4f7de..a257e2c1155 100644 --- a/apps/sim/app/(home)/components/hero/hero.tsx +++ b/apps/sim/app/(home)/components/hero/hero.tsx @@ -42,7 +42,7 @@ export default function Hero() { 1,000+ integrations and LLMs — including OpenAI, Claude, Gemini, Mistral, and xAI — to deploy and orchestrate agentic workflows. Create agents, workflows, knowledge bases, tables, and docs. Trusted by over 100,000 builders at startups and Fortune 500 companies. SOC2 and - HIPAA compliant. + SOC2 compliant.

    + + + + + ) +} + +function JsonlIcon({ className }: { className?: string }) { + return ( + + + + + + + + ) +} + +function ZipIcon({ className }: { className?: string }) { + return ( + + + + + + + + + ) +} + +const COLUMNS: PreviewColumn[] = [ + { id: 'name', header: 'Name' }, + { id: 'size', header: 'Size' }, + { id: 'type', header: 'Type' }, + { id: 'created', header: 'Created' }, + { id: 'owner', header: 'Owner' }, +] + +const ROWS: PreviewRow[] = [ + { + id: '1', + cells: { + name: { icon: , label: 'Q1 Performance Report.pdf' }, + size: { label: '2.4 MB' }, + type: { icon: , label: 'PDF' }, + created: { label: '3 hours ago' }, + owner: ownerCell('T', 'Theo L.'), + }, + }, + { + id: '2', + cells: { + name: { icon: , label: 'product-screenshots.zip' }, + size: { label: '18.7 MB' }, + type: { icon: , label: 'ZIP' }, + created: { label: '1 day ago' }, + owner: ownerCell('A', 'Alex M.'), + }, + }, + { + id: '3', + cells: { + name: { icon: , label: 'training-dataset.jsonl' }, + size: { label: '892 KB' }, + type: { icon: , label: 'JSONL' }, + created: { label: '3 days ago' }, + owner: ownerCell('J', 'Jordan P.'), + }, + }, + { + id: '4', + cells: { + name: { icon: , label: 'brand-guidelines.pdf' }, + size: { label: '5.1 MB' }, + type: { icon: , label: 'PDF' }, + created: { label: '1 week ago' }, + owner: ownerCell('S', 'Sarah K.'), + }, + }, + { + id: '5', + cells: { + name: { icon: , label: 'customer-interviews.mp3' }, + size: { label: '45.2 MB' }, + type: { icon: , label: 'Audio' }, + created: { label: 'March 20th, 2026' }, + owner: ownerCell('V', 'Vik M.'), + }, + }, + { + id: '6', + cells: { + name: { icon: , label: 'onboarding-playbook.docx' }, + size: { label: '1.1 MB' }, + type: { icon: , label: 'DOCX' }, + created: { label: 'March 14th, 2026' }, + owner: ownerCell('S', 'Sarah K.'), + }, + }, +] + +/** + * Static landing preview of the Files workspace page. + */ +export function LandingPreviewFiles() { + return ( + + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-knowledge/landing-preview-knowledge.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-knowledge/landing-preview-knowledge.tsx new file mode 100644 index 00000000000..f56f87ce7e9 --- /dev/null +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-knowledge/landing-preview-knowledge.tsx @@ -0,0 +1,105 @@ +import { Database } from '@/components/emcn/icons' +import { + AirtableIcon, + AsanaIcon, + ConfluenceIcon, + GoogleDocsIcon, + GoogleDriveIcon, + JiraIcon, + SalesforceIcon, + SlackIcon, + ZendeskIcon, +} from '@/components/icons' +import type { + PreviewColumn, + PreviewRow, +} from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' +import { LandingPreviewResource } from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' + +const DB_ICON = + +function connectorIcons(icons: React.ComponentType<{ className?: string }>[]) { + return { + content: ( +
    + {icons.map((Icon, i) => ( + + ))} +
    + ), + } +} + +const COLUMNS: PreviewColumn[] = [ + { id: 'name', header: 'Name' }, + { id: 'documents', header: 'Documents' }, + { id: 'tokens', header: 'Tokens' }, + { id: 'connectors', header: 'Connectors' }, + { id: 'created', header: 'Created' }, +] + +const ROWS: PreviewRow[] = [ + { + id: '1', + cells: { + name: { icon: DB_ICON, label: 'Product Documentation' }, + documents: { label: '847' }, + tokens: { label: '1,284,392' }, + connectors: connectorIcons([AsanaIcon, GoogleDocsIcon]), + created: { label: '2 days ago' }, + }, + }, + { + id: '2', + cells: { + name: { icon: DB_ICON, label: 'Customer Support KB' }, + documents: { label: '234' }, + tokens: { label: '892,104' }, + connectors: connectorIcons([ZendeskIcon, SlackIcon]), + created: { label: '1 week ago' }, + }, + }, + { + id: '3', + cells: { + name: { icon: DB_ICON, label: 'Engineering Wiki' }, + documents: { label: '1,203' }, + tokens: { label: '2,847,293' }, + connectors: connectorIcons([ConfluenceIcon, JiraIcon]), + created: { label: 'March 12th, 2026' }, + }, + }, + { + id: '4', + cells: { + name: { icon: DB_ICON, label: 'Marketing Assets' }, + documents: { label: '189' }, + tokens: { label: '634,821' }, + connectors: connectorIcons([GoogleDriveIcon, AirtableIcon]), + created: { label: 'March 5th, 2026' }, + }, + }, + { + id: '5', + cells: { + name: { icon: DB_ICON, label: 'Sales Playbook' }, + documents: { label: '92' }, + tokens: { label: '418,570' }, + connectors: connectorIcons([SalesforceIcon]), + created: { label: 'February 28th, 2026' }, + }, + }, +] + +export function LandingPreviewKnowledge() { + return ( + + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-logs/landing-preview-logs.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-logs/landing-preview-logs.tsx new file mode 100644 index 00000000000..f1406bb81dc --- /dev/null +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-logs/landing-preview-logs.tsx @@ -0,0 +1,321 @@ +'use client' + +import { useMemo, useState } from 'react' +import { Download } from 'lucide-react' +import { ArrowUpDown, Badge, Library, ListFilter, Search } from '@/components/emcn' +import type { BadgeProps } from '@/components/emcn/components/badge/badge' +import { cn } from '@/lib/core/utils/cn' + +interface LogRow { + id: string + workflowName: string + workflowColor: string + date: string + status: 'completed' | 'error' | 'running' + cost: string + trigger: 'webhook' | 'api' | 'schedule' | 'manual' | 'mcp' | 'chat' + triggerLabel: string + duration: string +} + +type BadgeVariant = BadgeProps['variant'] + +const STATUS_VARIANT: Record = { + completed: 'gray', + error: 'red', + running: 'amber', +} + +const STATUS_LABELS: Record = { + completed: 'Completed', + error: 'Error', + running: 'Running', +} + +const TRIGGER_VARIANT: Record = { + webhook: 'orange', + api: 'blue', + schedule: 'green', + manual: 'gray-secondary', + mcp: 'cyan', + chat: 'purple', +} + +const MOCK_LOGS: LogRow[] = [ + { + id: '1', + workflowName: 'Customer Onboarding', + workflowColor: '#4f8ef7', + date: 'Apr 1 10:42 AM', + status: 'running', + cost: '-', + trigger: 'webhook', + triggerLabel: 'Webhook', + duration: '-', + }, + { + id: '2', + workflowName: 'Lead Enrichment', + workflowColor: '#33C482', + date: 'Apr 1 09:15 AM', + status: 'error', + cost: '318 credits', + trigger: 'api', + triggerLabel: 'API', + duration: '2.7s', + }, + { + id: '3', + workflowName: 'Email Campaign', + workflowColor: '#a855f7', + date: 'Apr 1 08:30 AM', + status: 'completed', + cost: '89 credits', + trigger: 'schedule', + triggerLabel: 'Schedule', + duration: '0.8s', + }, + { + id: '4', + workflowName: 'Data Pipeline', + workflowColor: '#f97316', + date: 'Mar 31 10:14 PM', + status: 'completed', + cost: '241 credits', + trigger: 'webhook', + triggerLabel: 'Webhook', + duration: '4.1s', + }, + { + id: '5', + workflowName: 'Invoice Processing', + workflowColor: '#ec4899', + date: 'Mar 31 08:45 PM', + status: 'completed', + cost: '112 credits', + trigger: 'manual', + triggerLabel: 'Manual', + duration: '0.9s', + }, + { + id: '6', + workflowName: 'Support Triage', + workflowColor: '#0ea5e9', + date: 'Mar 31 07:22 PM', + status: 'completed', + cost: '197 credits', + trigger: 'api', + triggerLabel: 'API', + duration: '1.6s', + }, + { + id: '7', + workflowName: 'Content Moderator', + workflowColor: '#f59e0b', + date: 'Mar 31 06:11 PM', + status: 'error', + cost: '284 credits', + trigger: 'schedule', + triggerLabel: 'Schedule', + duration: '3.2s', + }, +] + +type SortKey = 'workflowName' | 'date' | 'status' | 'cost' | 'trigger' | 'duration' + +const COL_HEADERS: { key: SortKey; label: string }[] = [ + { key: 'workflowName', label: 'Workflow' }, + { key: 'date', label: 'Date' }, + { key: 'status', label: 'Status' }, + { key: 'cost', label: 'Cost' }, + { key: 'trigger', label: 'Trigger' }, + { key: 'duration', label: 'Duration' }, +] + +export function LandingPreviewLogs() { + const [search, setSearch] = useState('') + const [sortKey, setSortKey] = useState(null) + const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc') + const [activeTab, setActiveTab] = useState<'logs' | 'dashboard'>('logs') + + function handleSort(key: SortKey) { + if (sortKey === key) { + setSortDir((d) => (d === 'asc' ? 'desc' : 'asc')) + } else { + setSortKey(key) + setSortDir('asc') + } + } + + const sorted = useMemo(() => { + const q = search.toLowerCase() + const filtered = q + ? MOCK_LOGS.filter( + (log) => + log.workflowName.toLowerCase().includes(q) || + log.triggerLabel.toLowerCase().includes(q) || + STATUS_LABELS[log.status].toLowerCase().includes(q) + ) + : MOCK_LOGS + + if (!sortKey) return filtered + return [...filtered].sort((a, b) => { + const av = sortKey === 'cost' ? a.cost.replace(/\D/g, '') : a[sortKey] + const bv = sortKey === 'cost' ? b.cost.replace(/\D/g, '') : b[sortKey] + const cmp = av.localeCompare(bv, undefined, { numeric: true, sensitivity: 'base' }) + return sortDir === 'asc' ? cmp : -cmp + }) + }, [search, sortKey, sortDir]) + + return ( +
    + {/* Header */} +
    +
    +
    + +

    Logs

    +
    +
    +
    + + Export +
    + + +
    +
    +
    + + {/* Options bar */} +
    +
    +
    + + setSearch(e.target.value)} + placeholder='Search logs...' + className='flex-1 bg-transparent text-[var(--text-body)] text-caption outline-none placeholder:text-[var(--text-subtle)]' + /> +
    +
    +
    + + Filter +
    + +
    +
    +
    + + {/* Table — uses for pixel-perfect column alignment with headers */} +
    +
    + + + + + + + + + + + {COL_HEADERS.map(({ key, label }) => ( + + ))} + + + + {sorted.map((log) => ( + + + + + + + + + ))} + +
    + +
    +
    +
    + + {log.workflowName} + +
    +
    + {log.date} + + + {STATUS_LABELS[log.status]} + + + {log.cost} + + + {log.triggerLabel} + + + {log.duration} +
    +
    +
    + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource.tsx new file mode 100644 index 00000000000..309b3f2488a --- /dev/null +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource.tsx @@ -0,0 +1,211 @@ +'use client' + +import type { ReactNode } from 'react' +import { useMemo, useState } from 'react' +import { ArrowUpDown, ListFilter, Plus, Search } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' + +export interface PreviewColumn { + id: string + header: string + width?: number +} + +export interface PreviewCell { + icon?: ReactNode + label?: string + content?: ReactNode +} + +export interface PreviewRow { + id: string + cells: Record +} + +interface LandingPreviewResourceProps { + icon: React.ComponentType<{ className?: string }> + title: string + createLabel: string + searchPlaceholder: string + columns: PreviewColumn[] + rows: PreviewRow[] + onRowClick?: (id: string) => void +} + +export function ownerCell(initial: string, name: string): PreviewCell { + return { + icon: ( + + {initial} + + ), + label: name, + } +} + +export function LandingPreviewResource({ + icon: Icon, + title, + createLabel, + searchPlaceholder, + columns, + rows, + onRowClick, +}: LandingPreviewResourceProps) { + const [search, setSearch] = useState('') + const [sortColId, setSortColId] = useState(null) + const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc') + + function handleSortClick(colId: string) { + if (sortColId === colId) { + setSortDir((d) => (d === 'asc' ? 'desc' : 'asc')) + } else { + setSortColId(colId) + setSortDir('asc') + } + } + + const sorted = useMemo(() => { + const q = search.toLowerCase() + const filtered = q + ? rows.filter((row) => + Object.values(row.cells).some((cell) => cell.label?.toLowerCase().includes(q)) + ) + : rows + + if (!sortColId) return filtered + return [...filtered].sort((a, b) => { + const av = a.cells[sortColId]?.label ?? '' + const bv = b.cells[sortColId]?.label ?? '' + const cmp = av.localeCompare(bv, undefined, { numeric: true, sensitivity: 'base' }) + return sortDir === 'asc' ? cmp : -cmp + }) + }, [rows, search, sortColId, sortDir]) + + return ( +
    + {/* Header */} +
    +
    +
    + +

    {title}

    +
    +
    + + {createLabel} +
    +
    +
    + + {/* Options bar */} +
    +
    +
    + + setSearch(e.target.value)} + placeholder={searchPlaceholder} + className='flex-1 bg-transparent text-[var(--text-body)] text-caption outline-none placeholder:text-[var(--text-subtle)]' + /> +
    +
    +
    + + Filter +
    + +
    +
    +
    + + {/* Table */} +
    + + + {columns.map((col, i) => ( + + ))} + + + + {columns.map((col) => ( + + ))} + + + + {sorted.map((row) => ( + onRowClick?.(row.id)} + className={cn( + 'transition-colors hover-hover:bg-[var(--surface-3)]', + onRowClick && 'cursor-pointer' + )} + > + {columns.map((col, colIdx) => { + const cell = row.cells[col.id] + return ( + + ) + })} + + ))} + +
    + +
    + {cell?.content ? ( + cell.content + ) : ( + + {cell?.icon && ( + + {cell.icon} + + )} + {cell?.label ?? '—'} + + )} +
    +
    +
    + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-scheduled-tasks/landing-preview-scheduled-tasks.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-scheduled-tasks/landing-preview-scheduled-tasks.tsx new file mode 100644 index 00000000000..0750f4536ce --- /dev/null +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-scheduled-tasks/landing-preview-scheduled-tasks.tsx @@ -0,0 +1,88 @@ +import { Calendar } from '@/components/emcn/icons' +import type { + PreviewColumn, + PreviewRow, +} from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' +import { LandingPreviewResource } from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' + +const CAL_ICON = + +const COLUMNS: PreviewColumn[] = [ + { id: 'task', header: 'Task' }, + { id: 'schedule', header: 'Schedule', width: 240 }, + { id: 'nextRun', header: 'Next Run' }, + { id: 'lastRun', header: 'Last Run' }, +] + +const ROWS: PreviewRow[] = [ + { + id: '1', + cells: { + task: { icon: CAL_ICON, label: 'Sync CRM contacts' }, + schedule: { label: 'Recurring, every day at 9:00 AM' }, + nextRun: { label: 'Tomorrow' }, + lastRun: { label: '2 hours ago' }, + }, + }, + { + id: '2', + cells: { + task: { icon: CAL_ICON, label: 'Generate weekly report' }, + schedule: { label: 'Recurring, every Monday at 8:00 AM' }, + nextRun: { label: 'In 5 days' }, + lastRun: { label: '6 days ago' }, + }, + }, + { + id: '3', + cells: { + task: { icon: CAL_ICON, label: 'Clean up stale files' }, + schedule: { label: 'Recurring, every Sunday at midnight' }, + nextRun: { label: 'In 2 days' }, + lastRun: { label: '6 days ago' }, + }, + }, + { + id: '4', + cells: { + task: { icon: CAL_ICON, label: 'Send performance digest' }, + schedule: { label: 'Recurring, every Friday at 5:00 PM' }, + nextRun: { label: 'In 3 days' }, + lastRun: { label: '3 days ago' }, + }, + }, + { + id: '5', + cells: { + task: { icon: CAL_ICON, label: 'Backup production data' }, + schedule: { label: 'Recurring, every 4 hours' }, + nextRun: { label: 'In 2 hours' }, + lastRun: { label: '2 hours ago' }, + }, + }, + { + id: '6', + cells: { + task: { icon: CAL_ICON, label: 'Scrape competitor pricing' }, + schedule: { label: 'Recurring, every Tuesday at 6:00 AM' }, + nextRun: { label: 'In 6 days' }, + lastRun: { label: '1 week ago' }, + }, + }, +] + +/** + * Static landing preview of the Scheduled Tasks workspace page. + */ +export function LandingPreviewScheduledTasks() { + return ( + + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar.tsx index c4df8ecc85d..de104c6286c 100644 --- a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar.tsx +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar.tsx @@ -10,14 +10,25 @@ import { Settings, Table, } from '@/components/emcn/icons' +import { cn } from '@/lib/core/utils/cn' import type { PreviewWorkflow } from '@/app/(home)/components/landing-preview/components/landing-preview-workflow/workflow-data' +export type SidebarView = + | 'home' + | 'workflow' + | 'tables' + | 'files' + | 'knowledge' + | 'logs' + | 'scheduled-tasks' + interface LandingPreviewSidebarProps { workflows: PreviewWorkflow[] activeWorkflowId: string - activeView: 'home' | 'workflow' + activeView: SidebarView onSelectWorkflow: (id: string) => void onSelectHome: () => void + onSelectNav: (id: SidebarView) => void } /** @@ -39,7 +50,7 @@ const C = { const WORKSPACE_NAV = [ { id: 'tables', label: 'Tables', icon: Table }, { id: 'files', label: 'Files', icon: File }, - { id: 'knowledge-base', label: 'Knowledge Base', icon: Database }, + { id: 'knowledge', label: 'Knowledge Base', icon: Database }, { id: 'scheduled-tasks', label: 'Scheduled Tasks', icon: Calendar }, { id: 'logs', label: 'Logs', icon: Library }, ] as const @@ -49,20 +60,42 @@ const FOOTER_NAV = [ { id: 'settings', label: 'Settings', icon: Settings }, ] as const -function StaticNavItem({ +function NavItem({ icon: Icon, label, + isActive, + onClick, }: { icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }> label: string + isActive?: boolean + onClick?: () => void }) { + if (!onClick) { + return ( +
    + + + {label} + +
    + ) + } + return ( -
    +
    + ) } @@ -77,13 +110,16 @@ export function LandingPreviewSidebar({ activeView, onSelectWorkflow, onSelectHome, + onSelectNav, }: LandingPreviewSidebarProps) { const isHomeActive = activeView === 'home' return (
    {/* Workspace Header */}
    @@ -116,21 +152,17 @@ export function LandingPreviewSidebar({ - +
    {/* Workspace */} @@ -142,7 +174,13 @@ export function LandingPreviewSidebar({
    {WORKSPACE_NAV.map((item) => ( - + onSelectNav(item.id)} + /> ))}
    @@ -164,14 +202,10 @@ export function LandingPreviewSidebar({ key={workflow.id} type='button' onClick={() => onSelectWorkflow(workflow.id)} - className='group mx-0.5 flex h-[28px] w-full items-center gap-2 rounded-[8px] px-2 transition-colors' - style={{ backgroundColor: isActive ? C.SURFACE_ACTIVE : 'transparent' }} - onMouseEnter={(e) => { - if (!isActive) e.currentTarget.style.backgroundColor = C.SURFACE_ACTIVE - }} - onMouseLeave={(e) => { - if (!isActive) e.currentTarget.style.backgroundColor = 'transparent' - }} + className={cn( + 'mx-0.5 flex h-[28px] w-full items-center gap-2 rounded-[8px] px-2 transition-colors hover-hover:bg-[#363636]', + isActive && 'bg-[#363636]' + )} >
    {FOOTER_NAV.map((item) => ( - + ))}
    diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-tables/landing-preview-tables.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-tables/landing-preview-tables.tsx new file mode 100644 index 00000000000..42539519a59 --- /dev/null +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-tables/landing-preview-tables.tsx @@ -0,0 +1,552 @@ +'use client' + +import { useState } from 'react' +import { Checkbox } from '@/components/emcn' +import { + ChevronDown, + Columns3, + Rows3, + Table, + TypeBoolean, + TypeNumber, + TypeText, +} from '@/components/emcn/icons' +import { cn } from '@/lib/core/utils/cn' +import type { + PreviewColumn, + PreviewRow, +} from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' +import { + LandingPreviewResource, + ownerCell, +} from '@/app/(home)/components/landing-preview/components/landing-preview-resource/landing-preview-resource' + +const CELL = 'border-[var(--border)] border-r border-b px-2 py-[7px] align-middle select-none' +const CELL_CHECKBOX = + 'border-[var(--border)] border-r border-b px-1 py-[7px] align-middle select-none' +const CELL_HEADER = + 'border-[var(--border)] border-r border-b bg-[var(--bg)] p-0 text-left align-middle' +const CELL_HEADER_CHECKBOX = + 'border-[var(--border)] border-r border-b bg-[var(--bg)] px-1 py-[7px] text-center align-middle' +const CELL_CONTENT = + 'relative min-h-[20px] min-w-0 overflow-clip text-ellipsis whitespace-nowrap text-small' +const SELECTION_OVERLAY = + 'pointer-events-none absolute -top-px -right-px -bottom-px -left-px z-[5] border-[2px] border-[var(--selection)]' + +const LIST_COLUMNS: PreviewColumn[] = [ + { id: 'name', header: 'Name' }, + { id: 'columns', header: 'Columns' }, + { id: 'rows', header: 'Rows' }, + { id: 'created', header: 'Created' }, + { id: 'owner', header: 'Owner' }, +] + +const TABLE_METAS: Record = { + '1': 'Customer Leads', + '2': 'Product Catalog', + '3': 'Campaign Analytics', + '4': 'User Profiles', + '5': 'Invoice Records', +} + +const TABLE_ICON = +const COLUMNS_ICON = +const ROWS_ICON = + +const LIST_ROWS: PreviewRow[] = [ + { + id: '1', + cells: { + name: { icon: TABLE_ICON, label: 'Customer Leads' }, + columns: { icon: COLUMNS_ICON, label: '8' }, + rows: { icon: ROWS_ICON, label: '2,847' }, + created: { label: '2 days ago' }, + owner: ownerCell('S', 'Sarah K.'), + }, + }, + { + id: '2', + cells: { + name: { icon: TABLE_ICON, label: 'Product Catalog' }, + columns: { icon: COLUMNS_ICON, label: '12' }, + rows: { icon: ROWS_ICON, label: '1,203' }, + created: { label: '5 days ago' }, + owner: ownerCell('A', 'Alex M.'), + }, + }, + { + id: '3', + cells: { + name: { icon: TABLE_ICON, label: 'Campaign Analytics' }, + columns: { icon: COLUMNS_ICON, label: '6' }, + rows: { icon: ROWS_ICON, label: '534' }, + created: { label: '1 week ago' }, + owner: ownerCell('W', 'Emaan K.'), + }, + }, + { + id: '4', + cells: { + name: { icon: TABLE_ICON, label: 'User Profiles' }, + columns: { icon: COLUMNS_ICON, label: '15' }, + rows: { icon: ROWS_ICON, label: '18,492' }, + created: { label: '2 weeks ago' }, + owner: ownerCell('J', 'Jordan P.'), + }, + }, + { + id: '5', + cells: { + name: { icon: TABLE_ICON, label: 'Invoice Records' }, + columns: { icon: COLUMNS_ICON, label: '9' }, + rows: { icon: ROWS_ICON, label: '742' }, + created: { label: 'March 15th, 2026' }, + owner: ownerCell('S', 'Sarah K.'), + }, + }, +] + +interface SpreadsheetColumn { + id: string + label: string + type: 'text' | 'number' | 'boolean' + width: number +} + +interface SpreadsheetRow { + id: string + cells: Record +} + +const COLUMN_TYPE_ICONS = { + text: TypeText, + number: TypeNumber, + boolean: TypeBoolean, +} as const + +const SPREADSHEET_DATA: Record = { + '1': { + columns: [ + { id: 'name', label: 'Name', type: 'text', width: 160 }, + { id: 'email', label: 'Email', type: 'text', width: 200 }, + { id: 'company', label: 'Company', type: 'text', width: 160 }, + { id: 'score', label: 'Score', type: 'number', width: 100 }, + { id: 'qualified', label: 'Qualified', type: 'boolean', width: 120 }, + ], + rows: [ + { + id: '1', + cells: { + name: 'Alice Johnson', + email: 'alice@acme.com', + company: 'Acme Corp', + score: '87', + qualified: 'true', + }, + }, + { + id: '2', + cells: { + name: 'Bob Williams', + email: 'bob@techco.io', + company: 'TechCo', + score: '62', + qualified: 'false', + }, + }, + { + id: '3', + cells: { + name: 'Carol Davis', + email: 'carol@startup.co', + company: 'StartupCo', + score: '94', + qualified: 'true', + }, + }, + { + id: '4', + cells: { + name: 'Dan Miller', + email: 'dan@bigcorp.com', + company: 'BigCorp', + score: '71', + qualified: 'true', + }, + }, + { + id: '5', + cells: { + name: 'Eva Chen', + email: 'eva@design.io', + company: 'Design IO', + score: '45', + qualified: 'false', + }, + }, + { + id: '6', + cells: { + name: 'Frank Lee', + email: 'frank@ventures.co', + company: 'Ventures', + score: '88', + qualified: 'true', + }, + }, + ], + }, + '2': { + columns: [ + { id: 'sku', label: 'SKU', type: 'text', width: 120 }, + { id: 'name', label: 'Product Name', type: 'text', width: 200 }, + { id: 'price', label: 'Price', type: 'number', width: 100 }, + { id: 'stock', label: 'In Stock', type: 'number', width: 120 }, + { id: 'active', label: 'Active', type: 'boolean', width: 90 }, + ], + rows: [ + { + id: '1', + cells: { + sku: 'PRD-001', + name: 'Wireless Headphones', + price: '79.99', + stock: '234', + active: 'true', + }, + }, + { + id: '2', + cells: { sku: 'PRD-002', name: 'USB-C Hub', price: '49.99', stock: '89', active: 'true' }, + }, + { + id: '3', + cells: { + sku: 'PRD-003', + name: 'Laptop Stand', + price: '39.99', + stock: '0', + active: 'false', + }, + }, + { + id: '4', + cells: { + sku: 'PRD-004', + name: 'Mechanical Keyboard', + price: '129.99', + stock: '52', + active: 'true', + }, + }, + { + id: '5', + cells: { sku: 'PRD-005', name: 'Webcam HD', price: '89.99', stock: '17', active: 'true' }, + }, + { + id: '6', + cells: { + sku: 'PRD-006', + name: 'Mouse Pad XL', + price: '24.99', + stock: '0', + active: 'false', + }, + }, + ], + }, + '3': { + columns: [ + { id: 'campaign', label: 'Campaign', type: 'text', width: 180 }, + { id: 'clicks', label: 'Clicks', type: 'number', width: 100 }, + { id: 'conversions', label: 'Conversions', type: 'number', width: 140 }, + { id: 'spend', label: 'Spend ($)', type: 'number', width: 130 }, + { id: 'active', label: 'Active', type: 'boolean', width: 90 }, + ], + rows: [ + { + id: '1', + cells: { + campaign: 'Spring Sale 2026', + clicks: '12,847', + conversions: '384', + spend: '2,400', + active: 'true', + }, + }, + { + id: '2', + cells: { + campaign: 'Email Reactivation', + clicks: '3,201', + conversions: '97', + spend: '450', + active: 'false', + }, + }, + { + id: '3', + cells: { + campaign: 'Referral Program', + clicks: '8,923', + conversions: '210', + spend: '1,100', + active: 'true', + }, + }, + { + id: '4', + cells: { + campaign: 'Product Launch', + clicks: '24,503', + conversions: '891', + spend: '5,800', + active: 'true', + }, + }, + { + id: '5', + cells: { + campaign: 'Retargeting Q1', + clicks: '6,712', + conversions: '143', + spend: '980', + active: 'false', + }, + }, + ], + }, + '4': { + columns: [ + { id: 'username', label: 'Username', type: 'text', width: 140 }, + { id: 'email', label: 'Email', type: 'text', width: 200 }, + { id: 'plan', label: 'Plan', type: 'text', width: 120 }, + { id: 'seats', label: 'Seats', type: 'number', width: 100 }, + { id: 'active', label: 'Active', type: 'boolean', width: 100 }, + ], + rows: [ + { + id: '1', + cells: { + username: 'alice_j', + email: 'alice@acme.com', + plan: 'Pro', + seats: '5', + active: 'true', + }, + }, + { + id: '2', + cells: { + username: 'bobw', + email: 'bob@techco.io', + plan: 'Starter', + seats: '1', + active: 'true', + }, + }, + { + id: '3', + cells: { + username: 'carol_d', + email: 'carol@startup.co', + plan: 'Enterprise', + seats: '25', + active: 'true', + }, + }, + { + id: '4', + cells: { + username: 'dan.m', + email: 'dan@bigcorp.com', + plan: 'Pro', + seats: '10', + active: 'false', + }, + }, + { + id: '5', + cells: { + username: 'eva_chen', + email: 'eva@design.io', + plan: 'Starter', + seats: '1', + active: 'true', + }, + }, + { + id: '6', + cells: { + username: 'frank_lee', + email: 'frank@ventures.co', + plan: 'Enterprise', + seats: '50', + active: 'true', + }, + }, + ], + }, + '5': { + columns: [ + { id: 'invoice', label: 'Invoice #', type: 'text', width: 140 }, + { id: 'client', label: 'Client', type: 'text', width: 160 }, + { id: 'amount', label: 'Amount ($)', type: 'number', width: 130 }, + { id: 'paid', label: 'Paid', type: 'boolean', width: 80 }, + ], + rows: [ + { + id: '1', + cells: { invoice: 'INV-2026-001', client: 'Acme Corp', amount: '4,800.00', paid: 'true' }, + }, + { + id: '2', + cells: { invoice: 'INV-2026-002', client: 'TechCo', amount: '1,200.00', paid: 'true' }, + }, + { + id: '3', + cells: { invoice: 'INV-2026-003', client: 'StartupCo', amount: '750.00', paid: 'false' }, + }, + { + id: '4', + cells: { invoice: 'INV-2026-004', client: 'BigCorp', amount: '12,500.00', paid: 'true' }, + }, + { + id: '5', + cells: { invoice: 'INV-2026-005', client: 'Design IO', amount: '3,300.00', paid: 'false' }, + }, + ], + }, +} + +interface SpreadsheetViewProps { + tableId: string + tableName: string + onBack: () => void +} + +function SpreadsheetView({ tableId, tableName, onBack }: SpreadsheetViewProps) { + const data = SPREADSHEET_DATA[tableId] ?? SPREADSHEET_DATA['1'] + const [selectedCell, setSelectedCell] = useState<{ row: string; col: string } | null>(null) + + return ( +
    + {/* Breadcrumb header — matches real ResourceHeader breadcrumb layout */} +
    +
    +
    + Tables + + / + + {tableName} + + + + + + {/* Spreadsheet — matches exact real table editor structure */} +
    +
    + + + {data.columns.map((col) => ( + + ))} + + + + + ) + })} + + + + {data.rows.map((row, rowIdx) => ( + + + {data.columns.map((col) => { + const isSelected = selectedCell?.row === row.id && selectedCell?.col === col.id + const cellValue = row.cells[col.id] ?? '' + return ( + + ) + })} + + ))} + +
    + {data.columns.map((col) => { + const Icon = COLUMN_TYPE_ICONS[col.type] ?? TypeText + return ( + +
    + + + {col.label} + + +
    +
    + + {rowIdx + 1} + + setSelectedCell({ row: row.id, col: col.id })} + className={cn( + CELL, + 'relative cursor-default text-[var(--text-body)]', + isSelected && 'bg-[rgba(37,99,235,0.06)]' + )} + > + {isSelected &&
    } +
    + {col.type === 'boolean' ? ( +
    + +
    + ) : ( + cellValue + )} +
    +
    + + + ) +} + +export function LandingPreviewTables() { + const [openTableId, setOpenTableId] = useState(null) + + if (openTableId !== null) { + return ( + setOpenTableId(null)} + /> + ) + } + + return ( + setOpenTableId(id)} + /> + ) +} diff --git a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-workflow/preview-block-node.tsx b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-workflow/preview-block-node.tsx index 58248fcc72c..262b677e131 100644 --- a/apps/sim/app/(home)/components/landing-preview/components/landing-preview-workflow/preview-block-node.tsx +++ b/apps/sim/app/(home)/components/landing-preview/components/landing-preview-workflow/preview-block-node.tsx @@ -228,13 +228,13 @@ export const PreviewBlockNode = memo(function PreviewBlockNode({ {tools && tools.length > 0 && (
    Tools -
    +
    {tools.map((tool) => { const ToolIcon = BLOCK_ICONS[tool.type] return (
    Agent (KB + Notion tools) -> Slack + */ +const CUSTOMER_SUPPORT_WORKFLOW: PreviewWorkflow = { + id: 'wf-customer-support', + name: 'Customer Support Agent', + color: '#0EA5E9', + blocks: [ + { + id: 'gmail-1', + name: 'Gmail', + type: 'gmail', + bgColor: '#E0E0E0', + rows: [ + { title: 'Event', value: 'New Email' }, + { title: 'Label', value: 'Support' }, + ], + position: { x: 80, y: 140 }, + hideTargetHandle: true, + }, + { + id: 'agent-3', + name: 'Support Agent', + type: 'agent', + bgColor: '#701ffc', + rows: [ + { title: 'Model', value: 'gpt-5.4' }, + { title: 'System Prompt', value: 'Resolve customer issues...' }, + ], + tools: [ + { name: 'Knowledge', type: 'knowledge_base', bgColor: '#10B981' }, + { name: 'Notion', type: 'notion', bgColor: '#181C1E' }, + ], + position: { x: 420, y: 40 }, + }, + { + id: 'slack-3', + name: 'Slack', + type: 'slack', + bgColor: '#611f69', + rows: [ + { title: 'Channel', value: '#support' }, + { title: 'Operation', value: 'Send Message' }, + ], + position: { x: 420, y: 260 }, + hideSourceHandle: true, + }, + ], + edges: [ + { id: 'e-cs-1', source: 'gmail-1', target: 'agent-3' }, + { id: 'e-cs-2', source: 'gmail-1', target: 'slack-3' }, + ], +} + /** * Empty "New Agent" workflow — a single note prompting the user to start building */ @@ -153,6 +207,7 @@ const NEW_AGENT_WORKFLOW: PreviewWorkflow = { export const PREVIEW_WORKFLOWS: PreviewWorkflow[] = [ SELF_HEALING_CRM_WORKFLOW, IT_SERVICE_WORKFLOW, + CUSTOMER_SUPPORT_WORKFLOW, NEW_AGENT_WORKFLOW, ] diff --git a/apps/sim/app/(home)/components/landing-preview/landing-preview.tsx b/apps/sim/app/(home)/components/landing-preview/landing-preview.tsx index 646c830a735..bdce9f565ae 100644 --- a/apps/sim/app/(home)/components/landing-preview/landing-preview.tsx +++ b/apps/sim/app/(home)/components/landing-preview/landing-preview.tsx @@ -2,9 +2,15 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { motion, type Variants } from 'framer-motion' +import { LandingPreviewFiles } from '@/app/(home)/components/landing-preview/components/landing-preview-files/landing-preview-files' import { LandingPreviewHome } from '@/app/(home)/components/landing-preview/components/landing-preview-home/landing-preview-home' +import { LandingPreviewKnowledge } from '@/app/(home)/components/landing-preview/components/landing-preview-knowledge/landing-preview-knowledge' +import { LandingPreviewLogs } from '@/app/(home)/components/landing-preview/components/landing-preview-logs/landing-preview-logs' import { LandingPreviewPanel } from '@/app/(home)/components/landing-preview/components/landing-preview-panel/landing-preview-panel' +import { LandingPreviewScheduledTasks } from '@/app/(home)/components/landing-preview/components/landing-preview-scheduled-tasks/landing-preview-scheduled-tasks' +import type { SidebarView } from '@/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar' import { LandingPreviewSidebar } from '@/app/(home)/components/landing-preview/components/landing-preview-sidebar/landing-preview-sidebar' +import { LandingPreviewTables } from '@/app/(home)/components/landing-preview/components/landing-preview-tables/landing-preview-tables' import { LandingPreviewWorkflow } from '@/app/(home)/components/landing-preview/components/landing-preview-workflow/landing-preview-workflow' import { EASE_OUT, @@ -46,18 +52,16 @@ const panelVariants: Variants = { * Interactive workspace preview for the hero section. * * Renders a lightweight replica of the Sim workspace with: - * - A sidebar with two selectable workflows + * - A sidebar with selectable workflows and workspace nav items * - A ReactFlow canvas showing the active workflow's blocks and edges + * - Static previews of Tables, Files, Knowledge Base, Logs, and Scheduled Tasks * - A panel with a functional copilot input (stores prompt + redirects to /signup) * - * Everything except the workflow items and the copilot input is non-interactive. - * On mount the sidebar slides from left and the panel from right. The canvas - * background stays fully opaque; individual block nodes animate in with a - * staggered fade. Edges draw left-to-right. Animations only fire on initial - * load — workflow switches render instantly. + * Only workflow items, the home button, workspace nav items, and the copilot input + * are interactive. Animations only fire on initial load. */ export function LandingPreview() { - const [activeView, setActiveView] = useState<'home' | 'workflow'>('workflow') + const [activeView, setActiveView] = useState('workflow') const [activeWorkflowId, setActiveWorkflowId] = useState(PREVIEW_WORKFLOWS[0].id) const isInitialMount = useRef(true) @@ -74,11 +78,34 @@ export function LandingPreview() { setActiveView('home') }, []) + const handleSelectNav = useCallback((id: SidebarView) => { + setActiveView(id) + }, []) + const activeWorkflow = PREVIEW_WORKFLOWS.find((w) => w.id === activeWorkflowId) ?? PREVIEW_WORKFLOWS[0] const isWorkflowView = activeView === 'workflow' + function renderContent() { + switch (activeView) { + case 'workflow': + return + case 'home': + return + case 'tables': + return + case 'files': + return + case 'knowledge': + return + case 'logs': + return + case 'scheduled-tasks': + return + } + } + return (
    @@ -104,11 +132,7 @@ export function LandingPreview() { : 'relative flex min-w-0 flex-1 flex-col overflow-hidden' } > - {isWorkflowView ? ( - - ) : ( - - )} + {renderContent()}
    + {copied ? 'Copied!' : 'Copy link'} - Share on X - Share on LinkedIn + + + Share on X + + + + Share on LinkedIn + ) diff --git a/apps/sim/app/(landing)/components/landing-faq.tsx b/apps/sim/app/(landing)/components/landing-faq.tsx new file mode 100644 index 00000000000..435d0ca8e90 --- /dev/null +++ b/apps/sim/app/(landing)/components/landing-faq.tsx @@ -0,0 +1,63 @@ +'use client' + +import { useState } from 'react' +import { ChevronDown } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' + +export interface LandingFAQItem { + question: string + answer: string +} + +interface LandingFAQProps { + faqs: LandingFAQItem[] +} + +export function LandingFAQ({ faqs }: LandingFAQProps) { + const [openIndex, setOpenIndex] = useState(0) + + return ( +
    + {faqs.map(({ question, answer }, index) => { + const isOpen = openIndex === index + + return ( +
    + + + {isOpen && ( +
    +

    + {answer} +

    +
    + )} +
    + ) + })} +
    + ) +} diff --git a/apps/sim/app/(landing)/integrations/[slug]/components/integration-faq.tsx b/apps/sim/app/(landing)/integrations/[slug]/components/integration-faq.tsx index a0c6a8e1c70..6c71bc3e8e5 100644 --- a/apps/sim/app/(landing)/integrations/[slug]/components/integration-faq.tsx +++ b/apps/sim/app/(landing)/integrations/[slug]/components/integration-faq.tsx @@ -1,8 +1,4 @@ -'use client' - -import { useState } from 'react' -import { ChevronDown } from '@/components/emcn' -import { cn } from '@/lib/core/utils/cn' +import { LandingFAQ } from '@/app/(landing)/components/landing-faq' import type { FAQItem } from '@/app/(landing)/integrations/data/types' interface IntegrationFAQProps { @@ -10,49 +6,5 @@ interface IntegrationFAQProps { } export function IntegrationFAQ({ faqs }: IntegrationFAQProps) { - const [openIndex, setOpenIndex] = useState(0) - - return ( -
    - {faqs.map(({ question, answer }, index) => { - const isOpen = openIndex === index - return ( -
    - - - {isOpen && ( -
    -

    - {answer} -

    -
    - )} -
    - ) - })} -
    - ) + return } diff --git a/apps/sim/app/(landing)/integrations/data/icon-mapping.ts b/apps/sim/app/(landing)/integrations/data/icon-mapping.ts index 7b9b36c977a..26162d9a582 100644 --- a/apps/sim/app/(landing)/integrations/data/icon-mapping.ts +++ b/apps/sim/app/(landing)/integrations/data/icon-mapping.ts @@ -139,6 +139,7 @@ import { ResendIcon, RevenueCatIcon, RipplingIcon, + RootlyIcon, S3Icon, SalesforceIcon, SearchIcon, @@ -320,6 +321,7 @@ export const blockTypeToIconMap: Record = { resend: ResendIcon, revenuecat: RevenueCatIcon, rippling: RipplingIcon, + rootly: RootlyIcon, s3: S3Icon, salesforce: SalesforceIcon, search: SearchIcon, diff --git a/apps/sim/app/(landing)/integrations/data/integrations.json b/apps/sim/app/(landing)/integrations/data/integrations.json index f36c23fbb4d..3b578762f43 100644 --- a/apps/sim/app/(landing)/integrations/data/integrations.json +++ b/apps/sim/app/(landing)/integrations/data/integrations.json @@ -9293,90 +9293,358 @@ "type": "rippling", "slug": "rippling", "name": "Rippling", - "description": "Manage employees, leave, departments, and company data in Rippling", - "longDescription": "Integrate Rippling into your workflow. Manage employees, departments, teams, leave requests, work locations, groups, candidates, and company information.", + "description": "Manage workers, departments, custom objects, and company data in Rippling", + "longDescription": "Integrate Rippling Platform into your workflow. Manage workers, users, departments, teams, titles, work locations, business partners, supergroups, custom objects, custom apps, custom pages, custom settings, object categories, reports, and draft hires.", "bgColor": "#FFCC1C", "iconName": "RipplingIcon", "docsUrl": "https://docs.sim.ai/tools/rippling", "operations": [ { - "name": "List Employees", - "description": "List all employees in Rippling with optional pagination" + "name": "List Workers", + "description": "List all workers with optional filtering and pagination" }, { - "name": "Get Employee", - "description": "Get details for a specific employee by ID" + "name": "Get Worker", + "description": "Get a specific worker by ID" }, { - "name": "List Employees (Including Terminated)", - "description": "List all employees in Rippling including terminated employees with optional pagination" + "name": "List Users", + "description": "List all users with optional pagination" + }, + { + "name": "Get User", + "description": "Get a specific user by ID" + }, + { + "name": "List Companies", + "description": "List all companies" + }, + { + "name": "Get Current User", + "description": "Get SSO information for the current user" + }, + { + "name": "List Entitlements", + "description": "List all entitlements" }, { "name": "List Departments", - "description": "List all departments in the Rippling organization" + "description": "List all departments" + }, + { + "name": "Get Department", + "description": "Get a specific department by ID" + }, + { + "name": "Create Department", + "description": "Create a new department" + }, + { + "name": "Update Department", + "description": "Update an existing department" }, { "name": "List Teams", - "description": "List all teams in Rippling" + "description": "List all teams" }, { - "name": "List Levels", - "description": "List all position levels in Rippling" + "name": "Get Team", + "description": "Get a specific team by ID" }, { - "name": "List Work Locations", - "description": "List all work locations in Rippling" + "name": "List Employment Types", + "description": "List all employment types" }, { - "name": "Get Company", - "description": "Get details for the current company in Rippling" + "name": "Get Employment Type", + "description": "Get a specific employment type by ID" + }, + { + "name": "List Titles", + "description": "List all titles" }, { - "name": "Get Company Activity", - "description": "Get activity events for the current company in Rippling" + "name": "Get Title", + "description": "Get a specific title by ID" + }, + { + "name": "Create Title", + "description": "Create a new title" + }, + { + "name": "Update Title", + "description": "Update an existing title" + }, + { + "name": "Delete Title", + "description": "Delete a title" }, { "name": "List Custom Fields", - "description": "List all custom fields defined in Rippling" + "description": "List all custom fields" }, { - "name": "Get Current User", - "description": "Get the current authenticated user details" + "name": "List Job Functions", + "description": "List all job functions" }, { - "name": "List Leave Requests", - "description": "List leave requests in Rippling with optional filtering by date range and status" + "name": "Get Job Function", + "description": "Get a specific job function by ID" }, { - "name": "Approve/Decline Leave Request", - "description": "Approve or decline a leave request in Rippling" + "name": "List Work Locations", + "description": "List all work locations" }, { - "name": "List Leave Balances", - "description": "List leave balances for all employees in Rippling" + "name": "Get Work Location", + "description": "Get a specific work location by ID" }, { - "name": "Get Leave Balance", - "description": "Get leave balance for a specific employee by role ID" + "name": "Create Work Location", + "description": "Create a new work location" }, { - "name": "List Leave Types", - "description": "List company leave types configured in Rippling" + "name": "Update Work Location", + "description": "Update a work location" }, { - "name": "Create Group", - "description": "Create a new group in Rippling" + "name": "Delete Work Location", + "description": "Delete a work location" }, { - "name": "Update Group", - "description": "Update an existing group in Rippling" + "name": "List Business Partners", + "description": "List all business partners" + }, + { + "name": "Get Business Partner", + "description": "Get a specific business partner by ID" + }, + { + "name": "Create Business Partner", + "description": "Create a new business partner" + }, + { + "name": "Delete Business Partner", + "description": "Delete a business partner" + }, + { + "name": "List Business Partner Groups", + "description": "List all business partner groups" + }, + { + "name": "Get Business Partner Group", + "description": "Get a specific business partner group by ID" + }, + { + "name": "Create Business Partner Group", + "description": "Create a new business partner group" + }, + { + "name": "Delete Business Partner Group", + "description": "Delete a business partner group" }, { - "name": "Push Candidate", - "description": "Push a candidate to onboarding in Rippling" + "name": "List Supergroups", + "description": "List all supergroups" + }, + { + "name": "Get Supergroup", + "description": "Get a specific supergroup by ID" + }, + { + "name": "List Supergroup Members", + "description": "List members of a supergroup" + }, + { + "name": "List Supergroup Inclusion Members", + "description": "List inclusion members of a supergroup" + }, + { + "name": "List Supergroup Exclusion Members", + "description": "List exclusion members of a supergroup" + }, + { + "name": "Update Supergroup Inclusion Members", + "description": "Update inclusion members of a supergroup" + }, + { + "name": "Update Supergroup Exclusion Members", + "description": "Update exclusion members of a supergroup" + }, + { + "name": "List Custom Objects", + "description": "List all custom objects" + }, + { + "name": "Get Custom Object", + "description": "Get a custom object by API name" + }, + { + "name": "Create Custom Object", + "description": "Create a new custom object" + }, + { + "name": "Update Custom Object", + "description": "Update a custom object" + }, + { + "name": "Delete Custom Object", + "description": "Delete a custom object" + }, + { + "name": "List Custom Object Fields", + "description": "List all fields for a custom object" + }, + { + "name": "Get Custom Object Field", + "description": "Get a specific field of a custom object" + }, + { + "name": "Create Custom Object Field", + "description": "Create a field on a custom object" + }, + { + "name": "Update Custom Object Field", + "description": "Update a field on a custom object" + }, + { + "name": "Delete Custom Object Field", + "description": "Delete a field from a custom object" + }, + { + "name": "List Custom Object Records", + "description": "List all records for a custom object" + }, + { + "name": "Get Custom Object Record", + "description": "Get a specific custom object record" + }, + { + "name": "Get Custom Object Record by External ID", + "description": "Get a custom object record by external ID" + }, + { + "name": "Query Custom Object Records", + "description": "Query custom object records with filters" + }, + { + "name": "Create Custom Object Record", + "description": "Create a custom object record" + }, + { + "name": "Update Custom Object Record", + "description": "Update a custom object record" + }, + { + "name": "Delete Custom Object Record", + "description": "Delete a custom object record" + }, + { + "name": "Bulk Create Custom Object Records", + "description": "Bulk create custom object records" + }, + { + "name": "Bulk Update Custom Object Records", + "description": "Bulk update custom object records" + }, + { + "name": "Bulk Delete Custom Object Records", + "description": "Bulk delete custom object records" + }, + { + "name": "List Custom Apps", + "description": "List all custom apps" + }, + { + "name": "Get Custom App", + "description": "Get a specific custom app" + }, + { + "name": "Create Custom App", + "description": "Create a new custom app" + }, + { + "name": "Update Custom App", + "description": "Update a custom app" + }, + { + "name": "Delete Custom App", + "description": "Delete a custom app" + }, + { + "name": "List Custom Pages", + "description": "List all custom pages" + }, + { + "name": "Get Custom Page", + "description": "Get a specific custom page" + }, + { + "name": "Create Custom Page", + "description": "Create a new custom page" + }, + { + "name": "Update Custom Page", + "description": "Update a custom page" + }, + { + "name": "Delete Custom Page", + "description": "Delete a custom page" + }, + { + "name": "List Custom Settings", + "description": "List all custom settings" + }, + { + "name": "Get Custom Setting", + "description": "Get a specific custom setting" + }, + { + "name": "Create Custom Setting", + "description": "Create a new custom setting" + }, + { + "name": "Update Custom Setting", + "description": "Update a custom setting" + }, + { + "name": "Delete Custom Setting", + "description": "Delete a custom setting" + }, + { + "name": "List Object Categories", + "description": "List all object categories" + }, + { + "name": "Get Object Category", + "description": "Get a specific object category" + }, + { + "name": "Create Object Category", + "description": "Create a new object category" + }, + { + "name": "Update Object Category", + "description": "Update an object category" + }, + { + "name": "Delete Object Category", + "description": "Delete an object category" + }, + { + "name": "Get Report Run", + "description": "Get a report run by ID" + }, + { + "name": "Trigger Report Run", + "description": "Trigger a new report run" + }, + { + "name": "Create Draft Hires", + "description": "Create bulk draft hires" } ], - "operationCount": 19, + "operationCount": 86, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -9384,6 +9652,81 @@ "integrationType": "hr", "tags": ["hiring"] }, + { + "type": "rootly", + "slug": "rootly", + "name": "Rootly", + "description": "Manage incidents, alerts, and on-call with Rootly", + "longDescription": "Integrate Rootly incident management into workflows. Create and manage incidents, alerts, services, severities, and retrospectives.", + "bgColor": "#6C72C8", + "iconName": "RootlyIcon", + "docsUrl": "https://docs.sim.ai/tools/rootly", + "operations": [ + { + "name": "Create Incident", + "description": "Create a new incident in Rootly with optional severity, services, and teams." + }, + { + "name": "Get Incident", + "description": "Retrieve a single incident by ID from Rootly." + }, + { + "name": "Update Incident", + "description": "Update an existing incident in Rootly (status, severity, summary, etc.)." + }, + { + "name": "List Incidents", + "description": "List incidents from Rootly with optional filtering by status, severity, and more." + }, + { + "name": "Create Alert", + "description": "Create a new alert in Rootly for on-call notification and routing." + }, + { + "name": "List Alerts", + "description": "List alerts from Rootly with optional filtering by status, source, and services." + }, + { + "name": "Add Incident Event", + "description": "Add a timeline event to an existing incident in Rootly." + }, + { + "name": "List Services", + "description": "List services from Rootly with optional search filtering." + }, + { + "name": "List Severities", + "description": "List severity levels configured in Rootly." + }, + { + "name": "List Teams", + "description": "List teams (groups) configured in Rootly." + }, + { + "name": "List Environments", + "description": "List environments configured in Rootly." + }, + { + "name": "List Incident Types", + "description": "List incident types configured in Rootly." + }, + { + "name": "List Functionalities", + "description": "List functionalities configured in Rootly." + }, + { + "name": "List Retrospectives", + "description": "List incident retrospectives (post-mortems) from Rootly." + } + ], + "operationCount": 14, + "triggers": [], + "triggerCount": 0, + "authType": "api-key", + "category": "tools", + "integrationType": "developer-tools", + "tags": ["incident-management", "monitoring"] + }, { "type": "s3", "slug": "s3", diff --git a/apps/sim/app/(landing)/models/[provider]/[model]/opengraph-image.tsx b/apps/sim/app/(landing)/models/[provider]/[model]/opengraph-image.tsx new file mode 100644 index 00000000000..0d7911dc110 --- /dev/null +++ b/apps/sim/app/(landing)/models/[provider]/[model]/opengraph-image.tsx @@ -0,0 +1,42 @@ +import { notFound } from 'next/navigation' +import { createModelsOgImage } from '@/app/(landing)/models/og-utils' +import { + formatPrice, + formatTokenCount, + getModelBySlug, + getProviderBySlug, +} from '@/app/(landing)/models/utils' + +export const runtime = 'edge' +export const contentType = 'image/png' +export const size = { + width: 1200, + height: 630, +} + +export default async function Image({ + params, +}: { + params: Promise<{ provider: string; model: string }> +}) { + const { provider: providerSlug, model: modelSlug } = await params + const provider = getProviderBySlug(providerSlug) + const model = getModelBySlug(providerSlug, modelSlug) + + if (!provider || !model) { + notFound() + } + + return createModelsOgImage({ + eyebrow: `${provider.name} model`, + title: model.displayName, + subtitle: `${provider.name} pricing, context window, and feature support generated from Sim's model registry.`, + pills: [ + `Input ${formatPrice(model.pricing.input)}/1M`, + `Output ${formatPrice(model.pricing.output)}/1M`, + model.contextWindow ? `${formatTokenCount(model.contextWindow)} context` : 'Unknown context', + model.capabilityTags[0] ?? 'Capabilities tracked', + ], + domainLabel: `sim.ai${model.href}`, + }) +} diff --git a/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx b/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx new file mode 100644 index 00000000000..fd7557e37c7 --- /dev/null +++ b/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx @@ -0,0 +1,390 @@ +import type { Metadata } from 'next' +import Link from 'next/link' +import { notFound } from 'next/navigation' +import { getBaseUrl } from '@/lib/core/utils/urls' +import { LandingFAQ } from '@/app/(landing)/components/landing-faq' +import { + Breadcrumbs, + CapabilityTags, + DetailItem, + ModelCard, + ProviderIcon, + StatCard, +} from '@/app/(landing)/models/components/model-primitives' +import { + ALL_CATALOG_MODELS, + buildModelCapabilityFacts, + buildModelFaqs, + formatPrice, + formatTokenCount, + formatUpdatedAt, + getModelBySlug, + getPricingBounds, + getProviderBySlug, + getRelatedModels, +} from '@/app/(landing)/models/utils' + +const baseUrl = getBaseUrl() + +export async function generateStaticParams() { + return ALL_CATALOG_MODELS.map((model) => ({ + provider: model.providerSlug, + model: model.slug, + })) +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ provider: string; model: string }> +}): Promise { + const { provider: providerSlug, model: modelSlug } = await params + const provider = getProviderBySlug(providerSlug) + const model = getModelBySlug(providerSlug, modelSlug) + + if (!provider || !model) { + return {} + } + + return { + title: `${model.displayName} Pricing, Context Window, and Features`, + description: `${model.displayName} by ${provider.name}: pricing, cached input cost, output cost, context window, and capability support. Explore the full generated model page on Sim.`, + keywords: [ + model.displayName, + `${model.displayName} pricing`, + `${model.displayName} context window`, + `${model.displayName} features`, + `${provider.name} ${model.displayName}`, + `${provider.name} model pricing`, + ...model.capabilityTags, + ], + openGraph: { + title: `${model.displayName} Pricing, Context Window, and Features | Sim`, + description: `${model.displayName} by ${provider.name}: pricing, context window, and model capability details.`, + url: `${baseUrl}${model.href}`, + type: 'website', + images: [ + { + url: `${baseUrl}${model.href}/opengraph-image`, + width: 1200, + height: 630, + alt: `${model.displayName} on Sim`, + }, + ], + }, + twitter: { + card: 'summary_large_image', + title: `${model.displayName} | Sim`, + description: model.summary, + images: [ + { url: `${baseUrl}${model.href}/opengraph-image`, alt: `${model.displayName} on Sim` }, + ], + }, + alternates: { + canonical: `${baseUrl}${model.href}`, + }, + } +} + +export default async function ModelPage({ + params, +}: { + params: Promise<{ provider: string; model: string }> +}) { + const { provider: providerSlug, model: modelSlug } = await params + const provider = getProviderBySlug(providerSlug) + const model = getModelBySlug(providerSlug, modelSlug) + + if (!provider || !model) { + notFound() + } + + const faqs = buildModelFaqs(provider, model) + const capabilityFacts = buildModelCapabilityFacts(model) + const pricingBounds = getPricingBounds(model.pricing) + const relatedModels = getRelatedModels(model, 6) + + const breadcrumbJsonLd = { + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement: [ + { '@type': 'ListItem', position: 1, name: 'Home', item: baseUrl }, + { '@type': 'ListItem', position: 2, name: 'Models', item: `${baseUrl}/models` }, + { '@type': 'ListItem', position: 3, name: provider.name, item: `${baseUrl}${provider.href}` }, + { + '@type': 'ListItem', + position: 4, + name: model.displayName, + item: `${baseUrl}${model.href}`, + }, + ], + } + + const productJsonLd = { + '@context': 'https://schema.org', + '@type': 'Product', + name: model.displayName, + brand: provider.name, + category: 'AI language model', + description: model.summary, + sku: model.id, + offers: { + '@type': 'AggregateOffer', + priceCurrency: 'USD', + lowPrice: pricingBounds.lowPrice.toString(), + highPrice: pricingBounds.highPrice.toString(), + }, + } + + const faqJsonLd = { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: faqs.map((faq) => ({ + '@type': 'Question', + name: faq.question, + acceptedAnswer: { + '@type': 'Answer', + text: faq.answer, + }, + })), + } + + return ( + <> +