From 76557f2f7e674a7a9c47087ead47c95f8acf2cc6 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 3 Nov 2026 17:55:37 -0800 Subject: [PATCH 1/3] feat(image-generator): refresh provider model catalogs and validate requests --- apps/sim/blocks/blocks/image_generator.ts | 636 +-- .../sim/lib/internal/image/operations.test.ts | 96 + apps/sim/lib/internal/image/operations.ts | 481 +- apps/sim/lib/internal/image/request.ts | 62 + apps/sim/lib/media/fal-image-models.json | 4970 +++++++++++++++++ apps/sim/lib/media/image-catalog.ts | 133 + .../tools/server/image/generate-image.ts | 2 +- apps/sim/scripts/validate-fal-image-models.ts | 144 + apps/sim/tools/generated/tool-metadata.ts | 2 +- apps/sim/tools/image/generate.ts | 6 +- ...check-tool-registry-boundary.baseline.json | 14 +- 11 files changed, 5617 insertions(+), 929 deletions(-) create mode 100644 apps/sim/lib/internal/image/request.ts create mode 100644 apps/sim/lib/media/fal-image-models.json create mode 100644 apps/sim/lib/media/image-catalog.ts create mode 100644 apps/sim/scripts/validate-fal-image-models.ts diff --git a/apps/sim/blocks/blocks/image_generator.ts b/apps/sim/blocks/blocks/image_generator.ts index 6b8bbd46a39..3a84d3050aa 100644 --- a/apps/sim/blocks/blocks/image_generator.ts +++ b/apps/sim/blocks/blocks/image_generator.ts @@ -1,55 +1,13 @@ import { ImageIcon } from '@/components/icons' -import { AuthMode, type BlockConfig, IntegrationType } from '@/blocks/types' +import { + getImageModel, + imageModelDefaults, + imageModels, + imageOptionFields, +} from '@/lib/media/image-catalog' +import { AuthMode, type BlockConfig, IntegrationType, type SubBlockConfig } from '@/blocks/types' import { parseOptionalBooleanInput } from '@/blocks/utils' -const OPENAI_GPT_IMAGE_MODELS = [ - { label: 'GPT Image 1.5', id: 'gpt-image-1.5' }, - { label: 'GPT Image 1', id: 'gpt-image-1' }, - { label: 'GPT Image 1 Mini', id: 'gpt-image-1-mini' }, -] - -const GEMINI_IMAGE_MODELS = [ - { label: 'Nano Banana 2', id: 'gemini-3.1-flash-image-preview' }, - { label: 'Nano Banana Pro', id: 'gemini-3-pro-image-preview' }, - { label: 'Nano Banana', id: 'gemini-2.5-flash-image' }, -] - -const FALAI_IMAGE_MODELS = [ - { label: 'Nano Banana 2', id: 'nano-banana-2' }, - { label: 'Nano Banana Pro', id: 'nano-banana-pro' }, - { label: 'GPT Image 1.5', id: 'gpt-image-1.5' }, - { label: 'Seedream 4.5', id: 'seedream-v4.5' }, - { label: 'FLUX 2 Pro', id: 'flux-2-pro' }, - { label: 'Grok Imagine Image', id: 'grok-imagine-image' }, - { label: 'Nano Banana', id: 'nano-banana' }, -] - -const BASE_ASPECT_RATIO_OPTIONS = [ - { label: '1:1', id: '1:1' }, - { label: '16:9', id: '16:9' }, - { label: '9:16', id: '9:16' }, - { label: '3:2', id: '3:2' }, - { label: '2:3', id: '2:3' }, - { label: '4:3', id: '4:3' }, - { label: '3:4', id: '3:4' }, - { label: '5:4', id: '5:4' }, - { label: '4:5', id: '4:5' }, - { label: '21:9', id: '21:9' }, -] - -const EXTREME_ASPECT_RATIO_OPTIONS = [ - { label: '4:1', id: '4:1' }, - { label: '1:4', id: '1:4' }, - { label: '8:1', id: '8:1' }, - { label: '1:8', id: '1:8' }, -] - -const OUTPUT_FORMAT_OPTIONS = [ - { label: 'PNG', id: 'png' }, - { label: 'JPEG', id: 'jpeg' }, - { label: 'WebP', id: 'webp' }, -] - export const ImageGeneratorBlock: BlockConfig = { type: 'image_generator', name: 'Image Generator', @@ -351,33 +309,23 @@ export const ImageGeneratorV2Block: BlockConfig = { commandSearchable: true, value: () => 'falai', }, - { - id: 'model', - title: 'Model', - type: 'dropdown', - options: OPENAI_GPT_IMAGE_MODELS, - value: () => 'gpt-image-1.5', - condition: { field: 'provider', value: 'openai' }, - dependsOn: ['provider'], - }, - { - id: 'model', - title: 'Model', - type: 'dropdown', - options: GEMINI_IMAGE_MODELS, - value: () => 'gemini-3.1-flash-image-preview', - condition: { field: 'provider', value: 'gemini' }, - dependsOn: ['provider'], - }, - { - id: 'model', - title: 'Model', - type: 'dropdown', - options: FALAI_IMAGE_MODELS, - value: () => 'nano-banana-2', - condition: { field: 'provider', value: 'falai' }, - dependsOn: ['provider'], - }, + ...(['openai', 'gemini', 'falai'] as const).map( + (provider): SubBlockConfig => ({ + id: 'model', + title: 'Model', + type: 'dropdown', + options: imageModels + .filter((model) => model.provider === provider) + .map((model) => ({ + label: model.label, + id: model.id, + })), + value: () => imageModelDefaults[provider], + condition: { field: 'provider', value: provider }, + dependsOn: ['provider'], + required: true, + }) + ), { id: 'prompt', title: 'Prompt', @@ -385,440 +333,73 @@ export const ImageGeneratorV2Block: BlockConfig = { required: true, placeholder: 'Describe the image you want to generate...', }, - { - id: 'size', - title: 'Size', - type: 'dropdown', - options: [ - { label: 'Auto', id: 'auto' }, - { label: 'Square (1024x1024)', id: '1024x1024' }, - { label: 'Landscape (1536x1024)', id: '1536x1024' }, - { label: 'Portrait (1024x1536)', id: '1024x1536' }, - ], - value: () => 'auto', - condition: { field: 'provider', value: 'openai' }, - dependsOn: ['provider', 'model'], - }, - { - id: 'size', - title: 'Size', - type: 'dropdown', - options: [ - { label: 'Square (1024x1024)', id: '1024x1024' }, - { label: 'Landscape (1536x1024)', id: '1536x1024' }, - { label: 'Portrait (1024x1536)', id: '1024x1536' }, - ], - value: () => '1024x1024', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'gpt-image-1.5' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'size', - title: 'Size', - type: 'dropdown', - options: [ - { label: 'Auto 2K', id: 'auto_2K' }, - { label: 'Auto 4K', id: 'auto_4K' }, - { label: 'Square HD', id: 'square_hd' }, - { label: 'Square', id: 'square' }, - { label: 'Portrait 4:3', id: 'portrait_4_3' }, - { label: 'Portrait 16:9', id: 'portrait_16_9' }, - { label: 'Landscape 4:3', id: 'landscape_4_3' }, - { label: 'Landscape 16:9', id: 'landscape_16_9' }, - ], - value: () => 'auto_2K', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'seedream-v4.5' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'size', - title: 'Size', - type: 'dropdown', - options: [ - { label: 'Landscape 4:3', id: 'landscape_4_3' }, - { label: 'Landscape 16:9', id: 'landscape_16_9' }, - { label: 'Square HD', id: 'square_hd' }, - { label: 'Square', id: 'square' }, - { label: 'Portrait 4:3', id: 'portrait_4_3' }, - { label: 'Portrait 16:9', id: 'portrait_16_9' }, - ], - value: () => 'landscape_4_3', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'flux-2-pro' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: [...BASE_ASPECT_RATIO_OPTIONS, ...EXTREME_ASPECT_RATIO_OPTIONS], - value: () => '1:1', - condition: { - field: 'provider', - value: 'gemini', - and: { field: 'model', value: 'gemini-3.1-flash-image-preview' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: BASE_ASPECT_RATIO_OPTIONS, - value: () => '1:1', - condition: { - field: 'provider', - value: 'gemini', - and: { + ...imageOptionFields.map( + (key): SubBlockConfig => ({ + id: key, + title: { + size: 'Size', + aspectRatio: 'Aspect Ratio', + resolution: 'Resolution', + quality: 'Quality', + background: 'Background', + outputFormat: 'Output Format', + moderation: 'Moderation', + safetyTolerance: 'Safety Tolerance', + thinkingLevel: 'Thinking Level', + }[key], + type: 'dropdown', + value: () => 'default', + dependsOn: ['provider', 'model'], + condition: (values) => ({ field: 'model', - value: ['gemini-3-pro-image-preview', 'gemini-2.5-flash-image'], - }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: [ - { label: 'Auto', id: 'auto' }, - ...BASE_ASPECT_RATIO_OPTIONS, - ...EXTREME_ASPECT_RATIO_OPTIONS, - ], - value: () => 'auto', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana-2' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: [{ label: 'Auto', id: 'auto' }, ...BASE_ASPECT_RATIO_OPTIONS], - value: () => '1:1', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana-pro' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: BASE_ASPECT_RATIO_OPTIONS, - value: () => '1:1', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'aspectRatio', - title: 'Aspect Ratio', - type: 'dropdown', - options: [ - { label: '1:1', id: '1:1' }, - { label: '16:9', id: '16:9' }, - { label: '9:16', id: '9:16' }, - { label: '4:3', id: '4:3' }, - { label: '3:2', id: '3:2' }, - { label: '2:3', id: '2:3' }, - { label: '3:4', id: '3:4' }, - { label: '2:1', id: '2:1' }, - { label: '1:2', id: '1:2' }, - { label: '20:9', id: '20:9' }, - { label: '9:20', id: '9:20' }, - { label: '19.5:9', id: '19.5:9' }, - { label: '9:19.5', id: '9:19.5' }, - ], - value: () => '1:1', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'grok-imagine-image' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'resolution', - title: 'Resolution', - type: 'dropdown', - options: [ - { label: '512', id: '512' }, - { label: '1K', id: '1K' }, - { label: '2K', id: '2K' }, - { label: '4K', id: '4K' }, - ], - value: () => '1K', - condition: { - field: 'provider', - value: 'gemini', - and: { field: 'model', value: 'gemini-3.1-flash-image-preview' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'resolution', - title: 'Resolution', - type: 'dropdown', - options: [ - { label: '1K', id: '1K' }, - { label: '2K', id: '2K' }, - { label: '4K', id: '4K' }, - ], - value: () => '1K', - condition: { - field: 'provider', - value: 'gemini', - and: { field: 'model', value: 'gemini-3-pro-image-preview' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'resolution', - title: 'Resolution', - type: 'dropdown', - options: [ - { label: '0.5K', id: '0.5K' }, - { label: '1K', id: '1K' }, - { label: '2K', id: '2K' }, - { label: '4K', id: '4K' }, - ], - value: () => '1K', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana-2' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'resolution', - title: 'Resolution', - type: 'dropdown', - options: [ - { label: '1K', id: '1K' }, - { label: '2K', id: '2K' }, - { label: '4K', id: '4K' }, - ], - value: () => '1K', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana-pro' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'resolution', - title: 'Resolution', - type: 'dropdown', - options: [ - { label: '1k', id: '1k' }, - { label: '2k', id: '2k' }, - ], - value: () => '1k', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'grok-imagine-image' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'quality', - title: 'Quality', - type: 'dropdown', - options: [ - { label: 'Auto', id: 'auto' }, - { label: 'Low', id: 'low' }, - { label: 'Medium', id: 'medium' }, - { label: 'High', id: 'high' }, - ], - value: () => 'auto', - condition: { field: 'provider', value: 'openai' }, - dependsOn: ['provider', 'model'], - }, - { - id: 'quality', - title: 'Quality', - type: 'dropdown', - options: [ - { label: 'High', id: 'high' }, - { label: 'Medium', id: 'medium' }, - { label: 'Low', id: 'low' }, - ], - value: () => 'high', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'gpt-image-1.5' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'background', - title: 'Background', - type: 'dropdown', - options: [ - { label: 'Auto', id: 'auto' }, - { label: 'Transparent', id: 'transparent' }, - { label: 'Opaque', id: 'opaque' }, - ], - value: () => 'auto', - condition: { - field: 'provider', - value: ['openai', 'falai'], - and: { field: 'model', value: ['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini'] }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'outputFormat', - title: 'Output Format', - type: 'dropdown', - options: OUTPUT_FORMAT_OPTIONS, - value: () => 'png', - condition: { - field: 'provider', - value: ['openai', 'falai'], - and: { + value: getImageModel(values?.provider, values?.model)?.options?.[key] + ? [String(values?.model)] + : [], + }), + options: (params) => [ + { id: 'default', label: 'Model default' }, + ...( + getImageModel(params?.values.provider, params?.values.model)?.options?.[key]?.values ?? + [] + ).map((value) => ({ + id: String(value), + label: String(value), + })), + ], + }) + ), + ...(['enableSafetyChecker', 'enableWebSearch'] as const).map( + (key): SubBlockConfig => ({ + id: key, + title: key === 'enableSafetyChecker' ? 'Safety Checker' : 'Web Search', + type: 'dropdown', + value: () => 'default', + mode: 'advanced', + dependsOn: ['provider', 'model'], + condition: (values) => ({ field: 'model', - value: [ - 'gpt-image-1.5', - 'gpt-image-1', - 'gpt-image-1-mini', - 'nano-banana-2', - 'nano-banana-pro', - 'nano-banana', - 'grok-imagine-image', - ], - }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'outputFormat', - title: 'Output Format', - type: 'dropdown', - options: [ - { label: 'JPEG', id: 'jpeg' }, - { label: 'PNG', id: 'png' }, - ], - value: () => 'jpeg', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'flux-2-pro' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'moderation', - title: 'Moderation', - type: 'dropdown', - options: [ - { label: 'Auto', id: 'auto' }, - { label: 'Low', id: 'low' }, - ], - value: () => 'auto', - condition: { field: 'provider', value: 'openai' }, - dependsOn: ['provider', 'model'], - }, - { - id: 'safetyTolerance', - title: 'Safety Tolerance', - type: 'dropdown', - options: [ - { label: '1', id: '1' }, - { label: '2', id: '2' }, - { label: '3', id: '3' }, - { label: '4', id: '4' }, - { label: '5', id: '5' }, - { label: '6', id: '6' }, - ], - value: () => '4', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: ['nano-banana-2', 'nano-banana-pro', 'nano-banana'] }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'safetyTolerance', - title: 'Safety Tolerance', - type: 'dropdown', - options: [ - { label: '1', id: '1' }, - { label: '2', id: '2' }, - { label: '3', id: '3' }, - { label: '4', id: '4' }, - { label: '5', id: '5' }, - ], - value: () => '2', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'flux-2-pro' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'thinkingLevel', - title: 'Thinking Level', - type: 'dropdown', - options: [ - { label: 'Minimal', id: 'minimal' }, - { label: 'High', id: 'high' }, - ], - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: 'nano-banana-2' }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'enableWebSearch', - title: 'Web Search', - type: 'switch', - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: ['nano-banana-2', 'nano-banana-pro'] }, - }, - dependsOn: ['provider', 'model'], - }, - { - id: 'enableSafetyChecker', - title: 'Safety Checker', - type: 'switch', - defaultValue: true, - condition: { - field: 'provider', - value: 'falai', - and: { field: 'model', value: ['seedream-v4.5', 'flux-2-pro'] }, - }, + value: getImageModel(values?.provider, values?.model)?.booleans?.[key] + ? [String(values?.model)] + : [], + }), + options: [ + { id: 'default', label: 'Model default' }, + { id: 'true', label: 'On' }, + { id: 'false', label: 'Off' }, + ], + }) + ), + { + id: 'seed', + title: 'Seed', + type: 'short-input', + mode: 'advanced', + placeholder: 'Random by default', dependsOn: ['provider', 'model'], + condition: (values) => ({ + field: 'model', + value: getImageModel(values?.provider, values?.model)?.seed ? [String(values?.model)] : [], + }), }, { id: 'apiKey', @@ -854,33 +435,27 @@ export const ImageGeneratorV2Block: BlockConfig = { if (!params.prompt) { throw new Error('Prompt is required') } - const defaultModel = - provider === 'gemini' - ? 'gemini-3.1-flash-image-preview' - : provider === 'falai' - ? 'nano-banana-2' - : 'gpt-image-1.5' - + const modelId = + params.model || imageModelDefaults[provider as keyof typeof imageModelDefaults] + const model = getImageModel(provider, modelId) + const settings: Record = {} + for (const key of imageOptionFields) { + if (model?.options?.[key] && params[key] && params[key] !== 'default') + settings[key] = params[key] + } + for (const key of ['enableSafetyChecker', 'enableWebSearch'] as const) { + if (model?.booleans?.[key] && params[key] !== undefined && params[key] !== 'default') { + settings[key] = parseOptionalBooleanInput(params[key]) + } + } + if (model?.seed && params.seed !== undefined && params.seed !== '') + settings.seed = params.seed return { provider, - model: params.model || defaultModel, + model: modelId, prompt: params.prompt, apiKey: params.apiKey, - ...(params.size && { size: params.size }), - ...(params.aspectRatio && { aspectRatio: params.aspectRatio }), - ...(params.resolution && { resolution: params.resolution }), - ...(params.quality && { quality: params.quality }), - ...(params.background && { background: params.background }), - ...(params.outputFormat && { outputFormat: params.outputFormat }), - ...(params.moderation && { moderation: params.moderation }), - ...(params.safetyTolerance && { safetyTolerance: params.safetyTolerance }), - ...(params.thinkingLevel && { thinkingLevel: params.thinkingLevel }), - ...(params.enableWebSearch !== undefined && { - enableWebSearch: parseOptionalBooleanInput(params.enableWebSearch), - }), - ...(params.enableSafetyChecker !== undefined && { - enableSafetyChecker: parseOptionalBooleanInput(params.enableSafetyChecker), - }), + ...settings, } }, }, @@ -900,6 +475,7 @@ export const ImageGeneratorV2Block: BlockConfig = { thinkingLevel: { type: 'string', description: 'Fal.ai thinking level' }, enableWebSearch: { type: 'boolean', description: 'Enable Fal.ai web search grounding' }, enableSafetyChecker: { type: 'boolean', description: 'Enable Fal.ai safety checker' }, + seed: { type: 'number', description: 'Random seed when supported' }, apiKey: { type: 'string', description: 'Provider API key' }, }, outputs: { diff --git a/apps/sim/lib/internal/image/operations.test.ts b/apps/sim/lib/internal/image/operations.test.ts index 1458423a511..e9b59945001 100644 --- a/apps/sim/lib/internal/image/operations.test.ts +++ b/apps/sim/lib/internal/image/operations.test.ts @@ -49,6 +49,8 @@ const falInput = { describe('image operations', () => { beforeEach(() => { + mocks.fetch.mockReset() + mockSecureFetchWithPinnedIP.mockReset() vi.stubGlobal('fetch', mocks.fetch) mockInterruptibleSleep.mockResolvedValue(undefined) mockUploadCopilotFile.mockResolvedValue({ url: 'https://sim.test/generated.png' }) @@ -116,4 +118,98 @@ describe('image operations', () => { expect(mockSecureFetchWithPinnedIP).not.toHaveBeenCalled() expect(mockUploadCopilotFile).not.toHaveBeenCalled() }) + + it('rejects foreign fal queue hosts before sending credentials', async () => { + mocks.fetch.mockResolvedValueOnce( + Response.json({ + request_id: 'foreign-job', + status_url: 'https://untrusted.example/status', + }) + ) + mockSecureFetchWithPinnedIP.mockResolvedValueOnce(Response.json({ status: 'FAILED' })) + + const response = await executeImageGeneration(falInput, { + userId: 'user-1', + requestId: 'foreign-queue', + }) + + expect(response.status).toBe(500) + expect(await response.json()).toMatchObject({ error: 'Invalid Fal.ai queue URL' }) + expect(mockSecureFetchWithPinnedIP).not.toHaveBeenCalled() + }) + + it('retrieves nested fal jobs from the documented application request path', async () => { + mocks.fetch.mockResolvedValueOnce(Response.json({ request_id: 'nested-job' })) + mockSecureFetchWithPinnedIP.mockImplementation(async (url: string) => { + if (url === 'https://queue.fal.run/fal-ai/bytedance/requests/nested-job/status') { + return Response.json({ status: 'COMPLETED' }) + } + if (url === 'https://queue.fal.run/fal-ai/bytedance/requests/nested-job') { + return Response.json({ images: [{ url: 'data:image/png;base64,cG5n' }] }) + } + return new Response('Not found', { status: 404 }) + }) + + const response = await executeImageGeneration( + { ...falInput, model: 'seedream-v4.5' }, + { + userId: 'user-1', + requestId: 'nested-queue', + } + ) + + expect(response.status).toBe(200) + expect((await response.json()).imageUrl).toBe('https://sim.test/generated.png') + }) + + it.each(['openai', 'gemini'])( + 'does not purchase a fallback for an unknown %s model', + async (provider) => { + mocks.fetch.mockResolvedValueOnce(new Response('Unexpected generation', { status: 502 })) + const response = await executeImageGeneration( + { ...falInput, provider, model: 'unknown-model' }, + { + userId: 'user-1', + requestId: 'unknown-model', + } + ) + + expect(response.status).toBe(400) + expect(mocks.fetch).not.toHaveBeenCalled() + } + ) + + it('retains the completed fal receipt when delivery is interrupted', async () => { + const controller = new AbortController() + mocks.fetch.mockResolvedValueOnce(Response.json({ request_id: 'paid-job' })) + mocks.getFalAICostMetadata.mockImplementation(async ({ signal }: { signal?: AbortSignal }) => { + signal?.throwIfAborted() + return { + requestId: 'paid-job', + endpointId: 'fal-ai/nano-banana-2', + costDollars: 0.1, + source: 'billing_events', + } + }) + mockSecureFetchWithPinnedIP.mockResolvedValueOnce(Response.json({ status: 'COMPLETED' })) + mockSecureFetchWithPinnedIP.mockImplementationOnce(async () => { + controller.abort() + return Response.json({ status: 'COMPLETED' }) + }) + + await expect( + executeImageGeneration( + { ...falInput, useHostedCostTracking: true }, + { + userId: 'user-1', + requestId: 'completed-job', + signal: controller.signal, + } + ) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(mocks.getFalAICostMetadata).toHaveBeenCalledWith( + expect.objectContaining({ requestId: 'paid-job' }) + ) + expect(mocks.getFalAICostMetadata.mock.calls[0][0].signal).toBeUndefined() + }) }) diff --git a/apps/sim/lib/internal/image/operations.ts b/apps/sim/lib/internal/image/operations.ts index c3c7ba98f40..82f61d11c66 100644 --- a/apps/sim/lib/internal/image/operations.ts +++ b/apps/sim/lib/internal/image/operations.ts @@ -17,7 +17,9 @@ import { readResponseToBufferWithLimit, } from '@/lib/core/utils/stream-limits' import { MAX_REMOTE_IMAGE_BYTES } from '@/lib/internal/image/fetch' +import { buildImageGenerationRequest } from '@/lib/internal/image/request' import type { ImageGenerationInput, ImageProvider } from '@/lib/internal/image/schema' +import { recordServiceMeteringFailure } from '@/lib/mothership/billing/service-observer' import { type FalAICostMetadata, getFalAICostMetadata } from '@/lib/tools/falai-pricing' import { uploadCopilotFile } from '@/lib/uploads/contexts/copilot' import { uploadExecutionFile } from '@/lib/uploads/contexts/execution' @@ -75,41 +77,42 @@ export async function executeImageGeneration( context: ImageOperationContext ): Promise { const { requestId } = context + let completedFalCost: FalAICostMetadata | undefined logger.info(`[${requestId}] Image generation request started`) try { context.signal?.throwIfAborted() const provider = body.provider as ImageProvider - const { apiKey, model, prompt } = body + const { apiKey, model } = body - if (prompt.length < 3 || prompt.length > 4000) { - return Response.json( - { error: 'Prompt must be between 3 and 4000 characters' }, - { status: 400 } - ) + let prepared: ReturnType + try { + prepared = buildImageGenerationRequest(body) + } catch (error) { + return Response.json({ error: getErrorMessage(error) }, { status: 400 }) } logger.info(`[${requestId}] Generating image with ${provider}, model: ${model || 'default'}`) let imageResult: GeneratedImageResult - try { - if (provider === 'openai') { - imageResult = await generateWithOpenAI(apiKey, body, requestId, logger, context.signal) - } else if (provider === 'gemini') { - imageResult = await generateWithGemini(apiKey, body, requestId, logger, context.signal) - } else if (provider === 'falai') { - imageResult = await generateWithFalAI(apiKey, body, requestId, logger, context.signal) - } else { - return Response.json({ error: `Unknown provider: ${provider}` }, { status: 400 }) - } - } catch (error) { - context.signal?.throwIfAborted() - logger.error(`[${requestId}] Image generation failed:`, error) - const errorMessage = getErrorMessage(error, 'Image generation failed') - return Response.json( - { error: errorMessage }, - { status: isPayloadSizeLimitError(error) ? 413 : 500 } + if (provider === 'openai') { + imageResult = await generateWithOpenAI(apiKey, prepared, requestId, logger, context.signal) + } else if (provider === 'gemini') { + imageResult = await generateWithGemini(apiKey, prepared, requestId, logger, context.signal) + } else if (provider === 'falai') { + imageResult = await generateWithFalAI( + apiKey, + body, + prepared, + requestId, + logger, + (cost) => { + completedFalCost = cost + }, + context.signal ) + } else { + return Response.json({ error: `Unknown provider: ${provider}` }, { status: 400 }) } const storedImage = await storeGeneratedImage(imageResult, context) @@ -122,6 +125,21 @@ export async function executeImageGeneration( return Response.json(storedImage) } catch (error) { + if (completedFalCost) { + logger.warn('Hosted fal image completed but delivery failed', { + requestId, + falaiBilling: completedFalCost, + }) + const { requestId: jobId, endpointId, costDollars } = completedFalCost + await recordServiceMeteringFailure( + `Completed fal image ${jobId} (${endpointId}): USD ${costDollars}; delivery failed` + ).catch((meteringError) => { + logger.error('Failed to record completed fal image for reconciliation', { + requestId, + error: getErrorMessage(meteringError), + }) + }) + } context.signal?.throwIfAborted() logger.error(`[${requestId}] Image generation operation error:`, error) const errorMessage = getUserFacingErrorMessage(error, 'Unknown error') @@ -132,185 +150,6 @@ export async function executeImageGeneration( } } -const OPENAI_IMAGE_MODELS = [ - 'gpt-image-2', - 'gpt-image-1.5', - 'gpt-image-1', - 'gpt-image-1-mini', -] as const -const OPENAI_IMAGE_SIZES = ['auto', '1024x1024', '1536x1024', '1024x1536'] as const -const OPENAI_IMAGE_2_SIZES = [...OPENAI_IMAGE_SIZES, '2560x1440', '3840x2160'] as const -const OPENAI_IMAGE_QUALITIES = ['auto', 'low', 'medium', 'high'] as const -const OPENAI_IMAGE_BACKGROUNDS = ['auto', 'transparent', 'opaque'] as const -const IMAGE_OUTPUT_FORMATS = ['png', 'jpeg', 'webp'] as const -const OPENAI_MODERATION_LEVELS = ['auto', 'low'] as const - -const GEMINI_IMAGE_MODELS = [ - 'gemini-3.1-flash-image-preview', - 'gemini-3-pro-image-preview', - 'gemini-2.5-flash-image', -] as const -const GEMINI_BASE_ASPECT_RATIOS = [ - '1:1', - '2:3', - '3:2', - '3:4', - '4:3', - '4:5', - '5:4', - '9:16', - '16:9', - '21:9', -] as const -const GEMINI_EXTREME_ASPECT_RATIOS = ['1:4', '1:8', '4:1', '8:1'] as const -const GEMINI_IMAGE_SIZES = ['512', '1K', '2K', '4K'] as const -const GEMINI_PRO_IMAGE_SIZES = ['1K', '2K', '4K'] as const - -interface FalAIImageModelConfig { - endpoint: string - defaultSize?: string - sizeOptions?: readonly string[] - defaultAspectRatio?: string - aspectRatios?: readonly string[] - defaultResolution?: string - resolutionOptions?: readonly string[] - defaultOutputFormat?: string - outputFormats?: readonly string[] - defaultQuality?: string - qualityOptions?: readonly string[] - defaultBackground?: string - backgroundOptions?: readonly string[] - defaultSafetyTolerance?: string - safetyToleranceOptions?: readonly string[] - maxNumImages?: number - supportsSeed?: boolean - supportsEnableSafetyChecker?: boolean - supportsEnableWebSearch?: boolean - supportsThinkingLevel?: boolean -} - -const FALAI_NANO_BANANA_ASPECT_RATIOS = [ - 'auto', - '21:9', - '16:9', - '3:2', - '4:3', - '5:4', - '1:1', - '4:5', - '3:4', - '2:3', - '9:16', -] as const -const FALAI_EXTREME_ASPECT_RATIOS = ['4:1', '1:4', '8:1', '1:8'] as const -const FALAI_STANDARD_IMAGE_SIZES = [ - 'square_hd', - 'square', - 'portrait_4_3', - 'portrait_16_9', - 'landscape_4_3', - 'landscape_16_9', -] as const -const FALAI_SEEDREAM_IMAGE_SIZES = [...FALAI_STANDARD_IMAGE_SIZES, 'auto_2K', 'auto_4K'] as const - -const FALAI_IMAGE_MODEL_CONFIGS: Record = { - 'nano-banana-2': { - endpoint: 'fal-ai/nano-banana-2', - defaultAspectRatio: 'auto', - aspectRatios: [...FALAI_NANO_BANANA_ASPECT_RATIOS, ...FALAI_EXTREME_ASPECT_RATIOS], - defaultResolution: '1K', - resolutionOptions: ['0.5K', '1K', '2K', '4K'], - defaultOutputFormat: 'png', - outputFormats: IMAGE_OUTPUT_FORMATS, - defaultSafetyTolerance: '4', - safetyToleranceOptions: ['1', '2', '3', '4', '5', '6'], - maxNumImages: 4, - supportsSeed: true, - supportsEnableWebSearch: true, - supportsThinkingLevel: true, - }, - 'nano-banana-pro': { - endpoint: 'fal-ai/nano-banana-pro', - defaultAspectRatio: '1:1', - aspectRatios: FALAI_NANO_BANANA_ASPECT_RATIOS, - defaultResolution: '1K', - resolutionOptions: ['1K', '2K', '4K'], - defaultOutputFormat: 'png', - outputFormats: IMAGE_OUTPUT_FORMATS, - defaultSafetyTolerance: '4', - safetyToleranceOptions: ['1', '2', '3', '4', '5', '6'], - maxNumImages: 4, - supportsSeed: true, - supportsEnableWebSearch: true, - }, - 'nano-banana': { - endpoint: 'fal-ai/nano-banana', - defaultAspectRatio: '1:1', - aspectRatios: FALAI_NANO_BANANA_ASPECT_RATIOS.filter((ratio) => ratio !== 'auto'), - defaultOutputFormat: 'png', - outputFormats: IMAGE_OUTPUT_FORMATS, - defaultSafetyTolerance: '4', - safetyToleranceOptions: ['1', '2', '3', '4', '5', '6'], - maxNumImages: 4, - supportsSeed: true, - }, - 'gpt-image-1.5': { - endpoint: 'fal-ai/gpt-image-1.5', - defaultSize: '1024x1024', - sizeOptions: ['1024x1024', '1536x1024', '1024x1536'], - defaultQuality: 'high', - qualityOptions: ['low', 'medium', 'high'], - defaultBackground: 'auto', - backgroundOptions: OPENAI_IMAGE_BACKGROUNDS, - defaultOutputFormat: 'png', - outputFormats: IMAGE_OUTPUT_FORMATS, - maxNumImages: 4, - }, - 'seedream-v4.5': { - endpoint: 'fal-ai/bytedance/seedream/v4.5/text-to-image', - defaultSize: 'auto_2K', - sizeOptions: FALAI_SEEDREAM_IMAGE_SIZES, - maxNumImages: 6, - supportsSeed: true, - supportsEnableSafetyChecker: true, - }, - 'flux-2-pro': { - endpoint: 'fal-ai/flux-2-pro', - defaultSize: 'landscape_4_3', - sizeOptions: FALAI_STANDARD_IMAGE_SIZES, - defaultOutputFormat: 'jpeg', - outputFormats: ['jpeg', 'png'], - defaultSafetyTolerance: '2', - safetyToleranceOptions: ['1', '2', '3', '4', '5'], - supportsSeed: true, - supportsEnableSafetyChecker: true, - }, - 'grok-imagine-image': { - endpoint: 'xai/grok-imagine-image', - defaultAspectRatio: '1:1', - aspectRatios: [ - '2:1', - '20:9', - '19.5:9', - '16:9', - '4:3', - '3:2', - '1:1', - '2:3', - '3:4', - '9:16', - '9:19.5', - '9:20', - '1:2', - ], - defaultResolution: '1k', - resolutionOptions: ['1k', '2k'], - defaultOutputFormat: 'jpeg', - outputFormats: IMAGE_OUTPUT_FORMATS, - maxNumImages: 4, - }, -} - function getStringProperty( record: Record | undefined, key: string @@ -331,24 +170,6 @@ function firstRecord(value: unknown): Record | undefined { return Array.isArray(value) ? value.find(isRecordLike) : undefined } -function pickAllowed( - value: string | undefined, - allowed: readonly string[], - fallback: string -): string { - return value && allowed.includes(value) ? value : fallback -} - -function clampInteger( - value: number | undefined, - min: number, - max: number, - fallback: number -): number { - if (typeof value !== 'number' || !Number.isInteger(value)) return fallback - return Math.min(Math.max(value, min), max) -} - function getContentTypeForFormat(format: string | undefined): string { if (format === 'jpeg') return 'image/jpeg' if (format === 'webp') return 'image/webp' @@ -408,38 +229,16 @@ async function bufferFromImageUrl( async function generateWithOpenAI( apiKey: string, - body: ImageGenerationInput, + prepared: ReturnType, requestId: string, logger: ReturnType, signal?: AbortSignal ): Promise { - const model = pickAllowed(body.model, OPENAI_IMAGE_MODELS, 'gpt-image-1.5') - const size = - model === 'gpt-image-2' - ? pickAllowed(body.size, OPENAI_IMAGE_2_SIZES, 'auto') - : pickAllowed(body.size, OPENAI_IMAGE_SIZES, 'auto') - const outputFormat = pickAllowed(body.outputFormat, IMAGE_OUTPUT_FORMATS, 'png') - const requestBody: Record = { - model, - prompt: body.prompt, - size, - n: 1, - } - - if (body.quality) { - requestBody.quality = pickAllowed(body.quality, OPENAI_IMAGE_QUALITIES, 'auto') - } - if (body.background) { - requestBody.background = pickAllowed(body.background, OPENAI_IMAGE_BACKGROUNDS, 'auto') - } - if (body.outputFormat) { - requestBody.output_format = outputFormat - } - if (body.moderation) { - requestBody.moderation = pickAllowed(body.moderation, OPENAI_MODERATION_LEVELS, 'auto') - } - - const openaiResponse = await fetch('https://api.openai.com/v1/images/generations', { + const model = prepared.model.id + const requestBody = prepared.body + const outputFormat = + typeof requestBody.output_format === 'string' ? requestBody.output_format : 'png' + const openaiResponse = await fetch(prepared.endpoint, { method: 'POST', headers: { Authorization: `Bearer ${apiKey}`, @@ -499,53 +298,22 @@ async function generateWithOpenAI( async function generateWithGemini( apiKey: string, - body: ImageGenerationInput, + prepared: ReturnType, requestId: string, logger: ReturnType, signal?: AbortSignal ): Promise { - const model = pickAllowed(body.model, GEMINI_IMAGE_MODELS, 'gemini-3.1-flash-image-preview') - const aspectRatios = - model === 'gemini-3.1-flash-image-preview' - ? [...GEMINI_BASE_ASPECT_RATIOS, ...GEMINI_EXTREME_ASPECT_RATIOS] - : GEMINI_BASE_ASPECT_RATIOS - const imageConfig: Record = {} - - if (body.aspectRatio) { - imageConfig.aspectRatio = pickAllowed(body.aspectRatio, aspectRatios, '1:1') - } - - if (model === 'gemini-3.1-flash-image-preview' && body.resolution) { - imageConfig.imageSize = pickAllowed(body.resolution, GEMINI_IMAGE_SIZES, '1K') - } else if (model === 'gemini-3-pro-image-preview' && body.resolution) { - imageConfig.imageSize = pickAllowed(body.resolution, GEMINI_PRO_IMAGE_SIZES, '1K') - } - - const requestBody: Record = { - contents: [ - { - parts: [{ text: body.prompt }], - }, - ], - } - - requestBody.generationConfig = { - responseModalities: ['TEXT', 'IMAGE'], - ...(Object.keys(imageConfig).length > 0 && { imageConfig }), - } - - const geminiResponse = await fetch( - `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`, - { - method: 'POST', - headers: { - 'x-goog-api-key': apiKey, - 'Content-Type': 'application/json', - }, - body: JSON.stringify(requestBody), - signal, - } - ) + const model = prepared.model.id + const requestBody = prepared.body + const geminiResponse = await fetch(prepared.endpoint, { + method: 'POST', + headers: { + 'x-goog-api-key': apiKey, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody), + signal, + }) if (!geminiResponse.ok) { const error = await readResponseTextWithLimit(geminiResponse, { @@ -609,7 +377,13 @@ async function generateWithGemini( } function buildFalAIQueueUrl(endpoint: string, requestId: string, path: 'status' | 'response') { - return `https://queue.fal.run/${endpoint}/requests/${requestId}/${path}` + const app = endpoint.split('/', 2).join('/') + return `https://queue.fal.run/${app}/requests/${encodeURIComponent(requestId)}${path === 'status' ? '/status' : ''}` +} + +function falQueueUrl(url: string): string { + if (new URL(url).origin !== 'https://queue.fal.run') throw new Error('Invalid Fal.ai queue URL') + return url } function getFalAIErrorMessage(error: unknown): string { @@ -627,87 +401,18 @@ function getFalAIErrorMessage(error: unknown): string { async function generateWithFalAI( apiKey: string, body: ImageGenerationInput, + prepared: ReturnType, requestId: string, logger: ReturnType, + onFalCost: (cost: FalAICostMetadata) => void, signal?: AbortSignal ): Promise { - const model = body.model || 'nano-banana-2' - const modelConfig = FALAI_IMAGE_MODEL_CONFIGS[model] - if (!modelConfig) { - throw new Error(`Unknown Fal.ai image model: ${model}`) - } - - const requestBody: Record = { - prompt: body.prompt, - sync_mode: false, - } - - if (modelConfig.maxNumImages) { - requestBody.num_images = clampInteger(body.numImages, 1, modelConfig.maxNumImages, 1) - } - if (modelConfig.supportsSeed && body.seed !== undefined) { - requestBody.seed = body.seed - } - if (modelConfig.sizeOptions && modelConfig.defaultSize) { - requestBody.image_size = pickAllowed( - body.size, - modelConfig.sizeOptions, - modelConfig.defaultSize - ) - } - if (modelConfig.aspectRatios && modelConfig.defaultAspectRatio) { - requestBody.aspect_ratio = pickAllowed( - body.aspectRatio, - modelConfig.aspectRatios, - modelConfig.defaultAspectRatio - ) - } - if (modelConfig.resolutionOptions && modelConfig.defaultResolution) { - requestBody.resolution = pickAllowed( - body.resolution, - modelConfig.resolutionOptions, - modelConfig.defaultResolution - ) - } - if (modelConfig.outputFormats && modelConfig.defaultOutputFormat) { - requestBody.output_format = pickAllowed( - body.outputFormat, - modelConfig.outputFormats, - modelConfig.defaultOutputFormat - ) - } - if (modelConfig.qualityOptions && modelConfig.defaultQuality) { - requestBody.quality = pickAllowed( - body.quality, - modelConfig.qualityOptions, - modelConfig.defaultQuality - ) - } - if (modelConfig.backgroundOptions && modelConfig.defaultBackground) { - requestBody.background = pickAllowed( - body.background, - modelConfig.backgroundOptions, - modelConfig.defaultBackground - ) - } - if (modelConfig.safetyToleranceOptions && modelConfig.defaultSafetyTolerance) { - requestBody.safety_tolerance = pickAllowed( - body.safetyTolerance, - modelConfig.safetyToleranceOptions, - modelConfig.defaultSafetyTolerance - ) - } - if (modelConfig.supportsEnableSafetyChecker && body.enableSafetyChecker !== undefined) { - requestBody.enable_safety_checker = body.enableSafetyChecker - } - if (modelConfig.supportsEnableWebSearch && body.enableWebSearch !== undefined) { - requestBody.enable_web_search = body.enableWebSearch - } - if (modelConfig.supportsThinkingLevel && body.thinkingLevel) { - requestBody.thinking_level = pickAllowed(body.thinkingLevel, ['minimal', 'high'], 'minimal') - } - - const createResponse = await fetch(`https://queue.fal.run/${modelConfig.endpoint}`, { + const model = prepared.model.id + const endpoint = prepared.model.endpoint + if (!endpoint) throw new Error('Missing Fal.ai image endpoint') + const requestBody = prepared.body + const createResponse = await fetch(prepared.endpoint, { + redirect: 'error', method: 'POST', headers: { Authorization: `Key ${apiKey}`, @@ -740,19 +445,17 @@ async function generateWithFalAI( throw new Error('Fal.ai queue response missing request_id') } - const statusUrl = + const statusUrl = falQueueUrl( getStringProperty(createData, 'status_url') || - buildFalAIQueueUrl(modelConfig.endpoint, falRequestId, 'status') - const responseUrl = + buildFalAIQueueUrl(endpoint, falRequestId, 'status') + ) + const responseUrl = falQueueUrl( getStringProperty(createData, 'response_url') || - buildFalAIQueueUrl(modelConfig.endpoint, falRequestId, 'response') + buildFalAIQueueUrl(endpoint, falRequestId, 'response') + ) logger.info(`[${requestId}] Fal.ai image request created: ${falRequestId}`) - // `status_url`/`response_url` are read out of the queue response, so they are - // content: guard and pin them so a spoofed response cannot point an - // authenticated poll at an internal address. The status URL is constant across - // the loop, so it is validated once and the pinned address reused. const statusValidation = await validateUrlWithDNS(statusUrl, 'statusUrl', 'contentFetch') if (!statusValidation.isValid) { throw new Error(statusValidation.error) @@ -768,6 +471,7 @@ async function generateWithFalAI( const statusResponse = await secureFetchWithPinnedIP(statusUrl, statusValidation.resolvedIP, { profile: 'contentFetch', + maxRedirects: 0, headers: { Authorization: `Key ${apiKey}`, }, @@ -800,13 +504,20 @@ async function generateWithFalAI( throw new Error(`Fal.ai generation failed: ${getFalAIErrorMessage(statusError)}`) } - const resultUrl = getStringProperty(statusData, 'response_url') || responseUrl + const falaiCost = body.useHostedCostTracking + ? await getFalAICostMetadata({ apiKey, endpointId: endpoint, requestId: falRequestId }) + : undefined + if (falaiCost) onFalCost(falaiCost) + signal?.throwIfAborted() + + const resultUrl = falQueueUrl(getStringProperty(statusData, 'response_url') || responseUrl) const resultValidation = await validateUrlWithDNS(resultUrl, 'resultUrl', 'contentFetch') if (!resultValidation.isValid) { throw new Error(resultValidation.error) } const resultResponse = await secureFetchWithPinnedIP(resultUrl, resultValidation.resolvedIP, { profile: 'contentFetch', + maxRedirects: 0, headers: { Authorization: `Key ${apiKey}`, }, @@ -832,7 +543,10 @@ async function generateWithFalAI( throw new Error('Invalid Fal.ai result response') } - const firstImage = firstRecord(resultData.images) + const firstImage = + prepared.model.output === 'image' && isRecordLike(resultData.image) + ? resultData.image + : firstRecord(resultData.images) const imageUrl = getStringProperty(firstImage, 'url') || getStringProperty(firstImage, 'data') || @@ -862,14 +576,7 @@ async function generateWithFalAI( revisedPrompt: getStringProperty(resultData, 'revised_prompt'), seed: getNumberProperty(resultData, 'seed'), jobId: falRequestId, - falaiCost: body.useHostedCostTracking - ? await getFalAICostMetadata({ - apiKey, - endpointId: modelConfig.endpoint, - requestId: falRequestId, - signal, - }) - : undefined, + falaiCost, } } diff --git a/apps/sim/lib/internal/image/request.ts b/apps/sim/lib/internal/image/request.ts new file mode 100644 index 00000000000..9846452997a --- /dev/null +++ b/apps/sim/lib/internal/image/request.ts @@ -0,0 +1,62 @@ +import type { ImageGenerationInput, ImageProvider } from '@/lib/internal/image/schema' +import { getImageModel, imageModelDefaults, imageOptionFields } from '@/lib/media/image-catalog' + +/** Builds only supported settings for the selected image model before a paid request is sent. */ +export function buildImageGenerationRequest(input: ImageGenerationInput) { + const model = getImageModel( + input.provider, + input.model || imageModelDefaults[input.provider as ImageProvider] + ) + if (!model) throw new Error(`Unknown or retired ${input.provider} image model: ${input.model}`) + if (input.numImages !== undefined && input.numImages !== 1) { + throw new Error('Image generation returns one image per tool execution; numImages must be 1') + } + const minLength = Math.max(3, model.minPromptLength ?? 3) + const maxLength = Math.min(4000, model.maxPromptLength ?? 4000) + if (input.prompt.length < minLength || input.prompt.length > maxLength) { + throw new Error( + `Prompt must be between ${minLength} and ${maxLength} characters for ${model.label}` + ) + } + + const settings: Record = { ...model.requestDefaults } + for (const key of imageOptionFields) { + const value = input[key] + if (value === undefined || value === '' || value === 'default') continue + const option = model.options?.[key] + if (!option) throw new Error(`${model.label} does not support ${key}`) + const nativeValue = option.values.find((item) => String(item) === value) + if (nativeValue === undefined) throw new Error(`Invalid ${key} for ${model.label}: ${value}`) + settings[option.field] = nativeValue + } + if (input.background === 'transparent' && input.outputFormat === 'jpeg') { + throw new Error('Transparent backgrounds require PNG or WebP output') + } + for (const key of ['enableSafetyChecker', 'enableWebSearch'] as const) { + if (input[key] === undefined) continue + const field = model.booleans?.[key] + if (!field) throw new Error(`${model.label} does not support ${key}`) + settings[field] = input[key] + } + if (input.seed !== undefined) { + if (!model.seed) throw new Error(`${model.label} does not support seed`) + settings.seed = input.seed + } + + let endpoint: string + let body: Record + if (model.provider === 'openai') { + endpoint = 'https://api.openai.com/v1/images/generations' + body = { model: model.id, prompt: input.prompt, ...settings } + } else if (model.provider === 'gemini') { + endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${model.id}:generateContent` + body = { + contents: [{ parts: [{ text: input.prompt }] }], + generationConfig: { responseModalities: ['TEXT', 'IMAGE'], imageConfig: settings }, + } + } else { + endpoint = `https://queue.fal.run/${model.endpoint}` + body = { prompt: input.prompt, ...settings } + } + return { model, endpoint, body } +} diff --git a/apps/sim/lib/media/fal-image-models.json b/apps/sim/lib/media/fal-image-models.json new file mode 100644 index 00000000000..6c7d1d1c6d4 --- /dev/null +++ b/apps/sim/lib/media/fal-image-models.json @@ -0,0 +1,4970 @@ +{ + "fal-ai/flux/schnell": { + "label": "FLUX.1 [schnell] (fal-ai/flux/schnell)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/nano-banana-pro": { + "label": "Nano Banana Pro", + "output": "images", + "legacyId": "nano-banana-pro", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["high"] + } + }, + "booleans": { + "enableWebSearch": "enable_web_search" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "fal-ai/nano-banana-2": { + "label": "Nano Banana 2", + "output": "images", + "legacyId": "nano-banana-2", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "resolution": { + "field": "resolution", + "values": ["0.5K", "1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["minimal", "high"] + } + }, + "booleans": { + "enableWebSearch": "enable_web_search" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "google/nano-banana-2.1": { + "label": "Nano Banana 2.1", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["minimal", "medium", "high"] + } + }, + "booleans": { + "enableWebSearch": "enable_web_search" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "openai/gpt-image-2": { + "label": "GPT Image 2 API", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "quality": { + "field": "quality", + "values": ["auto", "low", "medium", "high"] + }, + "background": { + "field": "background", + "values": ["auto", "transparent", "opaque"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 32000 + }, + "fal-ai/flux/dev": { + "label": "FLUX.1 [dev] (fal-ai/flux/dev)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "openai/gpt-image-2.5/flare/text-to-image": { + "label": "GPT Image 2.5 Flare", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "quality": { + "field": "quality", + "values": ["auto", "low", "medium", "high", "xhigh", "max"] + }, + "background": { + "field": "background", + "values": ["auto", "transparent", "opaque"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 32000 + }, + "openai/gpt-image-2.5/sunburst/text-to-image": { + "label": "GPT Image 2.5 Sunburst", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "quality": { + "field": "quality", + "values": ["auto", "low", "medium", "high", "xhigh", "max"] + }, + "background": { + "field": "background", + "values": ["auto", "transparent", "opaque"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 32000 + }, + "fal-ai/flux-2-pro": { + "label": "Flux 2 Pro", + "output": "images", + "legacyId": "flux-2-pro", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/nano-banana": { + "label": "Nano Banana", + "output": "images", + "legacyId": "nano-banana", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "3:2", "4:3", "5:4", "1:1", "4:5", "3:4", "2:3", "9:16"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "fal-ai/flux-pro/v1.1": { + "label": "FLUX1.1 [pro]", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-pro/v1.1-ultra": { + "label": "FLUX1.1 [pro] ultra", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "9:21"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "bytedance/seedream/v5/pro/text-to-image": { + "label": "Seedream 5.0 Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto_1K", + "auto_1.5K", + "auto_2K" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/z-image/turbo": { + "label": "Z Image Turbo", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/bytedance/seedream/v4.5/text-to-image": { + "label": "Bytedance Seedream V4.5", + "output": "images", + "legacyId": "seedream-v4.5", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto_2K", + "auto_4K" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false, + "max_images": 1 + } + }, + "fal-ai/flux-2/klein/9b": { + "label": "FLUX.2 [klein] 9B", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/bytedance/seedream/v4/text-to-image": { + "label": "Bytedance Seedream V4", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto", + "auto_2K", + "auto_4K" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false, + "max_images": 1 + } + }, + "fal-ai/flux-lora": { + "label": "FLUX.1 [dev] with LoRAs", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2": { + "label": "FLUX 2", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "blackforestlabs/flux-3/text-to-image": { + "label": "Flux 3 Image", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "2:1", + "16:9", + "3:2", + "7:5", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "5:7", + "2:3", + "9:16", + "1:2" + ] + }, + "resolution": { + "field": "resolution", + "values": ["768sq", "1k", "1.5k", "2k", "4k"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "requestDefaults": { + "sync_mode": false + } + }, + "meta/muse-image/text-to-image": { + "label": "Meta Muse Image", + "output": "images", + "options": { + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + }, + "xai/grok-imagine-image": { + "label": "Grok Imagine Image (xai/grok-imagine-image)", + "output": "images", + "legacyId": "grok-imagine-image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "2:1", + "20:9", + "19.5:9", + "16:9", + "4:3", + "3:2", + "1:1", + "2:3", + "3:4", + "9:16", + "9:19.5", + "9:20", + "1:2" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1k", "2k"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false, + "aspect_ratio": "1:1", + "resolution": "1k", + "output_format": "jpeg" + }, + "maxPromptLength": 8000 + }, + "fal-ai/flux-2/flash": { + "label": "FLUX 2 Flash", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/ideogram/v3": { + "label": "Ideogram", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "google/nano-banana-2-lite": { + "label": "Nano Banana 2 Lite", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["minimal", "high"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "fal-ai/recraft/v3/text-to-image": { + "label": "Recraft V3", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 1000 + }, + "fal-ai/flux-2/turbo": { + "label": "FLUX 2 Turbo", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "krea/v2/large/text-to-image": { + "label": "Krea 2 Large", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "4:3", "3:2", "16:9", "2.35:1", "4:5", "2:3", "9:16"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "xai/grok-imagine-image/v2.0/text-to-image": { + "label": "Grok Imagine Image 2.0", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "2:1", + "20:9", + "19.5:9", + "16:9", + "4:3", + "3:2", + "1:1", + "2:3", + "3:4", + "9:16", + "9:19.5", + "9:20", + "1:2", + "auto", + "21:9", + "5:2" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1k", "1.5k", "2k"] + }, + "quality": { + "field": "quality", + "values": ["low", "medium", "auto"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "maxPromptLength": 8000 + }, + "blackforestlabs/flux-3/klein/text-to-image": { + "label": "FLUX.3 Klein", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/gpt-image-1.5": { + "label": "GPT-Image 1.5", + "output": "images", + "legacyId": "gpt-image-1.5", + "options": { + "size": { + "field": "image_size", + "values": ["1024x1024", "1536x1024", "1024x1536"] + }, + "quality": { + "field": "quality", + "values": ["low", "medium", "high"] + }, + "background": { + "field": "background", + "values": ["auto", "transparent", "opaque"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 2, + "maxPromptLength": 32000 + }, + "fal-ai/fast-sdxl": { + "label": "Stable Diffusion XL", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/4b": { + "label": "FLUX.2 [klein] 4B", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "ideogram/v4.5": { + "label": "Ideogram V4.5", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "quality": { + "field": "quality", + "values": ["low", "medium", "high"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "krea/v3/text-to-image": { + "label": "Krea 3", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "fal-ai/flux-1/schnell": { + "label": "FLUX.1 [schnell] (fal-ai/flux-1/schnell)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/krea-2/turbo": { + "label": "Krea 2 Turbo", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "bytedance/seedream/v5/flash/text-to-image": { + "label": "Seedream (bytedance/seedream/v5/flash/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto_1K", + "auto_1.5K", + "auto_2K" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/qwen-image": { + "label": "Qwen Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "alibaba/qwen-image-3/text-to-image": { + "label": "Qwen Image 3", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "fal-ai/flux-2-max": { + "label": "Flux 2 Max", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/recraft/v4.1/text-to-image": { + "label": "Recraft V4.1", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/gemini-3-pro-image-preview": { + "label": "Gemini 3 Pro Image Preview", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["high"] + } + }, + "booleans": { + "enableWebSearch": "enable_web_search" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "ideogram/v4": { + "label": "Ideogram V4.0", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "bytedance/seedream/v5/lite/text-to-image": { + "label": "Seedream (bytedance/seedream/v5/lite/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto_2K", + "auto_3K", + "auto_4K" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false, + "max_images": 1 + } + }, + "fal-ai/gemini-25-flash-image": { + "label": "Gemini 2.5 Flash Image", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "3:2", "4:3", "5:4", "1:1", "4:5", "3:4", "2:3", "9:16"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "fal-ai/flux-pro/kontext/text-to-image": { + "label": "FLUX.1 Kontext [pro]", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "9:21"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft/v4/text-to-image": { + "label": "Recraft V4", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/krea-2/turbo/lora": { + "label": "Krea 2 Turbo LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "fal-ai/recraft/v4.1/text-to-vector": { + "label": "Recraft V4.1 Text to Vector", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/z-image/turbo/lora": { + "label": "Z Image Turbo Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "ideogram/vector/text-to-vector": { + "label": "Ideogram Vector", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "1:1", + "1:4", + "1:3", + "1:2", + "9:16", + "10:16", + "2:3", + "3:4", + "4:5", + "5:4", + "4:3", + "3:2", + "16:10", + "16:9", + "2:1", + "3:1", + "4:1" + ] + }, + "quality": { + "field": "quality", + "values": ["low", "medium", "high"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1 + }, + "minPromptLength": 1, + "maxPromptLength": 9500 + }, + "google/nano-banana-lite": { + "label": "Nano Banana Lite", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["minimal", "high"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "fal-ai/qwen-image-2512": { + "label": "Qwen Image 2512 (fal-ai/qwen-image-2512)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/lora": { + "label": "FLUX 2 Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "xai/grok-imagine-image/quality/text-to-image": { + "label": "Grok Imagine Image (xai/grok-imagine-image/quality/text-to-image)", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "2:1", + "20:9", + "19.5:9", + "16:9", + "4:3", + "3:2", + "1:1", + "2:3", + "3:4", + "9:16", + "9:19.5", + "9:20", + "1:2" + ] + }, + "resolution": { + "field": "resolution", + "values": ["1k", "2k"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "maxPromptLength": 8000 + }, + "fal-ai/patina/material": { + "label": "PATINA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1 + } + }, + "fal-ai/flux-2-flex": { + "label": "Flux 2 Flex", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/gemini-3.1-flash-image-preview": { + "label": "Gemini 3.1 Flash Image Preview", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "auto", + "21:9", + "16:9", + "3:2", + "4:3", + "5:4", + "1:1", + "4:5", + "3:4", + "2:3", + "9:16", + "4:1", + "1:4", + "8:1", + "1:8" + ] + }, + "resolution": { + "field": "resolution", + "values": ["0.5K", "1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + }, + "thinkingLevel": { + "field": "thinking_level", + "values": ["minimal", "high"] + } + }, + "booleans": { + "enableWebSearch": "enable_web_search" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 50000 + }, + "blackforestlabs/flux-3/klein/text-to-image/lora": { + "label": "FLUX 3 Klein LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "bria/fibo-2/generate": { + "label": "Fibo 2.0 Generate", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "1:1", + "1:2", + "1:3", + "1:4", + "1:5", + "2:1", + "2:3", + "3:1", + "3:2", + "3:4", + "4:1", + "4:3", + "4:5", + "5:1", + "5:4", + "9:16", + "9:21", + "10:16", + "16:9", + "16:10", + "21:9" + ] + } + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/moss-image": { + "label": "MOSS Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 16384 + }, + "recraft/v4.1/flash/text-to-image": { + "label": "Recraft V4.1 Flash", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/flux-general": { + "label": "FLUX.1 [dev] with Controlnets and Loras", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft/v4.1/pro/text-to-image": { + "label": "Recraft V4.1 Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/kling-image/o3/text-to-image": { + "label": "Kling Image (fal-ai/kling-image/o3/text-to-image)", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3", "21:9"] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "2K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "maxPromptLength": 2500 + }, + "krea/v2/medium/text-to-image": { + "label": "Krea 2 Medium", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "4:3", "3:2", "16:9", "2.35:1", "4:5", "2:3", "9:16"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "fal-ai/recraft/v4/pro/text-to-image": { + "label": "Recraft V4 Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/fast-lightning-sdxl": { + "label": "Stable Diffusion XL Lightning", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/kling-image/v3/text-to-image": { + "label": "Kling Image (fal-ai/kling-image/v3/text-to-image)", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3", "21:9"] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "2K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "maxPromptLength": 2500 + }, + "fal-ai/recraft/v4/text-to-vector": { + "label": "Recraft V4 (Vector)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/qwen-image-2512/lora": { + "label": "Qwen Image 2512 (fal-ai/qwen-image-2512/lora)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/gpt-image-1-mini": { + "label": "GPT Image 1 Mini", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": ["auto", "1024x1024", "1536x1024", "1024x1536"] + }, + "quality": { + "field": "quality", + "values": ["auto", "low", "medium", "high"] + }, + "background": { + "field": "background", + "values": ["auto", "transparent", "opaque"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 2 + }, + "blackforestlabs/flux-3/klein/base/text-to-image/lora": { + "label": "FLUX 3 Klein Base LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/minimax/image-01": { + "label": "MiniMax (Hailuo AI)", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "16:9", "4:3", "3:2", "2:3", "3:4", "9:16", "21:9"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1 + }, + "minPromptLength": 1, + "maxPromptLength": 1500 + }, + "fal-ai/flux/krea": { + "label": "FLUX.1 Krea [dev] (fal-ai/flux/krea)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/sana": { + "label": "Sana", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/hunyuan-image/v3/text-to-image": { + "label": "Hunyuan Image (fal-ai/hunyuan-image/v3/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "microsoft/mai-image-2.5": { + "label": "Mai Image 2.5", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["auto", "1:1", "4:3", "3:4", "16:9", "9:16", "3:2", "2:3"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 5000 + }, + "fal-ai/recraft/v4.1/pro/text-to-vector": { + "label": "Recraft V4.1 Text to Vector Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/flux-pro/kontext/max/text-to-image": { + "label": "FLUX.1 Kontext [max]", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "9:21"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + }, + "safetyTolerance": { + "field": "safety_tolerance", + "values": ["1", "2", "3", "4", "5", "6"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/z-image/turbo/tiling": { + "label": "Z-Image Turbo Seamless Tiling", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/wan/v2.7/text-to-image": { + "label": "Wan (fal-ai/wan/v2.7/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1 + }, + "minPromptLength": 1, + "maxPromptLength": 2000 + }, + "fal-ai/ideogram/v2": { + "label": "Ideogram V2", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "10:16", + "16:10", + "9:16", + "16:9", + "4:3", + "3:4", + "1:1", + "1:3", + "3:1", + "3:2", + "2:3" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/ideogram/v3/generate-transparent": { + "label": "Ideogram Transparent", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "1:3", + "3:1", + "1:2", + "2:1", + "9:16", + "16:9", + "10:16", + "16:10", + "2:3", + "3:2", + "3:4", + "4:3", + "4:5", + "5:4", + "1:1" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "ideogram/v4/fast": { + "label": "V4.0q [fast]", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/stable-diffusion-v35-large": { + "label": "Stable Diffusion 3.5 Large", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "ideogram/v4/instant": { + "label": "V4.0q [instant]", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/wan/v2.7/pro/text-to-image": { + "label": "Wan (fal-ai/wan/v2.7/pro/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1 + }, + "minPromptLength": 1, + "maxPromptLength": 2000 + }, + "fal-ai/z-image/base": { + "label": "Z Image Base", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "luma/agent/uni-1/v1/text-to-image": { + "label": "Luma Uni-1", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["3:1", "2:1", "16:9", "3:2", "1:1", "2:3", "9:16", "1:2", "1:3"] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker", + "enableWebSearch": "enable_web_search" + }, + "minPromptLength": 1, + "maxPromptLength": 6000 + }, + "fal-ai/hidream-i1-fast": { + "label": "Hidream I1 Fast", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "luma/agent/uni-1/v1/max": { + "label": "Luma Uni-1 Max", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["3:1", "2:1", "16:9", "3:2", "1:1", "2:3", "9:16", "1:2", "1:3"] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker", + "enableWebSearch": "enable_web_search" + }, + "minPromptLength": 1, + "maxPromptLength": 6000 + }, + "krea/v2/medium/turbo/text-to-image": { + "label": "Krea 2 Medium Turbo", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "4:3", "3:2", "16:9", "2.35:1", "4:5", "2:3", "9:16"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "minPromptLength": 1, + "maxPromptLength": 5000 + }, + "microsoft/mai-image-2.5-pro": { + "label": "MAI Image 2.5 Pro", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["auto", "1:1", "4:3", "3:4", "16:9", "9:16", "3:2", "2:3"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 3, + "maxPromptLength": 5000 + }, + "fal-ai/ernie-image/turbo": { + "label": "Ernie Image Turbo", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "square_uhd", + "portrait_3_2", + "landscape_3_2", + "portrait_hd", + "landscape_hd" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-1/dev": { + "label": "FLUX.1 [dev] (fal-ai/flux-1/dev)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/hidream-o1-image": { + "label": "Hidream O1 Image (fal-ai/hidream-o1-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + }, + "fal-ai/hidream-i1-full": { + "label": "Hidream I1 Full", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/9b/base": { + "label": "FLUX.2 [klein] 9B Base", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-1/krea": { + "label": "FLUX.1 Krea [dev] (fal-ai/flux-1/krea)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft/v4/pro/text-to-vector": { + "label": "Recraft V4 Pro (Vector)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "recraft/v4/style/text-to-image": { + "label": "Recraft V4 Styles", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "wan/v2.6/text-to-image": { + "label": "Wan v2.6", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "minPromptLength": 1, + "requestDefaults": { + "max_images": 1 + } + }, + "fal-ai/flux-2-lora-gallery/realism": { + "label": "FLUX 2 Lora Gallery Realism", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/stable-diffusion-v3-medium": { + "label": "Stable Diffusion V3", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/hunyuan-image/v3/instruct/text-to-image": { + "label": "Hunyuan Image 3.0 Instruct", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "auto", + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft-20b": { + "label": "Recraft 20b", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 1000 + }, + "fal-ai/wan/v2.2-a14b/text-to-image": { + "label": "Wan (fal-ai/wan/v2.2-a14b/text-to-image)", + "output": "image", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true + }, + "recraft/v4/style/pro/text-to-image": { + "label": "Recraft V4 Styles Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/flux-krea-lora": { + "label": "FLUX.1 Krea [dev] with LoRAs", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/phota": { + "label": "Phota", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["auto", "1:1", "16:9", "4:3", "3:4", "9:16"] + }, + "resolution": { + "field": "resolution", + "values": ["1K", "4K"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/4b/base": { + "label": "FLUX.2 [klein] 4B Base", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/wan-25-preview/text-to-image": { + "label": "Wan 2.5", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1 + }, + "minPromptLength": 1 + }, + "fal-ai/luma-photon": { + "label": "Luma Photon", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "9:21"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 3, + "maxPromptLength": 5000 + }, + "recraft/v4/style/text-to-vector": { + "label": "Recraft V4 Styles Text to Vector", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/ernie-image": { + "label": "Ernie Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "square_uhd", + "portrait_3_2", + "landscape_3_2", + "portrait_hd", + "landscape_hd" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "rundiffusion-fal/juggernaut-flux/lightning": { + "label": "Juggernaut Flux Lightning", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "nvidia/cosmos-3-super/text-to-image": { + "label": "Cosmos 3 Super", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1, + "maxPromptLength": 4096 + }, + "fal-ai/flux-2/klein/9b/base/lora": { + "label": "FLUX.2 [klein] 9B Base LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/boogu-image": { + "label": "Boogu Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/sana/sprint": { + "label": "Sana Sprint", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/kolors": { + "label": "Kolors", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/nucleus-image": { + "label": "Nucleus Image", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "bria/fibo/generate": { + "label": "Fibo", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + }, + "resolution": { + "field": "resolution", + "values": ["1MP", "4MP"] + } + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/ideogram/v2a/turbo": { + "label": "Ideogram V2A Turbo", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "10:16", + "16:10", + "9:16", + "16:9", + "4:3", + "3:4", + "1:1", + "1:3", + "3:1", + "3:2", + "2:3" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/hidream-o1-image/dev": { + "label": "Hidream O1 Image (fal-ai/hidream-o1-image/dev)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + }, + "rundiffusion-fal/juggernaut-flux/pro": { + "label": "Juggernaut Flux Pro", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/stable-diffusion-v35-medium": { + "label": "Stable Diffusion 3.5 Medium", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/lumina-image/v2": { + "label": "Lumina Image 2", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/ideogram/v2/turbo": { + "label": "Ideogram V2 Turbo", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "10:16", + "16:10", + "9:16", + "16:9", + "4:3", + "3:4", + "1:1", + "1:3", + "3:1", + "3:2", + "2:3" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/stable-diffusion-v15": { + "label": "Stable Diffusion v1.5", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft/v4.1/utility/text-to-image": { + "label": "Recraft V4.1 Utility (fal-ai/recraft/v4.1/utility/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "bria/fibo-gen-1.5/text-to-image": { + "label": "Fibo Gen 1.5", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + }, + "resolution": { + "field": "resolution", + "values": ["1MP", "4MP"] + } + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/sdxl-controlnet-union": { + "label": "SDXL ControlNet Union", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/glm-image": { + "label": "GLM Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "portrait_3_2", + "landscape_3_2", + "portrait_hd", + "landscape_hd" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/luma-photon/flash": { + "label": "Luma Photon Flash", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "9:21"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 3, + "maxPromptLength": 5000 + }, + "fal-ai/flux/srpo": { + "label": "FLUX.1 SRPO [dev] (fal-ai/flux/srpo)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/recraft/v4.1/utility/pro/text-to-image": { + "label": "Recraft V4.1 Utility (fal-ai/recraft/v4.1/utility/pro/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/fooocus": { + "label": "Fooocus", + "output": "images", + "options": { + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/9b/lora": { + "label": "FLUX.2 [klein] 9B LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/wan/v2.2-a14b/text-to-image/lora": { + "label": "Wan v2.2 A14B A14B with LoRAs", + "output": "image", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true + }, + "bria/fibo-lite/generate": { + "label": "Fibo Lite", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + } + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/hunyuan-image/v2.1/text-to-image": { + "label": "Hunyuan Image (fal-ai/hunyuan-image/v2.1/text-to-image)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/4b/base/lora": { + "label": "FLUX.2 [klein] 4B Base LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/longcat-image": { + "label": "Longcat Image", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/omnigen-v2": { + "label": "Omnigen V2", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/fast-lcm-diffusion": { + "label": "Latent Consistency Models (v1.5/XL)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/ideogram/v2a": { + "label": "Ideogram V2A", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": [ + "10:16", + "16:10", + "9:16", + "16:9", + "4:3", + "3:4", + "1:1", + "1:3", + "3:1", + "3:2", + "2:3" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/bagel": { + "label": "Bagel", + "output": "images", + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true + }, + "recraft/v4/style/pro/text-to-vector": { + "label": "Recraft V4 Styles Pro Text to Vector", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "minPromptLength": 1, + "maxPromptLength": 10000 + }, + "fal-ai/bria/text-to-image/base": { + "label": "Bria Base", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + }, + "ideogram/v4/lora": { + "label": "Ideogram V4.0q (LoRA)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/sana/v1.5/1.6b": { + "label": "Sana v1.5 1.6B", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/emu-3.5-image/text-to-image": { + "label": "Emu 3.5 Image", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["21:9", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "9:21"] + }, + "resolution": { + "field": "resolution", + "values": ["480p", "720p"] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/flux-2-lora-gallery/digital-comic-art": { + "label": "Flux 2 Lora Gallery (fal-ai/flux-2-lora-gallery/digital-comic-art)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/sana/v1.5/4.8b": { + "label": "Sana v1.5 4.8B", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "rundiffusion-fal/juggernaut-flux/base": { + "label": "Juggernaut Flux Base", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-1/srpo": { + "label": "FLUX.1 SRPO [dev] (fal-ai/flux-1/srpo)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2-lora-gallery/ballpoint-pen-sketch": { + "label": "Flux 2 Lora Gallery (fal-ai/flux-2-lora-gallery/ballpoint-pen-sketch)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2/klein/4b/lora": { + "label": "FLUX.2 [klein] 4B LoRA", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-lora/stream": { + "label": "Flux Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2-lora-gallery/hdr-style": { + "label": "FLUX 2 Lora Gallery Hdr Style", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/z-image/base/lora": { + "label": "Z Image Base Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/vidu/q2/text-to-image": { + "label": "Vidu", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["16:9", "9:16", "1:1"] + } + }, + "seed": true, + "maxPromptLength": 1500 + }, + "fal-ai/wan/v2.2-5b/text-to-image": { + "label": "Wan (fal-ai/wan/v2.2-5b/text-to-image)", + "output": "image", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true + }, + "fal-ai/flux-2-lora-gallery/sepia-vintage": { + "label": "Flux 2 Lora Gallery (fal-ai/flux-2-lora-gallery/sepia-vintage)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-2-lora-gallery/satellite-view-style": { + "label": "Flux 2 Lora Gallery (fal-ai/flux-2-lora-gallery/satellite-view-style)", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["png", "jpeg", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/ernie-image/lora/turbo": { + "label": "Ernie Image Lora Turbo", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "square_uhd", + "portrait_3_2", + "landscape_3_2", + "portrait_hd", + "landscape_hd" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "rundiffusion-fal/rundiffusion-photo-flux": { + "label": "Rundiffusion Photo Flux", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/vecglypher": { + "label": "Vecglypher", + "output": "image", + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true + }, + "fal-ai/ernie-image/lora": { + "label": "Ernie Image Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "square_uhd", + "portrait_3_2", + "landscape_3_2", + "portrait_hd", + "landscape_hd" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-kontext-lora/text-to-image": { + "label": "Flux Kontext Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/flux-krea-lora/stream": { + "label": "Flux Krea Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "bria/fibo-bbq-preview/generate": { + "label": "Fibo Bbq Preview", + "output": "image", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + } + }, + "seed": true, + "requestDefaults": { + "sync_mode": false + } + }, + "fal-ai/bria/text-to-image/fast": { + "label": "Bria Fast", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + }, + "fal-ai/z-image/turbo/tiling/lora": { + "label": "Z-Image Turbo Seamless Tiling Lora", + "output": "images", + "options": { + "size": { + "field": "image_size", + "values": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9", + "auto" + ] + }, + "outputFormat": { + "field": "output_format", + "values": ["jpeg", "png", "webp"] + } + }, + "booleans": { + "enableSafetyChecker": "enable_safety_checker" + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + } + }, + "fal-ai/bria/text-to-image/hd": { + "label": "Bria HD", + "output": "images", + "options": { + "aspectRatio": { + "field": "aspect_ratio", + "values": ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9"] + } + }, + "seed": true, + "requestDefaults": { + "num_images": 1, + "sync_mode": false + }, + "minPromptLength": 1 + } +} diff --git a/apps/sim/lib/media/image-catalog.ts b/apps/sim/lib/media/image-catalog.ts new file mode 100644 index 00000000000..067dada6c7e --- /dev/null +++ b/apps/sim/lib/media/image-catalog.ts @@ -0,0 +1,133 @@ +import falModels from '@/lib/media/fal-image-models.json' + +export const imageOptionFields = [ + 'size', + 'aspectRatio', + 'resolution', + 'quality', + 'background', + 'outputFormat', + 'moderation', + 'safetyTolerance', + 'thinkingLevel', +] as const + +type ImageOption = (typeof imageOptionFields)[number] +interface ImageModel { + provider: 'openai' | 'gemini' | 'falai' + id: string + label: string + endpoint?: string + output?: string + options?: Partial> + booleans?: Readonly> + seed?: boolean + requestDefaults?: Readonly> + minPromptLength?: number + maxPromptLength?: number +} + +export const imageModelDefaults = { + openai: 'gpt-image-1.5', + gemini: 'gemini-3.1-flash-image', + falai: 'nano-banana-2', +} as const + +const sizes = ['auto', '1024x1024', '1536x1024', '1024x1536'] +const ratios = ['1:1', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4', '9:16', '16:9', '21:9'] +const extremeRatios = [...ratios, '1:4', '4:1', '1:8', '8:1'] +const formats = ['png', 'jpeg', 'webp'] +const openaiModels = [ + ['gpt-image-2.5-sunburst', 'GPT Image 2.5 Sunburst'], + ['gpt-image-2.5-flare', 'GPT Image 2.5 Flare'], + ['gpt-image-2', 'GPT Image 2'], + ['gpt-image-1.5', 'GPT Image 1.5'], + ['gpt-image-1-mini', 'GPT Image 1 Mini'], + ['chatgpt-image-latest', 'ChatGPT Image Latest'], + ['gpt-image-2.5-sunburst-2026-09-08', 'GPT Image 2.5 Sunburst (2026-09-08)'], + ['gpt-image-2.5-flare-2026-09-08', 'GPT Image 2.5 Flare (2026-09-08)'], + ['gpt-image-2-2026-04-21', 'GPT Image 2 (2026-04-21)'], +] as const +const geminiModels = [ + ['gemini-nano-banana-2.1', 'Nano Banana 2.1'], + ['gemini-3-pro-image', 'Nano Banana Pro'], + ['gemini-3.1-flash-image', 'Nano Banana 2'], + ['gemini-3.1-flash-lite-image', 'Nano Banana 2 Lite'], + ['gemini-2.5-flash-image', 'Nano Banana'], +] as const + +/** Current prompt-to-image models, shared by the block and provider request validation. */ +export const imageModels: readonly ImageModel[] = [ + ...openaiModels.map( + ([id, label]): ImageModel => ({ + provider: 'openai', + id, + label, + options: { + size: { + field: 'size', + values: id.startsWith('gpt-image-2') ? [...sizes, '2560x1440', '3840x2160'] : sizes, + }, + quality: { + field: 'quality', + values: [ + 'auto', + 'low', + 'medium', + 'high', + ...(id.startsWith('gpt-image-2.5') ? ['xhigh', 'max'] : []), + ], + }, + background: { field: 'background', values: ['auto', 'transparent', 'opaque'] }, + outputFormat: { field: 'output_format', values: formats }, + moderation: { field: 'moderation', values: ['auto', 'low'] }, + }, + requestDefaults: { n: 1, size: 'auto' }, + }) + ), + ...geminiModels.map( + ([id, label]): ImageModel => ({ + provider: 'gemini', + id, + label, + options: { + aspectRatio: { + field: 'aspectRatio', + values: + id === 'gemini-nano-banana-2.1' || id === 'gemini-3.1-flash-image' + ? extremeRatios + : ratios, + }, + ...(!['gemini-2.5-flash-image', 'gemini-3.1-flash-lite-image'].includes(id) && { + resolution: { + field: 'imageSize', + values: [...(id === 'gemini-3.1-flash-image' ? ['512'] : []), '1K', '2K', '4K'], + }, + }), + }, + }) + ), + ...Object.entries(falModels).map( + ([endpoint, spec]): ImageModel => ({ + ...spec, + provider: 'falai', + endpoint, + id: 'legacyId' in spec ? spec.legacyId : endpoint, + }) + ), +] + +const byId = new Map(imageModels.map((model) => [`${model.provider}:${model.id}`, model])) +for (const model of imageModels) { + if (model.endpoint) byId.set(`falai:${model.endpoint}`, model) +} +const geminiAliases: Record = { + 'gemini-3.1-flash-image-preview': 'gemini-3.1-flash-image', + 'gemini-3-pro-image-preview': 'gemini-3-pro-image', +} + +export function getImageModel(provider: unknown, id: unknown) { + if (typeof provider !== 'string' || typeof id !== 'string') return undefined + const modelId = provider === 'gemini' ? (geminiAliases[id] ?? id) : id + return byId.get(`${provider}:${modelId}`) +} diff --git a/apps/sim/lib/mothership/tools/server/image/generate-image.ts b/apps/sim/lib/mothership/tools/server/image/generate-image.ts index 1e686b50d68..041d48f08ab 100644 --- a/apps/sim/lib/mothership/tools/server/image/generate-image.ts +++ b/apps/sim/lib/mothership/tools/server/image/generate-image.ts @@ -26,7 +26,7 @@ import { readWorkspaceFileContent } from '@/lib/workspace-files/application/read const logger = createLogger('GenerateImageTool') -const NANO_BANANA_MODEL = 'gemini-3.1-flash-image-preview' +const NANO_BANANA_MODEL = 'gemini-3.1-flash-image' const NANO_BANANA_IMAGE_COST_USD = 0.101 const ASPECT_RATIO_TO_SIZE: Record = { diff --git a/apps/sim/scripts/validate-fal-image-models.ts b/apps/sim/scripts/validate-fal-image-models.ts new file mode 100644 index 00000000000..2bc8282f613 --- /dev/null +++ b/apps/sim/scripts/validate-fal-image-models.ts @@ -0,0 +1,144 @@ +/** + * Checks the Image Generator's fal requests against live provider schemas without submitting jobs. + * Run with bun apps/sim/scripts/validate-fal-image-models.ts. + * FAL_IMAGE_SCHEMA_DIR can supply saved schemas named .json. + * FAL_IMAGE_REPORT_PATH saves a repeatable per-model validation report. + */ +import assert from 'node:assert/strict' +import { readFile, writeFile } from 'node:fs/promises' +import { join } from 'node:path' +import { createLogger } from '@sim/logger' +import { getErrorMessage } from '@sim/utils/errors' +import Ajv from 'ajv/dist/2020' +import { readResponseJsonWithLimit } from '@/lib/core/utils/stream-limits' +import { buildImageGenerationRequest } from '@/lib/internal/image/request' +import { imageGenerationInputSchema } from '@/lib/internal/image/schema' +import { imageModels } from '@/lib/media/image-catalog' +import { evaluateSubBlockCondition } from '@/lib/workflows/subblocks/visibility' +import { ImageGeneratorV2Block } from '@/blocks/blocks/image_generator' +import { imageGenerateTool } from '@/tools/image/generate' + +const logger = createLogger('ValidateFalImageModels') +interface Schema { + $ref?: string + properties?: Record + items?: Schema + allOf?: Schema[] + anyOf?: Schema[] +} +interface ApiSchema { + components: { schemas: Record } + paths: Record< + string, + { + post?: { requestBody: { content: { 'application/json': { schema: Schema } } } } + get?: { responses: { '200': { content: { 'application/json': { schema: Schema } } } } } + } + > +} +async function loadSchema(endpoint: string): Promise { + if (process.env.FAL_IMAGE_SCHEMA_DIR) { + return JSON.parse( + await readFile( + join(process.env.FAL_IMAGE_SCHEMA_DIR, `${endpoint.replaceAll('/', '__')}.json`), + 'utf8' + ) + ) + } + const url = new URL('https://fal.ai/api/openapi/queue/openapi.json') + url.searchParams.set('endpoint_id', endpoint) + const response = await fetch(url, { signal: AbortSignal.timeout(30_000) }) + if (!response.ok) throw new Error(`fal schema returned HTTP ${response.status}`) + return readResponseJsonWithLimit(response, { + maxBytes: 4 * 1024 * 1024, + label: 'fal image schema', + }) +} + +const results = [] +for (const model of imageModels.filter((item) => item.provider === 'falai')) { + const started = Date.now() + try { + assert(model.endpoint) + const api = await loadSchema(model.endpoint) + const resolve = (schema: Schema): Schema => + schema.$ref ? resolve(api.components.schemas[schema.$ref.split('/').pop() ?? '']) : schema + const path = `/${model.endpoint}` + const input = api.paths[path]?.post?.requestBody.content['application/json'].schema + const output = + api.paths[`${path}/requests/{request_id}`]?.get?.responses['200'].content['application/json'] + .schema + assert(input && output && model.output) + const file = resolve(output).properties?.[model.output] + assert(file) + const image = model.output === 'images' ? resolve(file).items : file + assert(image) + function hasUrl(schema: Schema): boolean { + const item = resolve(schema) + return Boolean(item.properties?.url) || (item.allOf ?? item.anyOf ?? []).some(hasUrl) + } + assert(hasUrl(image), 'Expected a downloadable image response') + const validate = new Ajv({ strict: false, validateFormats: false, logger: false }).compile({ + ...resolve(input), + components: api.components, + additionalProperties: false, + }) + const base = { + provider: 'falai' as const, + apiKey: 'schema-validation', + model: model.id, + prompt: 'A red kite above a meadow.', + } + const mapParams = ImageGeneratorV2Block.tools.config?.params + assert(mapParams) + let requests = 0 + const check = (settings: Record, key?: string, value?: string) => { + const mapped = mapParams({ ...base, ...settings }) + const toolInput = imageGenerateTool.operation.input({ ...base, ...mapped }) + const parsed = imageGenerationInputSchema.parse(toolInput) + const request = buildImageGenerationRequest(parsed) + assert.equal(request.endpoint, `https://queue.fal.run/${model.endpoint}`) + assert(validate(request.body), JSON.stringify(validate.errors)) + if (key && value !== 'default') assert.equal(String(request.body[key]), value) + assert.equal(request.body.prompt, base.prompt) + requests++ + } + check({}) + for (const field of ImageGeneratorV2Block.subBlocks) { + if (!evaluateSubBlockCondition(field.condition, base)) continue + const option = model.options?.[field.id as keyof NonNullable] + const wireKey = option?.field ?? model.booleans?.[field.id] + if (!wireKey) continue + const options = + typeof field.options === 'function' ? field.options({ values: base }) : field.options + assert(options?.length) + for (const value of options) check({ [field.id]: value.id }, wireKey, value.id) + } + if (model.seed) check({ seed: 42 }, 'seed', '42') + results.push({ + endpoint: model.endpoint, + passed: true, + requests, + durationMs: Date.now() - started, + }) + } catch (error) { + results.push({ + endpoint: model.endpoint, + passed: false, + error: getErrorMessage(error), + durationMs: Date.now() - started, + }) + } +} +if (process.env.FAL_IMAGE_REPORT_PATH) + await writeFile(process.env.FAL_IMAGE_REPORT_PATH, JSON.stringify(results, null, 2)) +const failures = results.filter((item) => !item.passed) +if (failures.length) { + logger.error('Image model validation failed', { failures }) + process.exitCode = 1 +} else { + logger.info('All fal image models verified', { + models: results.length, + requests: results.reduce((count, item) => count + (item.requests ?? 0), 0), + }) +} diff --git a/apps/sim/tools/generated/tool-metadata.ts b/apps/sim/tools/generated/tool-metadata.ts index 15d41415319..e0636078393 100644 --- a/apps/sim/tools/generated/tool-metadata.ts +++ b/apps/sim/tools/generated/tool-metadata.ts @@ -3,7 +3,7 @@ /** Serializable metadata for every built-in tool, keyed by tool id. */ const toolMetadata: Record = JSON.parse( - '{"a2a_cancel_task":{"id":"a2a_cancel_task","name":"A2A Cancel Task","description":"Request cancellation of an in-progress A2A task.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The task ID to cancel"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_get_agent_card":{"id":"a2a_get_agent_card","name":"A2A Get Agent Card","description":"Fetch the Agent Card (discovery document) for an external A2A agent.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_get_task":{"id":"a2a_get_task","name":"A2A Get Task","description":"Retrieve the current state and result of an A2A task.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The task ID to retrieve"},"historyLength":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of history messages to include"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_send_message":{"id":"a2a_send_message","name":"A2A Send Message","description":"Send a message to an external A2A agent and return its response.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"message":{"type":"string","required":true,"visibility":"user-or-llm","description":"The message text to send"},"data":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional structured JSON data to attach"},"files":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional files to attach"},"taskId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Existing task ID to continue"},"contextId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Conversation context ID to continue"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"affinity_batch_update_entity_fields":{"id":"affinity_batch_update_entity_fields","name":"Affinity Batch Update Entity Fields","description":"Write up to 100 non-list field values on one company or person in a single request.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to write the fields on: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"updates":{"type":"json","required":true,"visibility":"user-or-llm","description":"Up to 100 field updates as [{\\"id\\":\\"\\",\\"value\\":{\\"type\\":\\"…\\",\\"data\\":…}}], using the same value shapes as a single field update"}},"hostedApiKey":"none"},"affinity_batch_update_list_entry_fields":{"id":"affinity_batch_update_list_entry_fields","name":"Affinity Batch Update List Entry Fields","description":"Write up to 100 field values on one list row in a single request. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"updates":{"type":"json","required":true,"visibility":"user-or-llm","description":"Up to 100 field updates as [{\\"id\\":\\"\\",\\"value\\":{\\"type\\":\\"…\\",\\"data\\":…}}], using the same value shapes as a single field update"}},"hostedApiKey":"none"},"affinity_create_list":{"id":"affinity_create_list","name":"Affinity Create List","description":"Create a list. Its type fixes which entities it can hold, and the API key holder becomes its creator and owner.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the new list"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Entity kind the list holds: company, opportunity, or person"},"isPublic":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether everyone in the organization can see the list"}},"hostedApiKey":"none"},"affinity_create_list_field_dropdown_option":{"id":"affinity_create_list_field_dropdown_option","name":"Affinity Create List Field Dropdown Option","description":"Add a selectable option to a dropdown field on a list. A ranked or status option also needs a rank and a color.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Kind of option to create, matching the field. dropdown takes only a label; ranked-dropdown also requires rank and color; status-dropdown additionally requires a status category. Sending a field the kind does not accept is rejected"},"text":{"type":"string","required":true,"visibility":"user-or-llm","description":"The option label"},"rank":{"type":"number","required":false,"visibility":"user-or-llm","description":"Sort order. Required on a ranked-dropdown or status-dropdown option"},"color":{"type":"string","required":false,"visibility":"user-or-llm","description":"Option color: white, gray, blue, green, purple, orange, or red. Required on a ranked-dropdown or status-dropdown option"},"statusCategory":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pipeline meaning of the option: open, won, lost, or on-hold. Status-dropdown options only"},"winRate":{"type":"number","required":false,"visibility":"user-or-llm","description":"Expected win rate of the status. Status-dropdown options only"}},"hostedApiKey":"none"},"affinity_create_merge":{"id":"affinity_create_merge","name":"Affinity Create Merge","description":"Fold a duplicate company or person into the record you are keeping. The merge runs asynchronously — poll the returned task to see it finish. Requires the \\"Manage duplicates\\" permission and an admin role.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to merge: companies or persons"},"primaryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to keep"},"duplicateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the duplicate record to fold in"}},"hostedApiKey":"none"},"affinity_create_note":{"id":"affinity_create_note","name":"Affinity Create Note","description":"Write a note — attached to companies, persons, and opportunities, anchored to a meeting, call, or chat message, or posted as a reply to an existing note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Note shape: entities to attach it to records, interaction to anchor it to a meeting, call, or chat message, or user-reply to reply to a note"},"html":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note body as HTML"},"companyIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Companies to attach the note to, e.g. [1, 2]. Not used on a reply"},"personIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Persons to attach the note to, e.g. [1, 2]. Not used on a reply"},"opportunityIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Opportunities to attach the note to, e.g. [1, 2]. Not used on a reply"},"interactionId":{"type":"string","required":false,"visibility":"user-or-llm","description":"The interaction to anchor the note to. Required for an interaction note"},"interactionType":{"type":"string","required":false,"visibility":"user-or-llm","description":"Kind of the anchoring interaction: meeting, call, or chat-message. Required for an interaction note"},"parentId":{"type":"string","required":false,"visibility":"user-or-llm","description":"The note being replied to. Required for a user-reply note"},"creatorId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Attribute the note to another internal person. Defaults to the API key holder"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"Backdate the note to this ISO 8601 timestamp"}},"hostedApiKey":"none"},"affinity_create_reminder":{"id":"affinity_create_reminder","name":"Affinity Create Reminder","description":"Create a reminder on one company, person, or opportunity. A recurring reminder resets whenever the chosen signal happens instead of firing once.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"one-time to fire once, or recurring to reset on a signal"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"What the reminder is about: company, person, or opportunity"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company, person, or opportunity"},"dueDate":{"type":"string","required":false,"visibility":"user-or-llm","description":"When the reminder is due, as an ISO 8601 timestamp. Required for a one-time reminder; on a recurring one Affinity computes it from the period when omitted"},"content":{"type":"string","required":false,"visibility":"user-or-llm","description":"What the reminder says"},"ownerId":{"type":"string","required":true,"visibility":"user-or-llm","description":"User the reminder is assigned to. Must be an internal user. The API key holder is recorded as the creator, which is a separate field"},"resetTrigger":{"type":"string","required":false,"visibility":"user-or-llm","description":"What restarts a recurring reminder: interaction, email, or event. Required when the type is recurring"},"periodDays":{"type":"number","required":false,"visibility":"user-or-llm","description":"Days between firings of a recurring reminder. Required when the type is recurring"}},"hostedApiKey":"none"},"affinity_delete_list_field_dropdown_option":{"id":"affinity_delete_list_field_dropdown_option","name":"Affinity Delete List Field Dropdown Option","description":"Permanently delete a dropdown option on a list field. Every list entry currently set to it is cleared, and those values cannot be recovered.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID to delete"}},"hostedApiKey":"none"},"affinity_delete_note":{"id":"affinity_delete_note","name":"Affinity Delete Note","description":"Delete a note you created. Deleting a root note also deletes its replies; deleting a reply removes only that reply.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID to delete"}},"hostedApiKey":"none"},"affinity_get_company":{"id":"affinity_get_company","name":"Affinity Get Company","description":"Look up one company by ID. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"companyId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The company ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"}},"hostedApiKey":"none"},"affinity_get_current_user":{"id":"affinity_get_current_user","name":"Affinity Get Current User","description":"Verify an Affinity API key and return the tenant, the user behind the key, and the scopes the grant carries.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"}},"hostedApiKey":"none"},"affinity_get_entity_field_value":{"id":"affinity_get_entity_field_value","name":"Affinity Get Entity Field Value","description":"Read one non-list field value from a company or person.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to read the field from: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to read"}},"hostedApiKey":"none"},"affinity_get_list":{"id":"affinity_get_list","name":"Affinity Get List","description":"Read one list — its name, type, owner, and privacy setting.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"}},"hostedApiKey":"none"},"affinity_get_list_entry":{"id":"affinity_get_list_entry","name":"Affinity Get List Entry","description":"Read one row of a list with its entity. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"}},"hostedApiKey":"none"},"affinity_get_list_entry_field":{"id":"affinity_get_list_entry_field","name":"Affinity Get List Entry Field","description":"Read one field value on a list row.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to read"}},"hostedApiKey":"none"},"affinity_get_list_field_dropdown_option":{"id":"affinity_get_list_field_dropdown_option","name":"Affinity Get List Field Dropdown Option","description":"Read one dropdown option on a list field.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID"}},"hostedApiKey":"none"},"affinity_get_merge":{"id":"affinity_get_merge","name":"Affinity Get Merge","description":"Read the status of one company or person merge, including why it failed if it did.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge to read: companies or persons"},"mergeId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The merge ID"}},"hostedApiKey":"none"},"affinity_get_merge_task":{"id":"affinity_get_merge_task","name":"Affinity Get Merge Task","description":"Read one merge task and how its merges are progressing. Poll this after starting a merge.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge task to read: companies or persons"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The merge task ID"}},"hostedApiKey":"none"},"affinity_get_note":{"id":"affinity_get_note","name":"Affinity Get Note","description":"Read one note with its body, author, mentions, and attached records.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return, e.g. [\\"repliesCount\\",\\"personsPreview\\",\\"companiesPreview\\",\\"opportunitiesPreview\\"]. Those four fields are omitted unless requested here"}},"hostedApiKey":"none"},"affinity_get_opportunity":{"id":"affinity_get_opportunity","name":"Affinity Get Opportunity","description":"Read one opportunity and the list it belongs to. Its field data lives on the list entry.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"opportunityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The opportunity ID"}},"hostedApiKey":"none"},"affinity_get_person":{"id":"affinity_get_person","name":"Affinity Get Person","description":"Look up one person by ID. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"personId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The person ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"}},"hostedApiKey":"none"},"affinity_get_saved_view":{"id":"affinity_get_saved_view","name":"Affinity Get Saved View","description":"Read one saved view — its name, kind, and creation date.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"viewId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The saved view ID"}},"hostedApiKey":"none"},"affinity_get_transcript":{"id":"affinity_get_transcript","name":"Affinity Get Transcript","description":"Read one transcript with its first 100 fragments. Page the fragments endpoint for a longer meeting.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"transcriptId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The transcript ID"}},"hostedApiKey":"none"},"affinity_get_user":{"id":"affinity_get_user","name":"Affinity Get User","description":"Read one internal user. A user and their person record share the same numeric ID, so a person ID works here.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"userId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The user ID, which is also their person ID"}},"hostedApiKey":"none"},"affinity_list_calls":{"id":"affinity_list_calls","name":"Affinity List Calls","description":"Page through logged calls and their participants. Only calls the API key holder can see are returned.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_chat_messages":{"id":"affinity_list_chat_messages","name":"Affinity List Chat Messages","description":"Page through logged chat messages and their participants. Only messages the API key holder can see are returned.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_companies":{"id":"affinity_list_companies","name":"Affinity List Companies","description":"Page through companies. Companies come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these company IDs, e.g. [1, 2, 3]"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_coworker_connections":{"id":"affinity_list_coworker_connections","name":"Affinity List Coworker Connections","description":"Find warm paths into a company through shared work history: who in your Affinity data once worked alongside the people you want to reach. Grouped by target, strongest first.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":true,"visibility":"user-or-llm","description":"Required scope. The only supported filter is target.currentCompany.id, e.g. \\"target.currentCompany.id=123\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of targets to return per page, 1-50. Defaults to 20"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_emails":{"id":"affinity_list_emails","name":"Affinity List Emails","description":"Page through email metadata — subject, participants, and timestamps. Affinity never exposes email bodies through the API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_entity_field_values":{"id":"affinity_list_entity_field_values","name":"Affinity List Entity Field Values","description":"Page through a company\'s or person\'s non-list field values. List fields are not returned here — read those through the list entry.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to read field values from: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field IDs. Mutually exclusive with Field Types"},"types":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field categories: enriched, global, relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 20"}},"hostedApiKey":"none"},"affinity_list_entity_list_entries":{"id":"affinity_list_entity_list_entries","name":"Affinity List Entity List Entries","description":"Page through a company\'s or person\'s rows across every list, each carrying that list\'s field values and when the entity was added.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up the rows of: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_entity_lists":{"id":"affinity_list_entity_lists","name":"Affinity List Entity Lists","description":"List every list a company or person appears on that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up the lists of: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_entity_notes":{"id":"affinity_list_entity_notes","name":"Affinity List Entity Notes","description":"List the notes relevant to one company, person, or opportunity — directly attached notes plus notes reaching it through its people and meetings.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity the notes hang off: companies, persons, or opportunities"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company, person, or opportunity"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_entity_relationships":{"id":"affinity_list_entity_relationships","name":"Affinity List Entity Relationships","description":"List who knows a company or person, scored 0.0 to 1.0 by how much the two actually interact. Strongest first by default.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up relationships for: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on interactionScore only, e.g. \\"interactionScore>=0.5\\""},"orderBy":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order: [\\"interactionScore\\"] for weakest first, [\\"-interactionScore\\"] for strongest first (the default)"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_field_dropdown_options":{"id":"affinity_list_field_dropdown_options","name":"Affinity List Field Dropdown Options","description":"List the selectable options on a dropdown or ranked-dropdown company or person field. Writing such a field needs the option ID, not its text.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which field family the field belongs to: companies or persons"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown or ranked-dropdown field ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_field_metadata":{"id":"affinity_list_field_metadata","name":"Affinity List Field Metadata","description":"List the non-list company or person fields, with the value type, filter operators, and sort support of each. Start here to find the Field IDs the read and write tools take.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which fields to describe: companies or persons"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return: [\\"filterability\\",\\"sortability\\"]. Both are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on name only, e.g. \\"name=~Status\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_field_value_changes":{"id":"affinity_list_field_value_changes","name":"Affinity List Field Value Changes","description":"Page through field value changes across the whole workspace. Built for delta sync: follow nextCursor to the end of a run, then resume from the last cursor next time.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over field.id, listEntry.id, changer.id, changedAt, or actionType. Resume a sync with e.g. \\"changedAt>2026-06-01T12:00:00Z\\""},"orderBy":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order: [\\"changedAt\\"] for oldest first (the default), [\\"-changedAt\\"] for newest first"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_investor_executive_connections":{"id":"affinity_list_investor_executive_connections","name":"Affinity List Investor Executive Connections","description":"Find warm paths into a company through investment history: which investors in your Affinity data backed a company the people you want to reach once led. Grouped by target, strongest first.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":true,"visibility":"user-or-llm","description":"Required scope. The only supported filter is target.currentCompany.id, e.g. \\"target.currentCompany.id=123\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of targets to return per page, 1-50. Defaults to 20"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_list_entries":{"id":"affinity_list_list_entries","name":"Affinity List List Entries","description":"Page through the rows of a list. Rows come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_list_entry_field_value_changes":{"id":"affinity_list_list_entry_field_value_changes","name":"Affinity List List Entry Field Value Changes","description":"Page through the history of one list row — who changed which field, when, and to what.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over field.id, changer.id, changedAt, or actionType, e.g. \\"field.id=field-1234\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_list_entry_fields":{"id":"affinity_list_list_entry_fields","name":"Affinity List List Entry Fields","description":"Page through every field value on one list row, including the list-specific columns. All fields are returned unless narrowed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field IDs. Mutually exclusive with Field Types"},"types":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field categories: enriched, global, list, relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 20"}},"hostedApiKey":"none"},"affinity_list_list_field_dropdown_options":{"id":"affinity_list_list_field_dropdown_options","name":"Affinity List List Field Dropdown Options","description":"List the selectable options on a dropdown, ranked-dropdown, or status-dropdown field of a list.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_list_fields":{"id":"affinity_list_list_fields","name":"Affinity List List Fields","description":"List the fields available on one list, including its list-specific columns. Use these Field IDs when reading or writing list entries.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return: [\\"filterability\\",\\"sortability\\"]. Both are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on name only, e.g. \\"name=~Stage\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_lists":{"id":"affinity_list_lists","name":"Affinity List Lists","description":"Page through the lists in the organization that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"term":{"type":"string","required":false,"visibility":"user-or-llm","description":"Case-insensitive substring match on the list name"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_meetings":{"id":"affinity_list_meetings","name":"Affinity List Meetings","description":"Page through past and upcoming meetings with their organizer and attendees.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_merge_tasks":{"id":"affinity_list_merge_tasks","name":"Affinity List Merge Tasks","description":"Page through merge tasks, each summarizing how many of its merges are in progress, succeeded, or failed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge tasks to list: companies or persons"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on status only, e.g. \\"status=in-progress\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_merges":{"id":"affinity_list_merges","name":"Affinity List Merges","description":"Page through the company or person merges the organization has run, with the status and the records involved in each.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merges to list: companies or persons"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over status or taskId, e.g. \\"status=failed\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_note_attached_companies":{"id":"affinity_list_note_attached_companies","name":"Affinity List Note Attached Companies","description":"List the companies directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_note_attached_opportunities":{"id":"affinity_list_note_attached_opportunities","name":"Affinity List Note Attached Opportunities","description":"List the opportunities directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_note_attached_persons":{"id":"affinity_list_note_attached_persons","name":"Affinity List Note Attached Persons","description":"List the persons directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_note_replies":{"id":"affinity_list_note_replies","name":"Affinity List Note Replies","description":"Page through the replies on one note, including AI Notetaker replies.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID whose replies to read"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_notes":{"id":"affinity_list_notes","name":"Affinity List Notes","description":"Page through every note the caller can see. Replies are excluded.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return, e.g. [\\"repliesCount\\",\\"personsPreview\\",\\"companiesPreview\\",\\"opportunitiesPreview\\"]. Those four fields are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_opportunities":{"id":"affinity_list_opportunities","name":"Affinity List Opportunities","description":"Page through opportunities. Field data lives on the list entry, not here — read it through the list or saved view the opportunity belongs to.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these opportunity IDs, e.g. [1, 2, 3]"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_persons":{"id":"affinity_list_persons","name":"Affinity List Persons","description":"Page through persons. Persons come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these person IDs, e.g. [1, 2, 3]"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_reminders":{"id":"affinity_list_reminders","name":"Affinity List Reminders","description":"Page through the reminders the caller can see. Filter by status to surface what is overdue.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_saved_view_entries":{"id":"affinity_list_saved_view_entries","name":"Affinity List Saved View Entries","description":"Page through the rows of a saved view. The view\'s own filters and columns decide which rows and which field data come back.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"viewId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The saved view ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_saved_views":{"id":"affinity_list_saved_views","name":"Affinity List Saved Views","description":"List the saved views on a list that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_list_transcript_fragments":{"id":"affinity_list_transcript_fragments","name":"Affinity List Transcript Fragments","description":"Page through everything said in a meeting, segment by segment with the speaker.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"transcriptId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The transcript ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_transcripts":{"id":"affinity_list_transcripts","name":"Affinity List Transcripts","description":"Page through meeting transcript metadata. Read one transcript to get what was actually said.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_list_users":{"id":"affinity_list_users","name":"Affinity List Users","description":"Page through the internal users in the organization. Email addresses and roles are returned only to callers with the \\"Manage Users\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"term":{"type":"string","required":false,"visibility":"user-or-llm","description":"Case-insensitive match across first name, last name, and primary email"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over id or status, e.g. \\"status=active\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_search_companies":{"id":"affinity_search_companies","name":"Affinity Search Companies","description":"Search companies by filters, sorts, and a free-text term. Requires the \\"Export All Organizations directory\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_search_files":{"id":"affinity_search_files","name":"Affinity Search Files","description":"Search files by keyword, ordered by relevance. Narrow to specific files or to one company, or leave both unset to search the whole account.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to search for. Between 3 and 500 characters"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to these file IDs. Cannot be combined with Company ID"},"companyId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Restrict the search to one company\'s files. Cannot be combined with file IDs"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of files to return, 1-100. Defaults to 20"}},"hostedApiKey":"none"},"affinity_search_list_entries":{"id":"affinity_search_list_entries","name":"Affinity Search List Entries","description":"Search the rows of one list by filters, sorts, and a free-text term. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID to search"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_search_notes":{"id":"affinity_search_notes","name":"Affinity Search Notes","description":"Search notes by keyword, ordered by relevance. Narrow to specific notes or to one company, or leave both unset to search the whole account.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to search for. Between 3 and 500 characters"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to these note IDs. Cannot be combined with Company ID"},"companyId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Restrict the search to one company\'s notes. Cannot be combined with note IDs"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of notes to return, 1-100. Defaults to 20"}},"hostedApiKey":"none"},"affinity_search_persons":{"id":"affinity_search_persons","name":"Affinity Search Persons","description":"Search persons by filters, sorts, and a free-text term. Requires the \\"Export All People directory\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"hostedApiKey":"none"},"affinity_semantic_search":{"id":"affinity_semantic_search","name":"Affinity Semantic Search","description":"Find companies from a description in plain language — industry, technology, stage, or business model. Currently searches companies only.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to look for, in plain language, e.g. \\"climate tech companies in our pipeline\\". Up to 500 characters"},"listIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to companies on these lists, e.g. [1, 2]"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of companies to return, 1-100. Defaults to 100"}},"hostedApiKey":"none"},"affinity_update_entity_field_value":{"id":"affinity_update_entity_field_value","name":"Affinity Update Entity Field Value","description":"Write one non-list field value on a company or person. The value type must match how the field is defined.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to write the field on: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to write"},"value":{"type":"json","required":true,"visibility":"user-or-llm","description":"The new value as {type, data}, where type matches the field\'s value type. Examples: {\\"type\\":\\"text\\",\\"data\\":\\"Series B\\"}, {\\"type\\":\\"number\\",\\"data\\":42}, {\\"type\\":\\"dropdown\\",\\"data\\":{\\"dropdownOptionId\\":7}}, {\\"type\\":\\"person\\",\\"data\\":{\\"id\\":123}}, {\\"type\\":\\"person-multi\\",\\"data\\":[{\\"id\\":123}]}. Pass data as null to clear the field"}},"hostedApiKey":"none"},"affinity_update_list_entry_field":{"id":"affinity_update_list_entry_field","name":"Affinity Update List Entry Field","description":"Write one field value on a list row. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to write"},"value":{"type":"json","required":true,"visibility":"user-or-llm","description":"The new value as {type, data}, where type matches the field\'s value type. Examples: {\\"type\\":\\"text\\",\\"data\\":\\"Series B\\"}, {\\"type\\":\\"number\\",\\"data\\":42}, {\\"type\\":\\"dropdown\\",\\"data\\":{\\"dropdownOptionId\\":7}}, {\\"type\\":\\"person\\",\\"data\\":{\\"id\\":123}}, {\\"type\\":\\"person-multi\\",\\"data\\":[{\\"id\\":123}]}. Pass data as null to clear the field"}},"hostedApiKey":"none"},"affinity_update_list_field_dropdown_option":{"id":"affinity_update_list_field_dropdown_option","name":"Affinity Update List Field Dropdown Option","description":"Change a dropdown option on a list field. Every field is optional — supply only what should change, and only fields the option\'s kind actually has.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID to update"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Replacement option label. Supply at least one field to change"},"rank":{"type":"number","required":false,"visibility":"user-or-llm","description":"Sort order. Required on a ranked-dropdown or status-dropdown option"},"color":{"type":"string","required":false,"visibility":"user-or-llm","description":"Option color: white, gray, blue, green, purple, orange, or red. Required on a ranked-dropdown or status-dropdown option"},"statusCategory":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pipeline meaning of the option: open, won, lost, or on-hold. Status-dropdown options only"},"winRate":{"type":"number","required":false,"visibility":"user-or-llm","description":"Expected win rate of the status. Status-dropdown options only"}},"hostedApiKey":"none"},"affinity_update_note":{"id":"affinity_update_note","name":"Affinity Update Note","description":"Rewrite a note\'s body or replace which records it is attached to. Each list of IDs replaces that association wholesale, an empty list clears it, and omitting one leaves it untouched. A note\'s type cannot be changed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID to update"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"Replacement note body as HTML"},"companyIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached companies, e.g. [1, 2]. Send [] to detach every company; omit to leave them unchanged"},"personIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached persons, e.g. [1, 2]. Send [] to detach every person; omit to leave them unchanged"},"opportunityIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached opportunities, e.g. [1, 2]. Send [] to detach every opportunity; omit to leave them unchanged"}},"hostedApiKey":"none"},"agentmail_create_draft":{"id":"agentmail_create_draft","name":"Create Draft","description":"Create a new email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to create the draft in"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Draft subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text draft body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML draft body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"},"inReplyTo":{"type":"string","required":false,"visibility":"user-or-llm","description":"ID of message being replied to"},"sendAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to schedule sending"}},"hostedApiKey":"none"},"agentmail_create_inbox":{"id":"agentmail_create_inbox","name":"Create Inbox","description":"Create a new email inbox with AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"username":{"type":"string","required":false,"visibility":"user-or-llm","description":"Username for the inbox email address"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Domain for the inbox email address"},"displayName":{"type":"string","required":false,"visibility":"user-or-llm","description":"Display name for the inbox"}},"hostedApiKey":"none"},"agentmail_delete_draft":{"id":"agentmail_delete_draft","name":"Delete Draft","description":"Delete an email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to delete"}},"hostedApiKey":"none"},"agentmail_delete_inbox":{"id":"agentmail_delete_inbox","name":"Delete Inbox","description":"Delete an email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to delete"}},"hostedApiKey":"none"},"agentmail_delete_thread":{"id":"agentmail_delete_thread","name":"Delete Thread","description":"Delete an email thread in AgentMail (moves to trash, or permanently deletes if already in trash)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to delete"},"permanent":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Force permanent deletion instead of moving to trash"}},"hostedApiKey":"none"},"agentmail_forward_message":{"id":"agentmail_forward_message","name":"Forward Message","description":"Forward an email message to new recipients in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to forward"},"to":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Override subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Additional plain text to prepend"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"Additional HTML to prepend"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"}},"hostedApiKey":"none"},"agentmail_get_draft":{"id":"agentmail_get_draft","name":"Get Draft","description":"Get details of a specific email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox the draft belongs to"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to retrieve"}},"hostedApiKey":"none"},"agentmail_get_inbox":{"id":"agentmail_get_inbox","name":"Get Inbox","description":"Get details of a specific email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to retrieve"}},"hostedApiKey":"none"},"agentmail_get_message":{"id":"agentmail_get_message","name":"Get Message","description":"Get details of a specific email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to retrieve"}},"hostedApiKey":"none"},"agentmail_get_thread":{"id":"agentmail_get_thread","name":"Get Thread","description":"Get details of a specific email thread including messages in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to retrieve"}},"hostedApiKey":"none"},"agentmail_list_drafts":{"id":"agentmail_list_drafts","name":"List Drafts","description":"List email drafts in an inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list drafts from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of drafts to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"hostedApiKey":"none"},"agentmail_list_inboxes":{"id":"agentmail_list_inboxes","name":"List Inboxes","description":"List all email inboxes in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of inboxes to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"hostedApiKey":"none"},"agentmail_list_messages":{"id":"agentmail_list_messages","name":"List Messages","description":"List messages in an inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list messages from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of messages to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"hostedApiKey":"none"},"agentmail_list_threads":{"id":"agentmail_list_threads","name":"List Threads","description":"List email threads in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list threads from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of threads to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"},"labels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to filter threads by"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter threads before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter threads after this ISO 8601 timestamp"}},"hostedApiKey":"none"},"agentmail_reply_message":{"id":"agentmail_reply_message","name":"Reply to Message","description":"Reply to an existing email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to reply from"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to reply to"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text reply body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML reply body"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Override recipient email addresses (comma-separated)"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC email addresses (comma-separated)"},"replyAll":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Reply to all recipients of the original message"}},"hostedApiKey":"none"},"agentmail_send_draft":{"id":"agentmail_send_draft","name":"Send Draft","description":"Send an existing email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to send"}},"hostedApiKey":"none"},"agentmail_send_message":{"id":"agentmail_send_message","name":"Send Message","description":"Send an email message from an AgentMail inbox","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to send from"},"to":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient email address (comma-separated for multiple)"},"subject":{"type":"string","required":true,"visibility":"user-or-llm","description":"Email subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text email body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML email body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"}},"hostedApiKey":"none"},"agentmail_update_draft":{"id":"agentmail_update_draft","name":"Update Draft","description":"Update an existing email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to update"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Draft subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text draft body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML draft body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"},"sendAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to schedule sending"}},"hostedApiKey":"none"},"agentmail_update_inbox":{"id":"agentmail_update_inbox","name":"Update Inbox","description":"Update the display name of an email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to update"},"displayName":{"type":"string","required":true,"visibility":"user-or-llm","description":"New display name for the inbox"}},"hostedApiKey":"none"},"agentmail_update_message":{"id":"agentmail_update_message","name":"Update Message","description":"Add or remove labels on an email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to update"},"addLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to add to the message"},"removeLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to remove from the message"}},"hostedApiKey":"none"},"agentmail_update_thread":{"id":"agentmail_update_thread","name":"Update Thread Labels","description":"Add or remove labels on an email thread in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to update"},"addLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to add to the thread"},"removeLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to remove from the thread"}},"hostedApiKey":"none"},"agentphone_create_call":{"id":"agentphone_create_call","name":"Create Outbound Call","description":"Initiate an outbound voice call from an AgentPhone agent","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"agentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Agent that will handle the call"},"toNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Phone number to call in E.164 format (e.g. +14155551234)"},"fromNumberId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Phone number ID to use as caller ID. Must belong to the agent. If omitted, the agent\'s first assigned number is used."},"initialGreeting":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optional greeting spoken when the recipient answers"},"voice":{"type":"string","required":false,"visibility":"user-or-llm","description":"Voice ID override for this call (defaults to the agent\'s configured voice)"},"systemPrompt":{"type":"string","required":false,"visibility":"user-or-llm","description":"When provided, uses a built-in LLM for the conversation instead of forwarding to your webhook"}},"hostedApiKey":"none"},"agentphone_create_contact":{"id":"agentphone_create_contact","name":"Create Contact","description":"Create a new contact in AgentPhone","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"phoneNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Phone number in E.164 format (e.g. +14155551234)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact\'s full name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Contact\'s email address"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Freeform notes stored on the contact"}},"hostedApiKey":"none"},"agentphone_create_number":{"id":"agentphone_create_number","name":"Create Phone Number","description":"Provision a new SMS- and voice-enabled phone number","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Two-letter country code (e.g. US, CA). Defaults to US."},"areaCode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Preferred area code (US/CA only, e.g. \\"415\\"). Best-effort — may be ignored if unavailable."},"agentId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optionally attach the number to an agent immediately"}},"hostedApiKey":"none"},"agentphone_delete_contact":{"id":"agentphone_delete_contact","name":"Delete Contact","description":"Delete a contact by ID","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"}},"hostedApiKey":"none"},"agentphone_get_call":{"id":"agentphone_get_call","name":"Get Call","description":"Fetch a call and its full transcript","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"callId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the call to retrieve"}},"hostedApiKey":"none"},"agentphone_get_call_transcript":{"id":"agentphone_get_call_transcript","name":"Get Call Transcript","description":"Get the full ordered transcript for a call","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"callId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the call to retrieve the transcript for"}},"hostedApiKey":"none"},"agentphone_get_contact":{"id":"agentphone_get_contact","name":"Get Contact","description":"Fetch a single contact by ID","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"}},"hostedApiKey":"none"},"agentphone_get_conversation":{"id":"agentphone_get_conversation","name":"Get Conversation","description":"Get a conversation along with its recent messages","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"messageLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of recent messages to include (default 50, max 100)"}},"hostedApiKey":"none"},"agentphone_get_conversation_messages":{"id":"agentphone_get_conversation_messages","name":"Get Conversation Messages","description":"Get paginated messages for a conversation","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of messages to return (default 50, max 200)"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received after this ISO 8601 timestamp"}},"hostedApiKey":"none"},"agentphone_get_number_messages":{"id":"agentphone_get_number_messages","name":"Get Phone Number Messages","description":"Fetch messages received on a specific phone number","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"numberId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the phone number"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of messages to return (default 50, max 200)"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received after this ISO 8601 timestamp"}},"hostedApiKey":"none"},"agentphone_get_usage":{"id":"agentphone_get_usage","name":"Get Usage","description":"Retrieve current usage statistics for the AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"}},"hostedApiKey":"none"},"agentphone_get_usage_daily":{"id":"agentphone_get_usage_daily","name":"Get Daily Usage","description":"Get a daily breakdown of usage (messages, calls, webhooks) for the last N days","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"days":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of days to return (1-365, default 30)"}},"hostedApiKey":"none"},"agentphone_get_usage_monthly":{"id":"agentphone_get_usage_monthly","name":"Get Monthly Usage","description":"Get monthly usage aggregation (messages, calls, webhooks) for the last N months","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"months":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of months to return (1-24, default 6)"}},"hostedApiKey":"none"},"agentphone_list_calls":{"id":"agentphone_list_calls","name":"List Calls","description":"List voice calls for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"},"status":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by status (completed, in-progress, failed)"},"direction":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by direction (inbound, outbound)"},"type":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by call type (pstn, web)"},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search by phone number (matches fromNumber or toNumber)"}},"hostedApiKey":"none"},"agentphone_list_contacts":{"id":"agentphone_list_contacts","name":"List Contacts","description":"List contacts for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by name or phone number (case-insensitive contains)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 50, max 200)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"hostedApiKey":"none"},"agentphone_list_conversations":{"id":"agentphone_list_conversations","name":"List Conversations","description":"List conversations (message threads) for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"hostedApiKey":"none"},"agentphone_list_numbers":{"id":"agentphone_list_numbers","name":"List Phone Numbers","description":"List all phone numbers provisioned for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"hostedApiKey":"none"},"agentphone_react_to_message":{"id":"agentphone_react_to_message","name":"React to Message","description":"Send an iMessage tapback reaction to a message (iMessage only)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to react to"},"reaction":{"type":"string","required":true,"visibility":"user-or-llm","description":"Reaction type: love, like, dislike, laugh, emphasize, or question"}},"hostedApiKey":"none"},"agentphone_release_number":{"id":"agentphone_release_number","name":"Release Phone Number","description":"Release (delete) a phone number. This action is irreversible.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"numberId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the phone number to release"}},"hostedApiKey":"none"},"agentphone_send_message":{"id":"agentphone_send_message","name":"Send Message","description":"Send an outbound SMS or iMessage from an AgentPhone agent","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"agentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Agent sending the message"},"toNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient phone number in E.164 format (e.g. +14155551234)"},"body":{"type":"string","required":true,"visibility":"user-or-llm","description":"Message text to send"},"mediaUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optional URL of an image, video, or file to attach"},"numberId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Phone number ID to send from. If omitted, the agent\'s first assigned number is used."}},"hostedApiKey":"none"},"agentphone_update_contact":{"id":"agentphone_update_contact","name":"Update Contact","description":"Update a contact\'s fields","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"},"phoneNumber":{"type":"string","required":false,"visibility":"user-or-llm","description":"New phone number in E.164 format"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New contact name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"New email address"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"New freeform notes"}},"hostedApiKey":"none"},"agentphone_update_conversation":{"id":"agentphone_update_conversation","name":"Update Conversation","description":"Update conversation metadata (stored state). Pass null to clear existing metadata.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"metadata":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom key-value metadata to store on the conversation. Pass null to clear existing metadata."}},"hostedApiKey":"none"},"agiloft_async_status":{"id":"agiloft_async_status","name":"Agiloft Async Status","description":"Check whether an asynchronous Agiloft call, such as a run action button, has completed.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table the asynchronous call was made against"},"callbackId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Callback ID returned by the asynchronous call, e.g. from Run Action Button"}},"hostedApiKey":"none"},"agiloft_attach_file":{"id":"agiloft_attach_file","name":"Agiloft Attach File","description":"Attach a file to a field in an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to attach the file to"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"file":{"type":"file","required":true,"visibility":"user-or-llm","description":"File to attach"},"fileName":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name to assign to the file (defaults to original file name)"},"overwrite":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Replace the contents of the field instead of adding another file to it"}},"hostedApiKey":"none"},"agiloft_attachment_info":{"id":"agiloft_attachment_info","name":"Agiloft Attachment Info","description":"Get information about file attachments on a record field.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to check attachments on"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field to inspect"}},"hostedApiKey":"none"},"agiloft_create_record":{"id":"agiloft_create_record","name":"Agiloft Create Record","description":"Create a new record in an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record field values as a JSON object (e.g., {\\"first_name\\": \\"John\\", \\"status\\": \\"Active\\"})"}},"hostedApiKey":"none"},"agiloft_delete_record":{"id":"agiloft_delete_record","name":"Agiloft Delete Record","description":"Delete a record from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to delete"},"substituteIds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated IDs of records that adopt the dependants of the deleted record. Read only when the delete rule is REPLACE_WITH_ANOTHER."},"deleteRule":{"type":"string","required":false,"visibility":"user-or-llm","description":"How to treat records that depend on this one: ERROR_IF_DEPENDANTS (default — fails rather than cascading), APPLY_DELETE_WHERE_POSSIBLE, DELETE_WHERE_POSSIBLE_OTHERWISE_UNLINK, APPLY_UNLINK, UNLINK_WHERE_POSSIBLE_OTHERWISE_DELETE, or REPLACE_WITH_ANOTHER"}},"hostedApiKey":"none"},"agiloft_get_choice_line_id":{"id":"agiloft_get_choice_line_id","name":"Agiloft Get Choice Line ID","description":"Resolve the internal numeric ID of a choice-list value, for use in EWSelect WHERE clauses against choice fields.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"case\\", \\"contracts\\")"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Choice field name (e.g., \\"priority\\", \\"status\\")"},"value":{"type":"string","required":true,"visibility":"user-or-llm","description":"Choice display value to resolve (e.g., \\"High\\", \\"Active\\")"}},"hostedApiKey":"none"},"agiloft_list_tables":{"id":"agiloft_list_tables","name":"Agiloft List Tables","description":"List the tables and fields in an Agiloft knowledge base, to discover the logical names other operations need.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":false,"visibility":"user-or-llm","description":"Logical name of a single table to describe (e.g., \\"contacts\\"). Leave empty to list every table in the knowledge base."},"includeLinkedInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the source table and column behind each linked field"},"skipColumnsInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Return table names only, omitting field details, for a much smaller response"}},"hostedApiKey":"none"},"agiloft_lock_record":{"id":"agiloft_lock_record","name":"Agiloft Lock Record","description":"Lock, unlock, or check the lock status of an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to lock, unlock, or check"},"lockAction":{"type":"string","required":true,"visibility":"user-or-llm","description":"Action to perform: \\"lock\\", \\"unlock\\", or \\"check\\""},"force":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Unlock only: release a lock held by another user."}},"hostedApiKey":"none"},"agiloft_nlp_search":{"id":"agiloft_nlp_search","name":"Agiloft Natural Language Search","description":"Search Agiloft records by describing what you want in plain language, such as \\"active NDAs submitted last month\\".","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"nlpQuery":{"type":"string","required":true,"visibility":"user-or-llm","description":"The request in plain language, e.g. \\"Show me open, high-priority contracts\\". Structured field filters are not accepted — use Search Records for those."},"fields":{"type":"string","required":true,"visibility":"user-or-llm","description":"Comma-separated field names to return, e.g. \\"id, contract_title1, company_name\\""},"page":{"type":"string","required":false,"visibility":"user-or-llm","description":"Page number, starting from 0"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Records per page"}},"hostedApiKey":"none"},"agiloft_read_record":{"id":"agiloft_read_record","name":"Agiloft Read Record","description":"Read a record by ID from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to read"},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of field names to include in the response"}},"hostedApiKey":"none"},"agiloft_remove_attachment":{"id":"agiloft_remove_attachment","name":"Agiloft Remove Attachment","description":"Remove an attached file from a field in an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record containing the attachment"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"position":{"type":"string","required":true,"visibility":"user-or-llm","description":"Position index of the file to remove (starting from 0)"}},"hostedApiKey":"none"},"agiloft_retrieve_attachment":{"id":"agiloft_retrieve_attachment","name":"Agiloft Retrieve Attachment","description":"Download an attached file from an Agiloft record field.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record containing the attachment"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"position":{"type":"string","required":true,"visibility":"user-or-llm","description":"Position index of the file in the field (starting from 0)"}},"hostedApiKey":"none"},"agiloft_run_action_button":{"id":"agiloft_run_action_button","name":"Agiloft Run Action Button","description":"Run an action button on an Agiloft record, such as an approval or send-for-signature step.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"case\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to run the action button on"},"actionButtonField":{"type":"string","required":true,"visibility":"user-or-llm","description":"Logical name of the field holding the action button (e.g., \\"ab_field\\")"}},"hostedApiKey":"none"},"agiloft_saved_search":{"id":"agiloft_saved_search","name":"Agiloft Saved Search","description":"List the saved searches defined for an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Logical table name to list saved searches for (e.g., \\"contract\\")"}},"hostedApiKey":"none"},"agiloft_search_records":{"id":"agiloft_search_records","name":"Agiloft Search Records","description":"Search for records in an Agiloft table using a query.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name to search in (e.g., \\"contracts\\", \\"contacts.employees\\")"},"query":{"type":"string","required":false,"visibility":"user-or-llm","description":"Ad hoc EWSearch query. Combine conditions with && (and) or || (or) and quote every value — e.g. \\"summary~=\'test\'&&priority=\'High\'\\". Required unless a saved search is given."},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Label of a saved search defined on the table (e.g., \\"C: Status is Closed\\"). Can be combined with a query to narrow it further."},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of field names to include in the results"},"page":{"type":"string","required":false,"visibility":"user-or-llm","description":"Page number for paginated results (starting from 0)"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of records to return per page. Agiloft treats 0 as \\"all records\\", so leave it unset or use a positive value to keep result sizes bounded."}},"hostedApiKey":"none"},"agiloft_select_records":{"id":"agiloft_select_records","name":"Agiloft Select Records","description":"Select record IDs matching a SQL WHERE clause from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"where":{"type":"string","required":true,"visibility":"user-or-llm","description":"SQL WHERE clause using database column names (e.g., \\"summary like \'%new%\'\\" or \\"assigned_person=\'John Doe\'\\"). EWSelect has no page size and returns every matching ID, so append a database limit such as \\"limit 0,200\\" to bound the result."}},"hostedApiKey":"none"},"agiloft_update_record":{"id":"agiloft_update_record","name":"Agiloft Update Record","description":"Update an existing record in an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to update"},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Updated field values as a JSON object (e.g., {\\"status\\": \\"Active\\", \\"priority\\": \\"High\\"})"}},"hostedApiKey":"none"},"agiloft_upsert_record":{"id":"agiloft_upsert_record","name":"Agiloft Upsert Record","description":"Create an Agiloft record, or update it when a record already matches the given fields.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"match":{"type":"string","required":true,"visibility":"user-or-llm","description":"Field used to find an existing record (e.g., \\"ext_id\\"). Pick something that identifies a record uniquely — if more than one record matches, Agiloft writes nothing and returns a conflict."},"async":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Queue the write instead of waiting for it. Returns a callback ID instead of a record ID; pass that to Async Status to poll the result."},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Field values as a JSON object. On create these populate the new record; on update only the supplied fields change."}},"hostedApiKey":"none"},"ahrefs_anchors":{"id":"ahrefs_anchors","name":"Ahrefs Anchors","description":"Get the anchor text distribution for a target domain or URL\'s backlinks, showing how many links and referring domains use each anchor text.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live), \\"all_time\\" (default, includes lost backlinks), or \\"since:YYYY-MM-DD\\" (backlinks found since a date)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_backlinks":{"id":"ahrefs_backlinks","name":"Ahrefs Backlinks","description":"Get a list of backlinks pointing to a target domain or URL. Returns details about each backlink including source URL, anchor text, and domain rating.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live backlinks), \\"all_time\\" (default, includes lost backlinks), or \\"since:YYYY-MM-DD\\" (backlinks found since a date)."},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_backlinks_stats":{"id":"ahrefs_backlinks_stats","name":"Ahrefs Backlinks Stats","description":"Get backlink and referring domain totals for a target domain or URL, both currently live and across all time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_batch_analysis":{"id":"ahrefs_batch_analysis","name":"Ahrefs Batch Analysis","description":"Get bulk SEO metrics (Domain Rating, backlinks, referring domains, organic traffic, and more) for multiple domains or URLs in a single request. Useful for comparing many competitors at once.","version":"1.0.0","params":{"targets":{"type":"string","required":true,"visibility":"user-or-llm","description":"Comma-separated list of domains or URLs to analyze. Example: \\"example.com,competitor.com\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode applied to every target: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"protocol":{"type":"string","required":false,"visibility":"user-or-llm","description":"Protocol applied to every target: \\"both\\" (default), \\"http\\", or \\"https\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_broken_backlinks":{"id":"ahrefs_broken_backlinks","name":"Ahrefs Broken Backlinks","description":"Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_domain_rating":{"id":"ahrefs_domain_rating","name":"Ahrefs Domain Rating","description":"Get the Domain Rating (DR) and Ahrefs Rank for a target domain. Domain Rating shows the strength of a website\'s backlink profile on a scale from 0 to 100.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain to analyze (e.g., example.com)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date for historical data in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_domain_rating_history":{"id":"ahrefs_domain_rating_history","name":"Ahrefs Domain Rating History","description":"Get the historical Domain Rating (DR) trend for a target domain or URL over a date range, grouped daily, weekly, or monthly.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_keyword_overview":{"id":"ahrefs_keyword_overview","name":"Ahrefs Keyword Overview","description":"Get detailed metrics for a keyword including search volume, keyword difficulty, CPC, clicks, and traffic potential.","version":"1.0.0","params":{"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The keyword to analyze"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for keyword data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_keywords_history":{"id":"ahrefs_keywords_history","name":"Ahrefs Keywords History","description":"Get the historical organic keyword ranking distribution for a target domain or URL over a date range: how many keywords rank in each position bucket at each point in time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_metrics":{"id":"ahrefs_metrics","name":"Ahrefs Metrics","description":"Get a one-call organic and paid search overview for a target domain or URL: organic traffic, organic keywords, paid traffic, paid keywords, and estimated traffic cost.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_metrics_history":{"id":"ahrefs_metrics_history","name":"Ahrefs Metrics History","description":"Get the historical organic and paid traffic trend for a target domain or URL over a date range: organic traffic/cost and paid traffic/cost at each point in time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_organic_competitors":{"id":"ahrefs_organic_competitors","name":"Ahrefs Organic Competitors","description":"Get domains that compete with a target domain or URL for the same organic keywords, ranked by keyword overlap.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_organic_keywords":{"id":"ahrefs_organic_keywords","name":"Ahrefs Organic Keywords","description":"Get organic keywords that a target domain or URL ranks for in Google search results. Returns keyword details including search volume, ranking position, and estimated traffic.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_paid_pages":{"id":"ahrefs_paid_pages","name":"Ahrefs Paid Pages","description":"Get a target domain\'s pages that receive paid search traffic, sorted by estimated paid traffic. Returns page URLs with their paid traffic, keyword counts, and estimated spend.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_rank_tracker_competitors_overview":{"id":"ahrefs_rank_tracker_competitors_overview","name":"Ahrefs Rank Tracker Competitors Overview","description":"Get competitor rankings for the keywords tracked in an Ahrefs Rank Tracker project: each tracked keyword\'s volume and difficulty alongside every competitor\'s position, traffic, and traffic value. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report rankings for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"dateCompared":{"type":"string","required":false,"visibility":"user-only","description":"Comparison date in YYYY-MM-DD format, to compute position/traffic deltas"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_rank_tracker_competitors_stats":{"id":"ahrefs_rank_tracker_competitors_stats","name":"Ahrefs Rank Tracker Competitors Stats","description":"Get aggregate competitor stats for an Ahrefs Rank Tracker project: each competitor\'s traffic, traffic value, average position, and share of voice across all tracked keywords. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report metrics for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_rank_tracker_overview":{"id":"ahrefs_rank_tracker_overview","name":"Ahrefs Rank Tracker Overview","description":"Get ranking overview metrics for the keywords tracked in an Ahrefs Rank Tracker project: position, search volume, keyword difficulty, and estimated traffic. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report rankings for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"dateCompared":{"type":"string","required":false,"visibility":"user-only","description":"Comparison date in YYYY-MM-DD format, to compute position/traffic deltas"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_rank_tracker_serp_overview":{"id":"ahrefs_rank_tracker_serp_overview","name":"Ahrefs Rank Tracker SERP Overview","description":"Get the full SERP (search engine results page) for a keyword tracked in an Ahrefs Rank Tracker project, including every ranking URL with its position, title, and authority metrics. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The tracked keyword to retrieve SERP data for"},"country":{"type":"string","required":true,"visibility":"user-or-llm","description":"Country code for the tracked keyword. Example: \\"us\\", \\"gb\\", \\"de\\""},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"topPositions":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of top organic positions to return (defaults to all available)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Timestamp to return the last available SERP Overview at, in YYYY-MM-DDThh:mm:ss format"},"locationId":{"type":"number","required":false,"visibility":"user-or-llm","description":"Location ID of the tracked keyword, if tracked at a specific location"},"languageCode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Language code of the tracked keyword"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_refdomains_history":{"id":"ahrefs_refdomains_history","name":"Ahrefs Referring Domains History","description":"Get the historical referring domains trend for a target domain or URL over a date range, grouped daily, weekly, or monthly.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_referring_domains":{"id":"ahrefs_referring_domains","name":"Ahrefs Referring Domains","description":"Get a list of domains that link to a target domain or URL. Returns unique referring domains with their domain rating, backlink counts, and discovery dates.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live), \\"all_time\\" (default, includes lost domains), or \\"since:YYYY-MM-DD\\" (domains found since a date)."},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_related_terms":{"id":"ahrefs_related_terms","name":"Ahrefs Related Terms","description":"Get keyword ideas related to a seed keyword: terms the same top-ranking pages also rank for (\\"also rank for\\") or also discuss (\\"also talk about\\"), with volume, difficulty, and CPC.","version":"1.0.0","params":{"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The seed keyword to find related terms for"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for keyword data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"terms":{"type":"string","required":false,"visibility":"user-or-llm","description":"Type of related keywords to return: \\"also_rank_for\\", \\"also_talk_about\\", or \\"all\\" (default: \\"all\\")"},"viewFor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Whether to derive related terms from the top 10 or top 100 ranking pages (default: \\"top_10\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_site_audit_page_explorer":{"id":"ahrefs_site_audit_page_explorer","name":"Ahrefs Site Audit Page Explorer","description":"Get crawled pages from an Ahrefs Site Audit project with health and SEO metrics: HTTP status, title, link counts, backlinks, indexability, and traffic. Optionally filter to pages affected by a specific issue.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Site Audit project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Crawl date in YYYY-MM-DDThh:mm:ss format (defaults to the most recent crawl)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip, for pagination"},"issueId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Only return pages affected by this issue ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"ahrefs_top_pages":{"id":"ahrefs_top_pages","name":"Ahrefs Top Pages","description":"Get the top pages of a target domain sorted by organic traffic. Returns page URLs with their traffic, keyword counts, and estimated traffic value.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"hostedApiKey":"none"},"airtable_create_records":{"id":"airtable_create_records","name":"Airtable Create Records","description":"Write new records to an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to create, each with a `fields` object"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_delete_records":{"id":"airtable_delete_records","name":"Airtable Delete Records","description":"Delete one or more records from an Airtable table by ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordIds":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of record IDs to delete (each starts with \\"rec\\", e.g., [\\"recXXXXXXXXXXXXXX\\"]). Pass a single-element array to delete one record."}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_get_base_schema":{"id":"airtable_get_base_schema","name":"Airtable Get Base Schema","description":"Get the schema of all tables, fields, and views in an Airtable base","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_get_record":{"id":"airtable_get_record","name":"Airtable Get Record","description":"Retrieve a single record from an Airtable table by its ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record ID to retrieve (starts with \\"rec\\", e.g., \\"recXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_bases":{"id":"airtable_list_bases","name":"Airtable List Bases","description":"List all bases the authenticated user has access to","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"offset":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination offset for retrieving additional bases"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_records":{"id":"airtable_list_records","name":"Airtable List Records","description":"Read records from an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"maxRecords":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of records to return (default: all records)"},"filterFormula":{"type":"string","required":false,"visibility":"user-or-llm","description":"Formula to filter records (e.g., \\"({Field Name} = \'Value\')\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_tables":{"id":"airtable_list_tables","name":"Airtable List Tables","description":"List all tables and their schema in an Airtable base","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_update_multiple_records":{"id":"airtable_update_multiple_records","name":"Airtable Update Multiple Records","description":"Update multiple existing records in an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to update, each with an `id` and a `fields` object"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_update_record":{"id":"airtable_update_record","name":"Airtable Update Record","description":"Update an existing record in an Airtable table by ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record ID to update (starts with \\"rec\\", e.g., \\"recXXXXXXXXXXXXXX\\")"},"fields":{"type":"json","required":true,"visibility":"user-or-llm","description":"An object containing the field names and their new values"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_upsert_records":{"id":"airtable_upsert_records","name":"Airtable Upsert Records","description":"Update existing records or create new ones in an Airtable table, matching on the specified merge fields","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to upsert, each with a `fields` object"},"fieldsToMergeOn":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of field names used to match existing records (max 3). A record is updated when all merge fields match, otherwise it is created. Example: [\\"Name\\"]"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"algolia_add_record":{"id":"algolia_add_record","name":"Algolia Add Record","description":"Add or replace a record in an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":false,"visibility":"user-or-llm","description":"Object ID for the record (auto-generated if not provided)"},"record":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object representing the record to add"}},"hostedApiKey":"none"},"algolia_batch_operations":{"id":"algolia_batch_operations","name":"Algolia Batch Operations","description":"Perform batch add, update, partial update, or delete operations on records in an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"requests":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of batch operations. Each item has \\"action\\" (addObject, updateObject, partialUpdateObject, partialUpdateObjectNoCreate, deleteObject, delete, clear) and \\"body\\" (the record data; must include objectID for update/delete; use an empty object {} for the index-level delete/clear actions)"}},"hostedApiKey":"none"},"algolia_browse_records":{"id":"algolia_browse_records","name":"Algolia Browse Records","description":"Browse and iterate over all records in an Algolia index using cursor pagination","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key (must have browse ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to browse"},"query":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search query to filter browsed records"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter string to narrow down results"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of hits per page (default: 1000, max: 1000)"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous browse response for pagination"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search"}},"hostedApiKey":"none"},"algolia_clear_records":{"id":"algolia_clear_records","name":"Algolia Clear Records","description":"Clear all records from an Algolia index while keeping settings, synonyms, and rules","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to clear"}},"hostedApiKey":"none"},"algolia_copy_move_index":{"id":"algolia_copy_move_index","name":"Algolia Copy/Move Index","description":"Copy or move an Algolia index to a new destination","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the source index"},"operation":{"type":"string","required":true,"visibility":"user-or-llm","description":"Operation to perform: \\"copy\\" or \\"move\\""},"destination":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the destination index"},"scope":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of scopes to copy (only for \\"copy\\" operation): [\\"settings\\", \\"synonyms\\", \\"rules\\"]. Omit to copy everything including records."}},"hostedApiKey":"none"},"algolia_delete_by_filter":{"id":"algolia_delete_by_filter","name":"Algolia Delete By Filter","description":"Delete all records matching a filter from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter expression to match records for deletion (e.g., \\"category:outdated\\")"},"facetFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of facet filters (e.g., [\\"brand:Acme\\"])"},"numericFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of numeric filters (e.g., [\\"price > 100\\"])"},"tagFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of tag filters using the _tags attribute (e.g., [\\"published\\"])"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search filter (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search filter"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search filter"}},"hostedApiKey":"none"},"algolia_delete_index":{"id":"algolia_delete_index","name":"Algolia Delete Index","description":"Delete an entire Algolia index and all its records","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to delete"}},"hostedApiKey":"none"},"algolia_delete_record":{"id":"algolia_delete_record","name":"Algolia Delete Record","description":"Delete a record by objectID from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to delete"}},"hostedApiKey":"none"},"algolia_get_record":{"id":"algolia_get_record","name":"Algolia Get Record","description":"Get a record by objectID from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to retrieve"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"}},"hostedApiKey":"none"},"algolia_get_records":{"id":"algolia_get_records","name":"Algolia Get Records","description":"Retrieve multiple records by objectID from one or more Algolia indices","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Default index name for all requests"},"requests":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of objects specifying records to retrieve. Each must have \\"objectID\\" and optionally \\"indexName\\" and \\"attributesToRetrieve\\"."}},"hostedApiKey":"none"},"algolia_get_settings":{"id":"algolia_get_settings","name":"Algolia Get Settings","description":"Retrieve the settings of an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"}},"hostedApiKey":"none"},"algolia_get_task_status":{"id":"algolia_get_task_status","name":"Algolia Get Task Status","description":"Check whether an Algolia indexing task has finished publishing","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index the task ran against"},"taskID":{"type":"number","required":true,"visibility":"user-or-llm","description":"The taskID returned by a previous write operation"}},"hostedApiKey":"none"},"algolia_list_indices":{"id":"algolia_list_indices","name":"Algolia List Indices","description":"List all indices in an Algolia application","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for paginating indices (default: not paginated)"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of indices per page (default: 100)"}},"hostedApiKey":"none"},"algolia_partial_update_record":{"id":"algolia_partial_update_record","name":"Algolia Partial Update Record","description":"Partially update a record in an Algolia index without replacing it entirely","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to update"},"attributes":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object with attributes to update. Supports built-in operations like {\\"stock\\": {\\"_operation\\": \\"Decrement\\", \\"value\\": 1}}"},"createIfNotExists":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to create the record if it does not exist (default: true)"}},"hostedApiKey":"none"},"algolia_search":{"id":"algolia_search","name":"Algolia Search","description":"Search an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to search"},"query":{"type":"string","required":true,"visibility":"user-or-llm","description":"Search query text"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of hits per page (default: 20)"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number to retrieve (default: 0)"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter string (e.g., \\"category:electronics AND price < 100\\")"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"},"facets":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of facet attribute names to retrieve counts for (use \\"*\\" for all)"},"getRankingInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to include detailed ranking information in each hit"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search"}},"hostedApiKey":"none"},"algolia_update_settings":{"id":"algolia_update_settings","name":"Algolia Update Settings","description":"Update the settings of an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have editSettings ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"settings":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object with settings to update (e.g., {\\"searchableAttributes\\": [\\"name\\", \\"description\\"], \\"customRanking\\": [\\"desc(popularity)\\"]})"},"forwardToReplicas":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to apply changes to replica indices (default: false)"}},"hostedApiKey":"none"},"amplitude_event_segmentation":{"id":"amplitude_event_segmentation","name":"Amplitude Event Segmentation","description":"Query event analytics data with segmentation. Get event counts, uniques, averages, and more.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"eventType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Event type name to analyze"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric type: uniques, totals, pct_dau, average, histogram, sums, value_avg, or formula (default: uniques)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by (prefix custom user properties with \\"gp:\\")"},"groupBy2":{"type":"string","required":false,"visibility":"user-or-llm","description":"Second property name to group by (prefix custom user properties with \\"gp:\\")"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of group-by values (max 1000)"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON array of filter objects applied to the event, e.g. [{\\"subprop_type\\":\\"event\\",\\"subprop_key\\":\\"city\\",\\"subprop_op\\":\\"is\\",\\"subprop_value\\":[\\"San Francisco\\"]}]"},"formula":{"type":"string","required":false,"visibility":"user-or-llm","description":"Required when metric is \\"formula\\", e.g. \\"UNIQUES(A)/UNIQUES(B)\\""},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_funnels":{"id":"amplitude_funnels","name":"Amplitude Funnels","description":"Analyze conversion rates and drop-off between a sequence of events.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"events":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON array of event objects, one per funnel step in order, e.g. [{\\"event_type\\":\\"signup\\"},{\\"event_type\\":\\"purchase\\"}]"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Funnel ordering: \\"ordered\\", \\"unordered\\", or \\"sequential\\" (default: ordered)"},"userType":{"type":"string","required":false,"visibility":"user-or-llm","description":"User type: \\"new\\" or \\"active\\" (default: active)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: -300000 (real-time), -3600000 (hourly), 1 (daily), 7 (weekly), or 30 (monthly)"},"conversionWindowSeconds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Conversion window in seconds (default: 2592000, i.e. 30 days)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property to group by (limit: one; prefix custom properties with \\"gp:\\")"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of group-by values (default: 100, max: 1000)"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_get_active_users":{"id":"amplitude_get_active_users","name":"Amplitude Get Active Users","description":"Get active or new user counts over a date range from the Dashboard REST API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric type: \\"active\\" or \\"new\\" (default: active)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_get_revenue":{"id":"amplitude_get_revenue","name":"Amplitude Get Revenue","description":"Get revenue LTV data including ARPU, ARPPU, total revenue, and paying user counts.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric: 0 (ARPU), 1 (ARPPU), 2 (Total Revenue), 3 (Paying Users)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by (limit: one)"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_group_identify":{"id":"amplitude_group_identify","name":"Amplitude Group Identify","description":"Set group-level properties in Amplitude. Supports $set, $setOnce, $add, $append, $unset operations.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"groupType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Group classification (e.g., \\"company\\", \\"org_id\\")"},"groupValue":{"type":"string","required":true,"visibility":"user-or-llm","description":"Specific group identifier (e.g., \\"Acme Corp\\")"},"groupProperties":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON object of group properties. Use operations like $set, $setOnce, $add, $append, $unset."},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_identify_user":{"id":"amplitude_identify_user","name":"Amplitude Identify User","description":"Set user properties in Amplitude using the Identify API. Supports $set, $setOnce, $add, $append, $unset operations.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"User ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"userProperties":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON object of user properties. Use operations like $set, $setOnce, $add, $append, $unset."},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_list_events":{"id":"amplitude_list_events","name":"Amplitude List Events","description":"List all event types in the Amplitude project with their weekly totals and unique counts.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_realtime_active_users":{"id":"amplitude_realtime_active_users","name":"Amplitude Real-time Active Users","description":"Get real-time active user counts at 5-minute granularity for the last 2 days.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_retention":{"id":"amplitude_retention","name":"Amplitude Retention","description":"Measure how many users return to perform an action after a starting action.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"startEvent":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON starting event object, e.g. {\\"event_type\\":\\"_new\\"} or {\\"event_type\\":\\"_active\\"}"},"returnEvent":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON returning event object, e.g. {\\"event_type\\":\\"_all\\"} or {\\"event_type\\":\\"_active\\"}"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"retentionMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Retention type: \\"bracket\\", \\"rolling\\", or \\"n-day\\" (default: n-day)"},"retentionBrackets":{"type":"string","required":false,"visibility":"user-or-llm","description":"Required when Retention Mode is \\"bracket\\". Day ranges, e.g. [[0,4]]"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property to group by (limit: one; prefix custom properties with \\"gp:\\")"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_send_event":{"id":"amplitude_send_event","name":"Amplitude Send Event","description":"Track an event in Amplitude using the HTTP V2 API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"User ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"eventType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the event (e.g., \\"page_view\\", \\"purchase\\")"},"eventProperties":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON object of custom event properties"},"userProperties":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON object of user properties to set (supports $set, $setOnce, $add, $append, $unset)"},"time":{"type":"string","required":false,"visibility":"user-or-llm","description":"Event timestamp in milliseconds since epoch"},"sessionId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Session start time in milliseconds since epoch"},"insertId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Unique ID for deduplication (within 7-day window)"},"appVersion":{"type":"string","required":false,"visibility":"user-or-llm","description":"Application version string"},"platform":{"type":"string","required":false,"visibility":"user-or-llm","description":"Platform (e.g., \\"Web\\", \\"iOS\\", \\"Android\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Two-letter country code"},"language":{"type":"string","required":false,"visibility":"user-or-llm","description":"Language code (e.g., \\"en\\")"},"ip":{"type":"string","required":false,"visibility":"user-or-llm","description":"IP address for geo-location"},"price":{"type":"string","required":false,"visibility":"user-or-llm","description":"Price of the item purchased"},"quantity":{"type":"string","required":false,"visibility":"user-or-llm","description":"Quantity of items purchased"},"revenue":{"type":"string","required":false,"visibility":"user-or-llm","description":"Revenue amount"},"productId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Product identifier"},"revenueType":{"type":"string","required":false,"visibility":"user-or-llm","description":"Revenue type (e.g., \\"purchase\\", \\"refund\\")"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_user_activity":{"id":"amplitude_user_activity","name":"Amplitude User Activity","description":"Get the event stream for a specific user by their Amplitude ID.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"amplitudeId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Amplitude internal user ID"},"offset":{"type":"string","required":false,"visibility":"user-or-llm","description":"Offset for pagination (default 0)"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of events to return (default 1000, max 1000)"},"direction":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort direction: \\"latest\\" or \\"earliest\\" (default: latest)"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"amplitude_user_profile":{"id":"amplitude_user_profile","name":"Amplitude User Profile","description":"Get a user profile including properties, cohort memberships, and computed properties. Not available for EU data-residency projects.","version":"1.0.0","params":{"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"External user ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"getAmpProps":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include Amplitude user properties (true/false, default: false)"},"getCohortIds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include cohort IDs the user belongs to (true/false, default: false)"},"getComputations":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include computed user properties (true/false, default: false)"}},"hostedApiKey":"none"},"amplitude_user_search":{"id":"amplitude_user_search","name":"Amplitude User Search","description":"Search for a user by User ID, Device ID, or Amplitude ID using the Dashboard REST API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"user":{"type":"string","required":true,"visibility":"user-or-llm","description":"User ID, Device ID, or Amplitude ID to search for"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"hostedApiKey":"none"},"apify_get_dataset_items":{"id":"apify_get_dataset_items","name":"APIFY Get Dataset Items","description":"Retrieve items stored in an APIFY dataset","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"datasetId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Dataset ID to read items from. Example: \\"9RnD3Pql2vGZkc5H5\\""},"itemLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Max items to return (1-250000). Default: all items. Example: 500"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to skip at the start. Default: 0"},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of fields to include. Example: \\"title,url,price\\""}},"hostedApiKey":"none"},"apify_get_run":{"id":"apify_get_run","name":"APIFY Get Run","description":"Get the status and details of an APIFY actor run","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"runId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor run ID to fetch. Example: \\"HG7ML7M8z78YcAPEB\\""}},"hostedApiKey":"none"},"apify_run_actor_async":{"id":"apify_run_actor_async","name":"APIFY Run Actor (Async)","description":"Start an APIFY Actor run and poll it within the same workflow step until completion or the polling deadline","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"actorId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor ID or username/actor-name. Examples: \\"apify/web-scraper\\", \\"janedoe/my-actor\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor input as JSON string. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ], \\"maxPages\\": 10 }"},"waitForFinish":{"type":"number","required":false,"visibility":"user-or-llm","description":"Initial wait time in seconds (0-60) before polling starts. Example: 30"},"itemLimit":{"type":"number","required":false,"default":100,"visibility":"user-or-llm","description":"Max dataset items to fetch (1-250000). Default: 100. Example: 500"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the actor run (128-32768). Example: 1024 for 1GB, 2048 for 2GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the actor run. Example: 300 for 5 minutes, 3600 for 1 hour"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\", \\"build-tag-name\\""}},"hostedApiKey":"none"},"apify_run_actor_sync":{"id":"apify_run_actor_sync","name":"APIFY Run Actor (Sync)","description":"Run an APIFY actor synchronously and get results (max 5 minutes)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"actorId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor ID or username/actor-name. Examples: \\"apify/web-scraper\\", \\"janedoe/my-actor\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor input as JSON string. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ], \\"maxPages\\": 10 }"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the actor run (128-32768). Example: 1024 for 1GB, 2048 for 2GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the actor run. Example: 300 for 5 minutes, 3600 for 1 hour"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\", \\"build-tag-name\\""}},"hostedApiKey":"none"},"apify_run_task":{"id":"apify_run_task","name":"APIFY Run Task","description":"Run a saved APIFY actor task synchronously and get dataset items (max 5 minutes)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task ID or username/task-name. Examples: \\"janedoe/my-task\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON string that overrides the task\'s saved input. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ] }"},"itemLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Max dataset items to return (1-250000). Example: 500"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the run (128-32768). Example: 1024 for 1GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the run. Example: 300 for 5 minutes"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\""}},"hostedApiKey":"none"},"apollo_account_bulk_create":{"id":"apollo_account_bulk_create","name":"Apollo Bulk Create Accounts","description":"Create up to 100 accounts at once in your Apollo database. Set run_dedupe=true to deduplicate by domain, organization_id, and name. Master key required.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"accounts":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of accounts to create (max 100). Each account should include a name, and may optionally include domain, phone, phone_status_cd, raw_address, owner_id, linkedin_url, facebook_url, twitter_url, salesforce_id, and hubspot_id."},"append_label_names":{"type":"array","required":false,"visibility":"user-only","description":"Array of label names to add to ALL accounts in this request"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, performs aggressive deduplication by domain, organization_id, and name (defaults to false)"}},"hostedApiKey":"none"},"apollo_account_bulk_update":{"id":"apollo_account_bulk_update","name":"Apollo Bulk Update Accounts","description":"Update up to 1000 existing accounts at once in your Apollo database (higher limit than contacts!). Each account must include an id field. Master key required.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"account_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of account IDs to update with the same values (max 1000). Use with name/owner_id for uniform updates. Use either this OR account_attributes."},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this name to all accounts"},"owner_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this owner to all accounts"},"account_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this account stage to all accounts"},"account_attributes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of account objects with individual updates (each must include id). Example: [{\\"id\\": \\"acc1\\", \\"name\\": \\"Acme\\", \\"owner_id\\": \\"u1\\", \\"account_stage_id\\": \\"s1\\", \\"typed_custom_fields\\": {\\"field_id\\": \\"value\\"}}]"},"async":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, processes the update asynchronously. Only supported when using account_ids; returns 422 if used with account_attributes."}},"hostedApiKey":"none"},"apollo_account_create":{"id":"apollo_account_create","name":"Apollo Create Account","description":"Create a new account (company) in your Apollo database","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Company name (e.g., \\"Acme Corporation\\")"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain without www. prefix (e.g., \\"acme.com\\")"},"phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number for the account"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo user ID of the account owner"},"account_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo ID for the account stage to assign this account to"},"raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate location (e.g., \\"San Francisco, CA, USA\\")"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"hostedApiKey":"none"},"apollo_account_search":{"id":"apollo_account_search","name":"Apollo Search Accounts","description":"Search your team\'s accounts in Apollo. Display limit: 50,000 records (100 records per page, 500 pages max). Use filters to narrow results. Master key required.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"q_organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter accounts by organization name (partial-match search)"},"account_stage_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by account stage IDs"},"account_label_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by account label IDs"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"account_last_activity_date\\", \\"account_created_at\\", or \\"account_updated_at\\""},"sort_ascending":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Sort ascending when true. Defaults to descending."},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_account_update":{"id":"apollo_account_update","name":"Apollo Update Account","description":"Update an existing account in your Apollo database","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"account_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the account to update (e.g., \\"acc_abc123\\")"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company name (e.g., \\"Acme Corporation\\")"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain (e.g., \\"acme.com\\")"},"phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company phone number"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo user ID of the account owner"},"account_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo ID for the account stage to assign this account to"},"raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate location (e.g., \\"San Francisco, CA, USA\\")"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"hostedApiKey":"none"},"apollo_contact_bulk_create":{"id":"apollo_contact_bulk_create","name":"Apollo Bulk Create Contacts","description":"Create up to 100 contacts at once in your Apollo database. Supports deduplication to prevent creating duplicate contacts. Master key required.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"contacts":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of contacts to create (max 100). Each contact may include first_name, last_name, email, title, organization_name, account_id, owner_id, contact_stage_id, linkedin_url, phone (single string) or phone_numbers (array of {raw_number, position}), contact_emails, typed_custom_fields, and CRM IDs (salesforce_contact_id, hubspot_id, team_id) for cross-system matching"},"append_label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Label names to add to all contacts in this request (e.g., [\\"Hot Lead\\"])"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-only","description":"Enable deduplication to prevent creating duplicate contacts. When true, existing contacts are returned without modification"}},"hostedApiKey":"none"},"apollo_contact_bulk_update":{"id":"apollo_contact_bulk_update","name":"Apollo Bulk Update Contacts","description":"Update up to 100 existing contacts at once in your Apollo database. Each contact must include an id field. Master key required.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"contact_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of contact IDs to update. Must be paired with an object-form contact_attributes specifying the fields to apply uniformly to all listed contacts."},"contact_attributes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Required. Either an array of per-contact updates (each with id) — used standalone — or a single object of attributes to apply to all contact_ids. Supported fields: owner_id, email, organization_name, title, first_name, last_name, account_id, present_raw_address, linkedin_url, typed_custom_fields"},"async":{"type":"boolean","required":false,"visibility":"user-only","description":"Force asynchronous processing. Automatically enabled for >100 contacts"}},"hostedApiKey":"none"},"apollo_contact_create":{"id":"apollo_contact_create","name":"Apollo Create Contact","description":"Create a new contact in your Apollo database","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"first_name":{"type":"string","required":true,"visibility":"user-or-llm","description":"First name of the contact"},"last_name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Last name of the contact"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address of the contact"},"title":{"type":"string","required":false,"visibility":"user-or-llm","description":"Job title (e.g., \\"VP of Sales\\", \\"Software Engineer\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo account ID to associate with (e.g., \\"acc_abc123\\")"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the contact owner (accepted by Apollo but not officially documented for POST /contacts)"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the contact\'s employer (e.g., \\"Apollo\\")"},"website_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate website URL (e.g., \\"https://www.apollo.io/\\")"},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Lists/labels to add the contact to (e.g., [\\"Prospects\\"])"},"contact_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the contact stage"},"present_raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal location for the contact (e.g., \\"Atlanta, United States\\")"},"direct_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number"},"corporate_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Work/office phone number"},"mobile_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Mobile phone number"},"home_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Home phone number"},"other_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Alternative phone number"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom field values keyed by custom field ID"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, Apollo deduplicates against existing contacts"}},"hostedApiKey":"none"},"apollo_contact_search":{"id":"apollo_contact_search","name":"Apollo Search Contacts","description":"Search your team\'s contacts in Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"q_keywords":{"type":"string","required":false,"visibility":"user-or-llm","description":"Keywords to search for"},"contact_stage_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by contact stage IDs"},"contact_label_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by Apollo label IDs (lists)"},"sort_by_field":{"type":"string","required":false,"visibility":"user-only","description":"Sort field: contact_last_activity_date, contact_email_last_opened_at, contact_email_last_clicked_at, contact_created_at, or contact_updated_at"},"sort_ascending":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, sort ascending. Must be used together with sort_by_field"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_contact_update":{"id":"apollo_contact_update","name":"Apollo Update Contact","description":"Update an existing contact in your Apollo database","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"contact_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the contact to update (e.g., \\"con_abc123\\")"},"first_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"First name of the contact"},"last_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Last name of the contact"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address"},"title":{"type":"string","required":false,"visibility":"user-or-llm","description":"Job title (e.g., \\"VP of Sales\\", \\"Software Engineer\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo account ID (e.g., \\"acc_abc123\\")"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the contact owner (accepted by Apollo but not officially documented for PATCH /contacts/{id})"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the contact\'s employer (e.g., \\"Apollo\\")"},"website_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate website URL (e.g., \\"https://www.apollo.io/\\")"},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Lists/labels to add the contact to (e.g., [\\"Prospects\\"])"},"contact_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the contact stage"},"present_raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal location for the contact (e.g., \\"Atlanta, United States\\")"},"direct_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number"},"corporate_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Work/office phone number"},"mobile_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Mobile phone number"},"home_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Home phone number"},"other_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Alternative phone number"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom field values keyed by custom field ID"}},"hostedApiKey":"none"},"apollo_email_accounts":{"id":"apollo_email_accounts","name":"Apollo Get Email Accounts","description":"Get list of team\'s linked email accounts in Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"}},"hostedApiKey":"none"},"apollo_opportunity_create":{"id":"apollo_opportunity_create","name":"Apollo Create Opportunity","description":"Create a new deal for an account in your Apollo database (master key required)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the opportunity/deal (e.g., \\"Enterprise License - Q1\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"ID of the account this opportunity belongs to (e.g., \\"acc_abc123\\")"},"amount":{"type":"string","required":false,"visibility":"user-or-llm","description":"Monetary value as a plain number string with no commas or currency symbols"},"opportunity_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the opportunity stage"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the opportunity owner"},"closed_date":{"type":"string","required":false,"visibility":"user-or-llm","description":"Expected close date in YYYY-MM-DD format"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"hostedApiKey":"none"},"apollo_opportunity_get":{"id":"apollo_opportunity_get","name":"Apollo Get Opportunity","description":"Retrieve complete details of a specific deal/opportunity by ID","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"opportunity_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the opportunity to retrieve (e.g., \\"opp_abc123\\")"}},"hostedApiKey":"none"},"apollo_opportunity_search":{"id":"apollo_opportunity_search","name":"Apollo Search Opportunities","description":"Search and list all deals/opportunities in your team\'s Apollo account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"amount\\", \\"is_closed\\", or \\"is_won\\""},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_opportunity_update":{"id":"apollo_opportunity_update","name":"Apollo Update Opportunity","description":"Update an existing deal/opportunity in your Apollo database","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"opportunity_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the opportunity to update (e.g., \\"opp_abc123\\")"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the opportunity/deal (e.g., \\"Enterprise License - Q1\\")"},"amount":{"type":"string","required":false,"visibility":"user-or-llm","description":"Monetary value as a plain number string with no commas or currency symbols"},"opportunity_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the opportunity stage"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the opportunity owner"},"closed_date":{"type":"string","required":false,"visibility":"user-or-llm","description":"Expected close date in YYYY-MM-DD format"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"hostedApiKey":"none"},"apollo_organization_bulk_enrich":{"id":"apollo_organization_bulk_enrich","name":"Apollo Bulk Organization Enrichment","description":"Enrich data for up to 10 organizations at once using Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"domains":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of company domains to enrich (max 10, no www. or @, e.g., [\\"apollo.io\\", \\"stripe.com\\"])"}},"hostedApiKey":"none"},"apollo_organization_enrich":{"id":"apollo_organization_enrich","name":"Apollo Organization Enrichment","description":"Enrich data for a single organization using Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"domain":{"type":"string","required":true,"visibility":"user-or-llm","description":"Company domain (e.g., \\"apollo.io\\", \\"acme.com\\")"}},"hostedApiKey":"none"},"apollo_organization_search":{"id":"apollo_organization_search","name":"Apollo Organization Search","description":"Search Apollo\'s database for companies using filters","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"organization_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Company HQ locations (cities, US states, or countries)"},"organization_not_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Exclude companies whose HQ is in these locations"},"organization_num_employees_ranges":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employee count ranges as \\"min,max\\" strings (e.g., [\\"1,10\\", \\"250,500\\", \\"10000,20000\\"])"},"q_organization_keyword_tags":{"type":"array","required":false,"visibility":"user-or-llm","description":"Industry or keyword tags"},"q_organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Organization name to search for (e.g., \\"Acme\\", \\"TechCorp\\")"},"organization_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Apollo organization IDs to include (e.g., [\\"5e66b6381e05b4008c8331b8\\"])"},"q_organization_domains_list":{"type":"array","required":false,"visibility":"user-or-llm","description":"Domain names to filter by (no www. or @, up to 1,000)"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_people_bulk_enrich":{"id":"apollo_people_bulk_enrich","name":"Apollo Bulk People Enrichment","description":"Enrich data for up to 10 people at once using Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"people":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of people to enrich (max 10)"},"reveal_personal_emails":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal personal email addresses (uses credits)"},"reveal_phone_number":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal phone numbers (uses credits, requires webhook_url)"},"webhook_url":{"type":"string","required":false,"visibility":"user-only","description":"Webhook URL for async phone number delivery (required when reveal_phone_number is true)"}},"hostedApiKey":"none"},"apollo_people_enrich":{"id":"apollo_people_enrich","name":"Apollo People Enrichment","description":"Enrich data for a single person using Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"first_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"First name of the person"},"last_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Last name of the person"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Full name of the person (alternative to first_name/last_name)"},"id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the person"},"hashed_email":{"type":"string","required":false,"visibility":"user-or-llm","description":"MD5 or SHA-256 hashed email"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address of the person"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company name where the person works"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain (e.g., \\"apollo.io\\", \\"acme.com\\")"},"linkedin_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"LinkedIn profile URL"},"reveal_personal_emails":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal personal email addresses (uses credits)"},"reveal_phone_number":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal phone numbers (uses credits, requires webhook_url)"},"webhook_url":{"type":"string","required":false,"visibility":"user-only","description":"Webhook URL for async phone number delivery (required when reveal_phone_number is true)"}},"hostedApiKey":"none"},"apollo_people_search":{"id":"apollo_people_search","name":"Apollo People Search","description":"Search Apollo\'s database for people using demographic filters","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"person_titles":{"type":"array","required":false,"visibility":"user-or-llm","description":"Job titles to search for (e.g., [\\"CEO\\", \\"VP of Sales\\"])"},"include_similar_titles":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to return people with job titles similar to person_titles"},"person_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Locations to search in (e.g., [\\"San Francisco, CA\\", \\"New York, NY\\"])"},"person_seniorities":{"type":"array","required":false,"visibility":"user-or-llm","description":"Seniority levels (one of: owner, founder, c_suite, partner, vp, head, director, manager, senior, entry, intern)"},"organization_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Apollo organization IDs to filter by (e.g., [\\"5e66b6381e05b4008c8331b8\\"])"},"organization_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Company names to search within (legacy filter)"},"organization_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Headquarters locations of the people\'s current employer (e.g., [\'texas\', \'tokyo\', \'spain\'])"},"q_organization_domains_list":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employer domain names (e.g., [\\"apollo.io\\", \\"microsoft.com\\"]) — up to 1,000, no www. or @"},"organization_num_employees_ranges":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employee count ranges for the person\'s current employer. Each entry is \\"min,max\\" (e.g., [\\"1,10\\", \\"250,500\\", \\"10000,20000\\"])"},"contact_email_status":{"type":"array","required":false,"visibility":"user-or-llm","description":"Email statuses to filter by: \\"verified\\", \\"unverified\\", \\"likely to engage\\", \\"unavailable\\""},"q_keywords":{"type":"string","required":false,"visibility":"user-or-llm","description":"Keywords to search for"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination, default 1 (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, default 25, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_sequence_add_contacts":{"id":"apollo_sequence_add_contacts","name":"Apollo Add Contacts to Sequence","description":"Add contacts to an Apollo sequence","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"sequence_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the sequence to add contacts to (e.g., \\"seq_abc123\\")"},"contact_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of contact IDs to add to the sequence (e.g., [\\"con_abc123\\", \\"con_def456\\"]). Either contact_ids or label_names must be provided."},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of label names to identify contacts to add to the sequence. Either contact_ids or label_names must be provided."},"send_email_from_email_account_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the email account to send from. Use the Get Email Accounts operation to look this up."},"send_email_from_email_address":{"type":"string","required":false,"visibility":"user-only","description":"Specific email address to send from within the email account."},"sequence_no_email":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if they have no email address"},"sequence_unverified_email":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts with unverified email addresses"},"sequence_job_change":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts who recently changed jobs"},"sequence_active_in_other_campaigns":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts active in other campaigns"},"sequence_finished_in_other_campaigns":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts who finished other campaigns"},"sequence_same_company_in_same_campaign":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if others from the same company are in the sequence"},"contacts_without_ownership_permission":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts without ownership permission"},"add_if_in_queue":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if they are in the queue"},"contact_verification_skipped":{"type":"boolean","required":false,"visibility":"user-only","description":"Skip contact verification when adding"},"user_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the user performing the action"},"status":{"type":"string","required":false,"visibility":"user-only","description":"Initial status for added contacts: \\"active\\" or \\"paused\\""},"auto_unpause_at":{"type":"string","required":false,"visibility":"user-only","description":"ISO 8601 datetime to automatically unpause contacts"}},"hostedApiKey":"none"},"apollo_sequence_search":{"id":"apollo_sequence_search","name":"Apollo Search Sequences","description":"Search for sequences/campaigns in your team\'s Apollo account (master key required)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"q_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search sequences by name (e.g., \\"Outbound Q1\\", \\"Follow-up\\")"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"apollo_task_create":{"id":"apollo_task_create","name":"Apollo Create Task","description":"Create one or more tasks in Apollo (one task per contact_id, master key required)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"user_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the Apollo user the task is assigned to"},"contact_ids":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of contact IDs. One task is created per contact."},"priority":{"type":"string","required":false,"visibility":"user-or-llm","description":"Task priority: \\"high\\", \\"medium\\", or \\"low\\" (defaults to \\"medium\\")"},"due_at":{"type":"string","required":true,"visibility":"user-or-llm","description":"Due date/time in ISO 8601 format (e.g., \\"2024-12-31T23:59:59Z\\")"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task type: \\"call\\", \\"outreach_manual_email\\", \\"linkedin_step_connect\\", \\"linkedin_step_message\\", \\"linkedin_step_view_profile\\", \\"linkedin_step_interact_post\\", or \\"action_item\\""},"status":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task status: \\"scheduled\\", \\"completed\\", or \\"skipped\\""},"note":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-form note providing context for the task"}},"hostedApiKey":"none"},"apollo_task_search":{"id":"apollo_task_search","name":"Apollo Search Tasks","description":"Search for tasks in Apollo","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"task_due_at\\" or \\"task_priority\\""},"open_factor_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Filter by status. Common values: [\\"task_types\\"] for open tasks, [\\"task_completed_at\\"] for completed tasks."},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"hostedApiKey":"none"},"appconfig_create_application":{"id":"appconfig_create_application","name":"AppConfig Create Application","description":"Create an application in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the application to create"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the application"}},"hostedApiKey":"none"},"appconfig_create_configuration_profile":{"id":"appconfig_create_configuration_profile","name":"AppConfig Create Configuration Profile","description":"Create a configuration profile in an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to create the configuration profile in"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the configuration profile"},"locationUri":{"type":"string","required":true,"visibility":"user-or-llm","description":"Where the configuration is stored. Use \\"hosted\\" for AppConfig-hosted configurations, or an SSM/S3 URI"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the configuration profile"},"retrievalRoleArn":{"type":"string","required":false,"visibility":"user-or-llm","description":"ARN of an IAM role to retrieve the configuration (required for non-hosted URIs)"},"type":{"type":"string","required":false,"visibility":"user-or-llm","description":"Profile type: AWS.Freeform (default) or AWS.AppConfig.FeatureFlags"}},"hostedApiKey":"none"},"appconfig_create_environment":{"id":"appconfig_create_environment","name":"AppConfig Create Environment","description":"Create an environment for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to create the environment in"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the environment to create"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the environment"}},"hostedApiKey":"none"},"appconfig_create_hosted_configuration_version":{"id":"appconfig_create_hosted_configuration_version","name":"AppConfig Create Hosted Configuration Version","description":"Create a new hosted configuration version for an AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to add the version to"},"content":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration content (e.g., a JSON or YAML document)"},"contentType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Content type of the configuration (e.g., application/json, text/plain)"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the configuration version"},"latestVersionNumber":{"type":"number","required":false,"visibility":"user-or-llm","description":"The version number of the latest version, used for optimistic concurrency"},"versionLabel":{"type":"string","required":false,"visibility":"user-or-llm","description":"A user-defined label for the configuration version"}},"hostedApiKey":"none"},"appconfig_delete_application":{"id":"appconfig_delete_application","name":"AppConfig Delete Application","description":"Delete an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to delete"}},"hostedApiKey":"none"},"appconfig_delete_configuration_profile":{"id":"appconfig_delete_configuration_profile","name":"AppConfig Delete Configuration Profile","description":"Delete an AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to delete"}},"hostedApiKey":"none"},"appconfig_delete_environment":{"id":"appconfig_delete_environment","name":"AppConfig Delete Environment","description":"Delete an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to delete"}},"hostedApiKey":"none"},"appconfig_delete_hosted_configuration_version":{"id":"appconfig_delete_hosted_configuration_version","name":"AppConfig Delete Hosted Configuration Version","description":"Delete a specific hosted configuration version from an AppConfig profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID that owns the version"},"versionNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The version number to delete"}},"hostedApiKey":"none"},"appconfig_get_application":{"id":"appconfig_get_application","name":"AppConfig Get Application","description":"Get details about a single AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to retrieve"}},"hostedApiKey":"none"},"appconfig_get_configuration":{"id":"appconfig_get_configuration","name":"AppConfig Get Configuration","description":"Retrieve the latest deployed configuration for an AppConfig application, environment, and profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID or name to retrieve configuration for"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID or name to retrieve configuration for"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID or name to retrieve"}},"hostedApiKey":"none"},"appconfig_get_configuration_profile":{"id":"appconfig_get_configuration_profile","name":"AppConfig Get Configuration Profile","description":"Get details about a single AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to retrieve"}},"hostedApiKey":"none"},"appconfig_get_deployment":{"id":"appconfig_get_deployment","name":"AppConfig Get Deployment","description":"Get details about a specific AWS AppConfig deployment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployment"},"deploymentNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The sequence number of the deployment"}},"hostedApiKey":"none"},"appconfig_get_environment":{"id":"appconfig_get_environment","name":"AppConfig Get Environment","description":"Get details about a single AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to retrieve"}},"hostedApiKey":"none"},"appconfig_get_hosted_configuration_version":{"id":"appconfig_get_hosted_configuration_version","name":"AppConfig Get Hosted Configuration Version","description":"Retrieve a specific hosted configuration version from an AppConfig profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to read the version from"},"versionNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The version number to retrieve"}},"hostedApiKey":"none"},"appconfig_list_applications":{"id":"appconfig_list_applications","name":"AppConfig List Applications","description":"List applications in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of applications to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_list_configuration_profiles":{"id":"appconfig_list_configuration_profiles","name":"AppConfig List Configuration Profiles","description":"List configuration profiles for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profiles"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of configuration profiles to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_list_deployment_strategies":{"id":"appconfig_list_deployment_strategies","name":"AppConfig List Deployment Strategies","description":"List deployment strategies available in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of deployment strategies to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_list_deployments":{"id":"appconfig_list_deployments","name":"AppConfig List Deployments","description":"List deployments for an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployments"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployments"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of deployments to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_list_environments":{"id":"appconfig_list_environments","name":"AppConfig List Environments","description":"List environments for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environments"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of environments to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_list_hosted_configuration_versions":{"id":"appconfig_list_hosted_configuration_versions","name":"AppConfig List Hosted Configuration Versions","description":"List hosted configuration versions for an AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to list versions for"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of versions to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"hostedApiKey":"none"},"appconfig_start_deployment":{"id":"appconfig_start_deployment","name":"AppConfig Start Deployment","description":"Start deploying a configuration version to an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to deploy in"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to deploy to"},"deploymentStrategyId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The deployment strategy ID to use"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to deploy"},"configurationVersion":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration version to deploy"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the deployment"}},"hostedApiKey":"none"},"appconfig_stop_deployment":{"id":"appconfig_stop_deployment","name":"AppConfig Stop Deployment","description":"Stop an in-progress AWS AppConfig deployment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployment"},"deploymentNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The sequence number of the deployment to stop"}},"hostedApiKey":"none"},"appconfig_update_application":{"id":"appconfig_update_application","name":"AppConfig Update Application","description":"Update the name or description of an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the application"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the application"}},"hostedApiKey":"none"},"appconfig_update_configuration_profile":{"id":"appconfig_update_configuration_profile","name":"AppConfig Update Configuration Profile","description":"Update the name, description, or retrieval role of an AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the configuration profile"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the configuration profile"},"retrievalRoleArn":{"type":"string","required":false,"visibility":"user-or-llm","description":"New ARN of the IAM role used to retrieve the configuration"}},"hostedApiKey":"none"},"appconfig_update_environment":{"id":"appconfig_update_environment","name":"AppConfig Update Environment","description":"Update the name or description of an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the environment"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the environment"}},"hostedApiKey":"none"},"arxiv_get_author_papers":{"id":"arxiv_get_author_papers","name":"ArXiv Get Author Papers","description":"Search for papers by a specific author on ArXiv.","version":"1.0.0","params":{"authorName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Author name to search for"},"maxResults":{"type":"number","required":false,"visibility":"user-only","description":"Maximum number of results to return (default: 10, max: 2000)"}},"hostedApiKey":"none"},"arxiv_get_paper":{"id":"arxiv_get_paper","name":"ArXiv Get Paper","description":"Get detailed information about a specific ArXiv paper by its ID.","version":"1.0.0","params":{"paperId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ArXiv paper ID (e.g., \\"1706.03762\\")"}},"hostedApiKey":"none"},"arxiv_search":{"id":"arxiv_search","name":"ArXiv Search","description":"Search for academic papers on ArXiv by keywords, authors, titles, or other fields.","version":"1.0.0","params":{"searchQuery":{"type":"string","required":true,"visibility":"user-or-llm","description":"The search query to execute"},"searchField":{"type":"string","required":false,"visibility":"user-only","description":"Field to search in: all, ti (title), au (author), abs (abstract), co (comment), jr (journal), cat (category), rn (report number)"},"maxResults":{"type":"number","required":false,"visibility":"user-only","description":"Maximum number of results to return (default: 10, max: 2000)"},"sortBy":{"type":"string","required":false,"visibility":"user-only","description":"Sort by: relevance, lastUpdatedDate, submittedDate (default: relevance)"},"sortOrder":{"type":"string","required":false,"visibility":"user-only","description":"Sort order: ascending, descending (default: descending)"}},"hostedApiKey":"none"},"asana_add_comment":{"id":"asana_add_comment","name":"Asana Add Comment","description":"Add a comment (story) to an Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana task GID (numeric string)"},"text":{"type":"string","required":true,"visibility":"user-or-llm","description":"The text content of the comment"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_add_followers":{"id":"asana_add_followers","name":"Asana Add Followers","description":"Add one or more followers to an Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana task (numeric string)"},"followers":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of user GIDs to add as followers to the task"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_project":{"id":"asana_create_project","name":"Asana Create Project","description":"Create a new project in an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) where the project will be created"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the project"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the project"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_section":{"id":"asana_create_section","name":"Asana Create Section","description":"Create a new section in an Asana project","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana project (numeric string) to add the section to"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the section"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_subtask":{"id":"asana_create_subtask","name":"Asana Create Subtask","description":"Create a subtask under an existing Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the parent Asana task (numeric string)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the subtask"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the subtask"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"User GID to assign the subtask to"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_task":{"id":"asana_create_task","name":"Asana Create Task","description":"Create a new task in Asana","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) where the task will be created"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the task"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the task"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"User GID to assign the task to"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_delete_task":{"id":"asana_delete_task","name":"Asana Delete Task","description":"Delete an Asana task by its GID (moves it to the trash)","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana task to delete (numeric string)"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_project":{"id":"asana_get_project","name":"Asana Get Project","description":"Retrieve a single Asana project by its GID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana project GID (numeric string) to retrieve"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_projects":{"id":"asana_get_projects","name":"Asana Get Projects","description":"Retrieve all projects from an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to retrieve projects from"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_task":{"id":"asana_get_task","name":"Asana Get Task","description":"Retrieve a single task by GID or get multiple tasks with filters","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":false,"visibility":"user-or-llm","description":"The globally unique identifier (GID) of the task. If not provided, will get multiple tasks."},"workspace":{"type":"string","required":false,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to filter tasks (required when not using taskGid)"},"project":{"type":"string","required":false,"visibility":"user-or-llm","description":"Asana project GID (numeric string) to filter tasks"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of tasks to return (default: 50)"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_list_sections":{"id":"asana_list_sections","name":"Asana List Sections","description":"List all sections in an Asana project","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana project (numeric string) to list sections from"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_list_workspaces":{"id":"asana_list_workspaces","name":"Asana List Workspaces","description":"List all Asana workspaces and organizations the authenticated user belongs to","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_search_tasks":{"id":"asana_search_tasks","name":"Asana Search Tasks","description":"Search for tasks in an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to search tasks in"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Text to search for in task names"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter tasks by assignee user GID"},"projects":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of Asana project GIDs (numeric strings) to filter tasks by"},"completed":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Filter by completion status"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_update_task":{"id":"asana_update_task","name":"Asana Update Task","description":"Update an existing task in Asana","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana task GID (numeric string) of the task to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated name for the task"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated notes or description for the task"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated assignee user GID"},"completed":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Mark task as completed or not completed"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"ashby_add_candidate_tag":{"id":"ashby_add_candidate_tag","name":"Ashby Add Candidate Tag","description":"Adds a tag to a candidate in Ashby and returns the updated candidate.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to add the tag to"},"tagId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the tag to add"}},"hostedApiKey":"none"},"ashby_anonymize_candidate":{"id":"ashby_anonymize_candidate","name":"Ashby Anonymize Candidate","description":"Remove personally identifiable information from an Ashby candidate while retaining the candidate record and its applications. This operation does not delete the candidate. Requires the candidatesWrite permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"UUID of the candidate to anonymize"}},"hostedApiKey":"none"},"ashby_change_application_source":{"id":"ashby_change_application_source","name":"Ashby Change Application Source","description":"Changes the source attributed to an existing application, so programmatically created applications report correctly on the recruiting side. Requires the candidatesWrite permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"UUID of the application whose source should change"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to attribute the application to, as returned by List Sources. Omit only when unsetSource is true."},"unsetSource":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Set true to deliberately clear the application source. Required to unset, so that a missing or empty sourceId cannot wipe attribution by accident."}},"hostedApiKey":"none"},"ashby_change_application_stage":{"id":"ashby_change_application_stage","name":"Ashby Change Application Stage","description":"Moves an application to a different interview stage. Requires an archive reason when moving to an Archived stage.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the application to update the stage of"},"interviewStageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the interview stage to move the application to"},"archiveReasonId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Archive reason UUID. Required when moving to an Archived stage, ignored otherwise"},"archiveEmail":{"type":"json","required":false,"visibility":"user-or-llm","description":"Archive email configuration with communicationTemplateId and optional sendAt ISO 8601 timestamp. Pass null or omit to send no archive email."}},"hostedApiKey":"none"},"ashby_create_application":{"id":"ashby_create_application","name":"Ashby Create Application","description":"Creates a new application for a candidate on a job. Optionally specify interview plan, stage, source, and credited user.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to consider for the job"},"jobId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the job to consider the candidate for"},"interviewPlanId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the interview plan to use (defaults to the job default plan)"},"interviewStageId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the interview stage to place the application in, or FirstPreInterviewScreen (defaults to the first Lead stage)"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to set on the application"},"creditedToUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the user the application is credited to"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to set as the application creation date (defaults to now)"},"applicationHistory":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional documented application history entries to create with the application"}},"hostedApiKey":"none"},"ashby_create_candidate":{"id":"ashby_create_candidate","name":"Ashby Create Candidate","description":"Creates a new candidate record in Ashby.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"The candidate full name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary email address for the candidate"},"phoneNumber":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number for the candidate"},"linkedInUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"LinkedIn profile URL"},"githubUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"GitHub profile URL"},"website":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal website URL"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to attribute the candidate to"},"creditedToUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the Ashby user to credit with sourcing this candidate"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"Backdated creation timestamp in ISO 8601 (e.g. 2024-01-01T00:00:00Z). Defaults to now."},"alternateEmailAddresses":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of additional email address strings to add to the candidate, e.g. [\\"a@x.com\\",\\"b@y.com\\"]"},"location":{"type":"json","required":false,"visibility":"user-or-llm","description":"Candidate location object with optional city, region, and country"}},"hostedApiKey":"none"},"ashby_create_note":{"id":"ashby_create_note","name":"Ashby Create Note","description":"Creates a note on a candidate in Ashby. Supports plain text and HTML content (bold, italic, underline, links, lists, code).","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to add the note to"},"note":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note content. If noteType is text/html, supports: , , , ,