import { defineIntegrationCatalog, defineIntegrationService } from "./types" import type { IntegrationServiceDefinition } from "./types" const API_KEY_FIELD = { input: "password", label: "API key", name: "apiKey", required: true, } as const export const airtableService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://airtable.com/create/tokens", fields: [ { input: "password", label: "Personal access token", name: "apiKey", placeholder: "pat...", required: true, }, ], id: "personal-access-token", name: "Personal access token", type: "form", }, ], description: "Connect Airtable with OAuth or a personal access token.", id: "airtable", name: "Airtable", preferredConnectionMethodId: "oauth", }) export const anthropicService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://platform.claude.com/settings/keys", fields: [{ ...API_KEY_FIELD, placeholder: "sk-ant-..." }], id: "api-key", name: "API key", type: "form", }, { credentialUrl: "https://platform.claude.com/settings/webhooks", fields: [ { ...API_KEY_FIELD, placeholder: "sk-ant-..." }, { input: "text", label: "Workspace ID", name: "workspaceId", placeholder: "Optional for single-workspace keys", required: false, }, { input: "password", label: "Webhook signing key", name: "webhookSecret", placeholder: "whsec_...", required: true, }, ], id: "managed-agents", name: "Managed Agents", type: "form", }, ], description: "Connect Anthropic for Claude models or Claude Managed Agents and webhooks.", id: "anthropic", name: "Anthropic", }) export const apolloService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { fields: [{ ...API_KEY_FIELD, placeholder: "Apollo API key" }], id: "api-key", name: "API key", type: "form", }, ], description: "Connect an Apollo account with OAuth or an API key.", id: "apollo", name: "Apollo", preferredConnectionMethodId: "oauth", }) export const apifyService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://console.apify.com/settings/integrations", fields: [ { input: "password", label: "API token", name: "apiKey", placeholder: "apify_api_...", required: true, }, ], id: "api-token", name: "API token", type: "form", }, ], description: "Connect an Apify account with an API token.", id: "apify", name: "Apify", }) export const asanaService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect an Asana account.", id: "asana", name: "Asana", }) export const calendlyService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect Calendly for scheduling actions and signed lifecycle triggers.", id: "calendly", name: "Calendly", }) export const automateService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://docs.automate.ax/reference/integrations/automate/overview", fields: [ { input: "password", label: "Organization API key", name: "apiKey", placeholder: "api_...", required: true, }, ], id: "organization-api-key", name: "Organization API key", type: "form", }, ], description: "Connect an Automate.ax organization for management actions and lifecycle triggers.", id: "automate", name: "Automate.ax", }) export const axiomService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://app.axiom.co/settings/api-tokens", fields: [ { input: "password", label: "API token", name: "apiKey", placeholder: "xaat-...", required: true, }, ], id: "api-token", name: "API token", type: "form", }, ], description: "Connect an Axiom API token for data, monitors, notifiers, and dashboards.", id: "axiom", name: "Axiom", }) export const brevoService = defineApiKeyService({ credentialUrl: "https://app.brevo.com/settings/keys/api", description: "Connect a Brevo API key for messaging, contacts, campaigns, and managed events.", id: "brevo", name: "Brevo", placeholder: "xkeysib-...", }) export const browserbaseService = defineApiKeyService({ credentialUrl: "https://www.browserbase.com/settings", description: "Connect a Browserbase API key.", id: "browserbase", name: "Browserbase", placeholder: "bb_live_...", }) export const cerebrasService = defineApiKeyService({ description: "Connect a Cerebras API key.", id: "cerebras", name: "Cerebras", }) export const cloudflareService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { fields: [ { input: "password", label: "API token", name: "apiKey", placeholder: "Token with Account Settings Read", required: true, }, ], id: "api-token", name: "API token", type: "form", }, ], description: "Connect with OAuth or an API token that includes Account Settings Read.", id: "cloudflare", name: "Cloudflare", preferredConnectionMethodId: "oauth", }) export const metaAdsService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect Meta Ads for campaign management, reporting, audiences, leads, conversions, and events.", id: "meta-ads", name: "Meta Ads", }) export const closeService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://app.close.com/settings/developer/api-keys", fields: [{ ...API_KEY_FIELD, placeholder: "Close API key" }], id: "api-key", name: "API key", type: "form", }, ], description: "Connect a Close CRM account with OAuth or an API key.", id: "close", name: "Close", preferredConnectionMethodId: "oauth", }) export const closeBotService = defineApiKeyService({ credentialUrl: "https://app.closebot.com/settings?tab=keys", description: "Connect a CloseBot account with an API key.", id: "closebot", name: "CloseBot", placeholder: "CloseBot API key", }) export const clickUpService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://app.clickup.com/settings/apps", fields: [ { input: "password", label: "Personal API token", name: "apiKey", placeholder: "pk_...", required: true, }, ], id: "personal-token", name: "Personal API token", type: "form", }, ], description: "Connect a ClickUp account with OAuth or a personal API token.", id: "clickup", name: "ClickUp", preferredConnectionMethodId: "oauth", }) export const chatgptService = defineIntegrationService({ connectionMethods: [ { fields: [ { input: "password", label: "Workspace Agent access token", name: "apiKey", placeholder: "Paste your ChatGPT access token", required: true, }, ], credentialUrl: "https://developers.openai.com/workspace-agents/authentication", id: "access-token", name: "Access token", type: "form", }, ], connectionNotice: { action: { href: "https://developers.openai.com/workspace-agents/authentication", label: "Review access-token setup", }, description: "A ChatGPT workspace admin must enable Workspace agents and personal access tokens before you can create this token.", title: "Workspace Agent access required", }, description: "Connect a Workspace Agent access token.", icon: "openai", id: "chatgpt", name: "ChatGPT", }) export const codexService = defineIntegrationService({ connectionMethods: [ { fields: [ { input: "password", label: "Codex access token", name: "apiKey", placeholder: "Paste your Codex access token", required: true, }, ], id: "access-token", name: "Access token", type: "form", }, ], description: "Connect a Codex workspace access token.", id: "codex", name: "Codex", }) export const cohereService = defineApiKeyService({ description: "Connect a Cohere API key.", id: "cohere", name: "Cohere", }) export const convexService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "Project OAuth", type: "redirect" }, { fields: [ { description: "Use the deployment's https://.convex.cloud URL.", input: "url", label: "Deployment URL", name: "deploymentUrl", placeholder: "https://example.convex.cloud", required: true, }, { input: "password", label: "Deploy key", name: "deployKey", placeholder: "Paste a Convex deploy key", required: true, }, { description: "Set the same value as AUTOMATE_AX_WEBHOOK_SECRET in Convex to emit signed semantic events.", input: "password", label: "Webhook signing secret", name: "webhookSecret", placeholder: "At least 32 characters", required: false, }, ], id: "deployment-key", name: "Deployment key", type: "form", }, ], description: "Connect a Convex project for function calls and durable event triggers.", id: "convex", name: "Convex", preferredConnectionMethodId: "oauth", }) export const discordService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://discord.com/developers/applications", fields: [ { input: "password", label: "Bot token", name: "botToken", placeholder: "Paste your Discord bot token", required: true, }, ], id: "bot-token", name: "Bot token", type: "form", }, ], connectionNotice: { action: { href: "https://docs.automate.ax/reference/integrations/discord/overview", label: "View setup guide", }, description: "Create your own Discord application, install its bot in each server you automate, and paste the bot token here.", title: "Customer-managed Discord bot", }, description: "Connect a customer-managed Discord bot for server actions and signed webhook events.", id: "discord", name: "Discord", }) export const deepinfraService = defineApiKeyService({ description: "Connect a DeepInfra API key.", id: "deepinfra", name: "DeepInfra", }) export const deepseekService = defineApiKeyService({ description: "Connect a DeepSeek API key.", id: "deepseek", name: "DeepSeek", }) export const elevenLabsService = defineApiKeyService({ credentialUrl: "https://elevenlabs.io/app/settings/api-keys", description: "Connect ElevenLabs for speech, audio, music, dubbing, agents, and managed events.", id: "elevenlabs", name: "ElevenLabs", placeholder: "sk_...", }) export const firecrawlService = defineApiKeyService({ description: "Connect a Firecrawl API key.", id: "firecrawl", name: "Firecrawl", placeholder: "fc-...", }) export const fireworksService = defineApiKeyService({ description: "Connect a Fireworks AI API key.", id: "fireworks", name: "Fireworks AI", }) export const githubService = defineIntegrationService({ connectionMethods: [ { id: "github-app", name: "GitHub App", type: "redirect" }, ], description: "Install Automate.ax on a GitHub account or organization.", id: "github", name: "GitHub", }) const GOOGLE_OAUTH_ALLOWED_SCOPES = [ "email", "openid", "profile", "https://www.googleapis.com/auth/adwords", "https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.acls", "https://www.googleapis.com/auth/calendar.acls.readonly", "https://www.googleapis.com/auth/calendar.app.created", "https://www.googleapis.com/auth/calendar.calendarlist", "https://www.googleapis.com/auth/calendar.calendarlist.readonly", "https://www.googleapis.com/auth/calendar.calendars", "https://www.googleapis.com/auth/calendar.calendars.readonly", "https://www.googleapis.com/auth/calendar.events", "https://www.googleapis.com/auth/calendar.events.freebusy", "https://www.googleapis.com/auth/calendar.events.owned", "https://www.googleapis.com/auth/calendar.events.owned.readonly", "https://www.googleapis.com/auth/calendar.events.public.readonly", "https://www.googleapis.com/auth/calendar.events.readonly", "https://www.googleapis.com/auth/calendar.freebusy", "https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/datamanager", "https://www.googleapis.com/auth/documents", "https://www.googleapis.com/auth/documents.readonly", "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly", "https://www.googleapis.com/auth/forms.body", "https://www.googleapis.com/auth/forms.body.readonly", "https://www.googleapis.com/auth/forms.responses.readonly", "https://www.googleapis.com/auth/gmail.compose", "https://www.googleapis.com/auth/gmail.labels", "https://www.googleapis.com/auth/gmail.metadata", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/gmail.send", "https://www.googleapis.com/auth/meetings.space.created", "https://www.googleapis.com/auth/meetings.space.readonly", "https://www.googleapis.com/auth/meetings.space.settings", "https://www.googleapis.com/auth/presentations", "https://www.googleapis.com/auth/presentations.readonly", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/spreadsheets.readonly", ] as const export const googleService = defineIntegrationService({ connectionMethods: [ { allowedScopes: GOOGLE_OAUTH_ALLOWED_SCOPES, id: "oauth", name: "OAuth", type: "redirect", }, ], connectionNotice: { action: { href: "https://automate.ax/privacy", label: "Google data use and deletion", }, description: "During alpha, email hello@automate.ax to request access for the Google Account you want to connect. Automate.ax uses the Google permissions you grant to run your automations. Results may be stored in run history, shared with authorized organization members, and sent to services or AI providers your automation selects. Review those destinations before authorizing. Google Workspace data must not be used for advertising or general AI model training. Email info@automate.ax to request deletion.", title: "Google account data", }, description: "Connect a Google account.", id: "google", name: "Google", }) export const googleGenaiService = defineApiKeyService({ description: "Connect a Google AI Studio API key.", id: "google-genai", name: "Google Generative AI", placeholder: "AIza...", }) export const groqService = defineApiKeyService({ description: "Connect a Groq API key.", id: "groq", name: "Groq", }) export const huggingfaceService = defineIntegrationService({ connectionMethods: [ { fields: [ { ...API_KEY_FIELD, label: "Access token", placeholder: "hf_...", }, ], id: "access-token", name: "Access token", type: "form", }, ], description: "Connect a Hugging Face access token.", id: "huggingface", name: "Hugging Face", }) export const hubspotService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://app.hubspot.com/private-apps/", fields: [ { input: "password", label: "Private app access token", name: "accessToken", placeholder: "pat-...", required: true, }, ], id: "private-app", name: "Private app access token", type: "form", }, ], description: "Connect a HubSpot CRM account with OAuth or a private app token.", id: "hubspot", name: "HubSpot", preferredConnectionMethodId: "oauth", }) export const highLevelService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://marketplace.gohighlevel.com/docs/Authorization/PrivateIntegrationsToken/index.html", fields: [ { input: "password", label: "Private Integration Token", name: "accessToken", placeholder: "Paste the sub-account token", required: true, }, { input: "text", label: "Location ID", name: "locationId", placeholder: "HighLevel sub-account location ID", required: true, }, ], id: "private-integration-token", name: "Private Integration Token", type: "form", }, ], description: "Connect a HighLevel sub-account with OAuth or a Private Integration Token.", id: "highlevel", name: "HighLevel", preferredConnectionMethodId: "oauth", }) export const linearService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://linear.app/settings/api", fields: [{ ...API_KEY_FIELD, placeholder: "lin_api_..." }], id: "api-key", name: "Personal API key", type: "form", }, ], description: "Connect a Linear workspace with OAuth or a personal API key.", id: "linear", name: "Linear", preferredConnectionMethodId: "oauth", }) export const krispService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://app.krisp.ai/user-settings/api", fields: [ { input: "password", label: "Personal API key", name: "apiKey", placeholder: "krsp_u_...", required: true, }, { default: true, description: "Use meeting, action-item, tag, profile, and import-status actions.", input: "boolean", label: "Read access", name: "readAccess", required: false, }, { default: false, description: "Upload recordings for Krisp to process.", input: "boolean", label: "Write access", name: "writeAccess", required: false, }, ], id: "api-key", name: "Personal API key", type: "form", }, ], connectionNotice: { action: { href: "https://meeting-api-docs.krisp.ai/", label: "View Krisp API requirements", }, description: "Krisp Meeting Assistant API access requires a Core, Advanced, or Trial plan. Create a personal key with the access selected below.", title: "Krisp plan and key required", }, description: "Connect Krisp Meeting Assistant for meetings, transcripts, notes, action items, tags, and recording imports.", id: "krisp", name: "Krisp", }) export const jobNimbusService = defineApiKeyService({ credentialUrl: "https://app.jobnimbus.com/account#api", description: "Connect a JobNimbus account with an API key.", id: "jobnimbus", name: "JobNimbus", placeholder: "JobNimbus API key", }) export const microsoftService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect a Microsoft account.", id: "microsoft", name: "Microsoft", }) export const millionverifierService = defineApiKeyService({ credentialUrl: "https://app.millionverifier.com/api", description: "Connect a MillionVerifier API key.", id: "millionverifier", name: "MillionVerifier", placeholder: "MillionVerifier API key", }) export const mistralService = defineApiKeyService({ description: "Connect a Mistral AI API key.", id: "mistral", name: "Mistral AI", }) export const notionService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://www.notion.so/developers/tokens", fields: [ { input: "password", label: "Personal access token", name: "apiKey", placeholder: "ntn_...", required: true, }, ], id: "personal-access-token", name: "Personal access token", type: "form", }, ], description: "Connect a Notion workspace with OAuth or a personal access token.", id: "notion", name: "Notion", preferredConnectionMethodId: "oauth", }) export const openaiService = defineApiKeyService({ credentialUrl: "https://platform.openai.com/api-keys", description: "Connect an OpenAI API key.", id: "openai", name: "OpenAI", placeholder: "sk-...", }) export const onePasswordService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://www.1password.dev/service-accounts/get-started", fields: [ { description: "Create an immutable service account with access to only the vaults and Environments this automation needs.", input: "password", label: "Service account token", name: "serviceAccountToken", placeholder: "ops_...", required: true, }, ], id: "service-account", name: "Service account", type: "form", }, { credentialUrl: "https://www.1password.dev/events-api/get-started", fields: [ { default: "https://events.1password.com", description: "Use the Events API URL shown by 1Password for your account region.", input: "url", label: "Events API URL", name: "baseUrl", placeholder: "https://events.1password.com", required: true, }, { input: "password", label: "Events API bearer token", name: "bearerToken", placeholder: "Paste the Events Reporting token", required: true, }, ], id: "events-api-token", name: "Events API token", type: "form", }, ], description: "Connect a 1Password service account for secrets automation or an Events API token for account activity.", id: "1password", name: "1Password", preferredConnectionMethodId: "service-account", }) export const openrouterService = defineApiKeyService({ description: "Connect an OpenRouter API key.", id: "openrouter", name: "OpenRouter", placeholder: "sk-or-...", }) export const perplexityService = defineApiKeyService({ description: "Connect a Perplexity API key.", id: "perplexity", name: "Perplexity", }) export const postgresService = defineIntegrationService({ connectionMethods: [ { fields: [ { description: "For Supabase, use its provided URL and append ?uselibpqcompat=true&sslmode=require only when you intend libpq's encrypted, non-verifying require behavior.", input: "password", label: "Connection string", name: "connectionString", placeholder: "postgresql://postgres.project-ref:password@aws-0-region.pooler.supabase.com:5432/postgres?uselibpqcompat=true&sslmode=require", required: true, }, ], id: "credentials", name: "Credentials", type: "form", }, ], description: "Connect a PostgreSQL database with a least-privilege role.", id: "postgres", name: "PostgreSQL", }) export const resendService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { fields: [{ ...API_KEY_FIELD, placeholder: "re_..." }], id: "api-key", name: "API key", type: "form", }, ], description: "Connect a Resend account with OAuth or an API key.", id: "resend", name: "Resend", preferredConnectionMethodId: "oauth", }) export const redditService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], connectionNotice: { action: { href: "https://support.reddithelp.com/hc/en-us/articles/14945211791892-Reddit-Data-API-Wiki", label: "Review Reddit API access", }, description: "Reddit requires approval for commercial Data API access. Connect only an approved Reddit application.", title: "Reddit approval required", }, description: "Connect a Reddit account with OAuth.", id: "reddit", name: "Reddit", }) export const scrapflyService = defineApiKeyService({ credentialUrl: "https://scrapfly.io/dashboard/project", description: "Connect a Scrapfly API key.", id: "scrapfly", name: "Scrapfly", placeholder: "scp-live-...", }) export const slackService = defineIntegrationService({ connectionNotice: { action: { href: "https://docs.slack.dev/slack-marketplace/slack-marketplace-app-guidelines-and-requirements/#automation-platform-apps", label: "Review Slack requirements", }, description: "Slack requires automation-platform apps to connect only to paid workspaces. Free workspace authorizations are rejected and revoked.", title: "Paid Slack workspace required", }, connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Install the Automate.ax bot in a Slack workspace.", id: "slack", name: "Slack", }) export const squareService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect a Square seller account with OAuth.", id: "square", name: "Square", }) export const stripeService = defineApiKeyService({ connectionNotice: { action: { href: "https://docs.stripe.com/keys#limit-access", label: "Review permissions", }, description: "Restricted keys need read access to Account for connection checks. Managed triggers also need write access to Webhook Endpoints.", title: "Stripe restricted-key permissions", }, credentialUrl: "https://dashboard.stripe.com/apikeys", description: "Connect a Stripe account with a secret or restricted API key.", id: "stripe", name: "Stripe", placeholder: "sk_test_... or rk_test_...", }) export const tidycalService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://tidycal.com/integrations/advanced", fields: [ { input: "password", label: "Personal access token", name: "apiKey", placeholder: "Paste your TidyCal personal access token", required: true, }, ], id: "personal-access-token", name: "Personal access token", type: "form", }, ], connectionNotice: { action: { href: "https://help.tidycal.com/article/739-faq", label: "Review API requirements", }, description: "TidyCal API access requires an Individual, Agency, or Pro plan.", title: "Paid TidyCal plan required", }, description: "Connect TidyCal with OAuth or a personal access token.", id: "tidycal", name: "TidyCal", preferredConnectionMethodId: "oauth", }) export const calcomService = defineIntegrationService({ connectionMethods: [ { credentialUrl: "https://app.cal.com/settings/developer/api-keys", fields: [ { input: "password", label: "API key", name: "apiKey", placeholder: "cal_... or cal_live_...", required: true, }, ], id: "api-key", name: "API key", type: "form", }, ], description: "Connect Cal.com with an API key.", id: "calcom", name: "Cal.com", }) export const kitService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { credentialUrl: "https://app.kit.com/account_settings/developer_settings", fields: [ { input: "password", label: "V4 API key", name: "apiKey", placeholder: "kit_...", required: true, }, ], id: "api-key", name: "V4 API key", type: "form", }, ], description: "Connect Kit with OAuth or a V4 API key.", id: "kit", name: "Kit", preferredConnectionMethodId: "oauth", }) export const togetheraiService = defineApiKeyService({ description: "Connect a Together AI API key.", id: "togetherai", name: "Together AI", }) export const trelloService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect a Trello account.", id: "trello", name: "Trello", }) export const vercelAiGatewayService = defineApiKeyService({ description: "Connect a Vercel AI Gateway API key.", icon: "vercel", id: "vercel-ai-gateway", name: "Vercel AI Gateway", }) export const vercelService = defineIntegrationService({ connectionMethods: [ { id: "oauth", name: "OAuth", type: "redirect" }, { fields: [ { input: "password", label: "Access token", name: "apiKey", placeholder: "Vercel access token", required: true, }, ], id: "access-token", name: "Access token", type: "form", }, ], description: "Connect a Vercel account with OAuth or an access token.", id: "vercel", name: "Vercel", preferredConnectionMethodId: "oauth", }) export const whatsappService = defineIntegrationService({ connectionMethods: [ { id: "embedded-signup", name: "Embedded Signup", type: "redirect" }, ], description: "Connect a WhatsApp Business Platform phone number.", id: "whatsapp", name: "WhatsApp", }) export const webflowService = defineIntegrationService({ connectionMethods: [{ id: "oauth", name: "OAuth", type: "redirect" }], description: "Connect Webflow sites and workspaces.", id: "webflow", name: "Webflow", }) export const xaiService = defineApiKeyService({ description: "Connect an xAI API key.", id: "xai", name: "xAI", placeholder: "xai-...", }) export const tallyService = defineApiKeyService({ credentialUrl: "https://tally.so/settings/api-keys", description: "Connect a Tally API key for forms, submissions, analytics, and signed triggers.", id: "tally", name: "Tally", placeholder: "tly-...", }) export const integrationCatalog = defineIntegrationCatalog([ airtableService, anthropicService, apolloService, apifyService, asanaService, calendlyService, automateService, axiomService, brevoService, browserbaseService, calcomService, cerebrasService, chatgptService, cloudflareService, metaAdsService, closeService, closeBotService, clickUpService, codexService, cohereService, convexService, discordService, elevenLabsService, deepinfraService, deepseekService, firecrawlService, fireworksService, githubService, googleService, googleGenaiService, groqService, huggingfaceService, hubspotService, highLevelService, jobNimbusService, kitService, krispService, linearService, microsoftService, millionverifierService, mistralService, notionService, openaiService, onePasswordService, openrouterService, perplexityService, postgresService, redditService, resendService, scrapflyService, slackService, squareService, stripeService, tallyService, tidycalService, togetheraiService, trelloService, vercelAiGatewayService, vercelService, webflowService, whatsappService, xaiService, ]) export type IntegrationServiceId = (typeof integrationCatalog)[number]["id"] /** * Looks up one known integration service by its stable ID. * * @param id - Stable integration service ID. */ export function getIntegrationService( id: string, ): IntegrationServiceDefinition | undefined { return integrationCatalog.find((service) => service.id === id) } interface ApiKeyServiceDefinition extends Pick { credentialUrl?: string description: string icon?: string name: string placeholder?: string } /** * Defines one service backed by a conventional API-key credential form. * * @param service - API-key service identity and credential placeholder. */ function defineApiKeyService( service: ApiKeyServiceDefinition & { id: TId }, ) { return defineIntegrationService({ connectionMethods: [ { ...(service.credentialUrl ? { credentialUrl: service.credentialUrl } : {}), fields: [ { ...API_KEY_FIELD, placeholder: service.placeholder ?? "API key", }, ], id: "api-key", name: "API key", type: "form", }, ], ...(service.connectionNotice ? { connectionNotice: service.connectionNotice } : {}), description: service.description, ...(service.icon ? { icon: service.icon } : {}), id: service.id, name: service.name, }) }