From 9e7bc6691c2feee43fbe549010462e3f40ee6261 Mon Sep 17 00:00:00 2001 From: Sam Wooler Date: Mon, 28 Sep 2026 12:35:46 +0000 Subject: [PATCH] fix(API): Allow extendsCredential in workflow create/update (#39243) Co-authored-by: Uddish Verma Co-authored-by: Claude Fable 5.1 --- .../__tests__/create-workflow-public.dto.test.ts | 12 ++++++++++++ .../src/dto/workflows/base-workflow-public.dto.ts | 5 ++++- .../spec/paths/createWorkflow.generated.yml | 2 ++ .../spec/paths/updateWorkflow.generated.yml | 2 ++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/@n8n/api-types/src/dto/workflows/__tests__/create-workflow-public.dto.test.ts b/packages/@n8n/api-types/src/dto/workflows/__tests__/create-workflow-public.dto.test.ts index 406f1b0a013..524e54c4377 100644 --- a/packages/@n8n/api-types/src/dto/workflows/__tests__/create-workflow-public.dto.test.ts +++ b/packages/@n8n/api-types/src/dto/workflows/__tests__/create-workflow-public.dto.test.ts @@ -73,6 +73,18 @@ describe('CreateWorkflowPublicDto', () => { expect(result.success).toBe(true); }); + test('accepts node.extendsCredential but ignores it', () => { + const result = CreateWorkflowPublicDto.safeParse({ + ...validPayload, + nodes: [{ ...validPayload.nodes[0], extendsCredential: 'datadogApi' }], + }); + + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.nodes[0]).not.toHaveProperty('extendsCredential'); + } + }); + test.each([ ['accepts', 155, true], ['rejects', 156, false], diff --git a/packages/@n8n/api-types/src/dto/workflows/base-workflow-public.dto.ts b/packages/@n8n/api-types/src/dto/workflows/base-workflow-public.dto.ts index f54aa129e53..9072423c46b 100644 --- a/packages/@n8n/api-types/src/dto/workflows/base-workflow-public.dto.ts +++ b/packages/@n8n/api-types/src/dto/workflows/base-workflow-public.dto.ts @@ -51,10 +51,13 @@ const workflowNodeWritePublicSchema = z .object({ tag: z.array(customTelemetryTagPublicSchema).optional() }) .strict() .optional(), + // Accepted but ignored, this is an internal editor-produced marker for credential-only HTTP Request nodes + extendsCredential: z.string().optional(), createdAt: readOnlyPublicSchema(readOnlyTimestampOpenApi), updatedAt: readOnlyPublicSchema(readOnlyTimestampOpenApi), }) - .strict(); + .strict() + .transform(({ extendsCredential: _extendsCredential, ...node }) => node); const workflowNodeGroupWritePublicSchema = z .object({ diff --git a/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/createWorkflow.generated.yml b/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/createWorkflow.generated.yml index 701f00810db..5b3667674ac 100644 --- a/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/createWorkflow.generated.yml +++ b/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/createWorkflow.generated.yml @@ -124,6 +124,8 @@ requestBody: - value additionalProperties: false additionalProperties: false + extendsCredential: + type: string createdAt: type: string format: date-time diff --git a/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/updateWorkflow.generated.yml b/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/updateWorkflow.generated.yml index e1bbd574d74..1bbd9413409 100644 --- a/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/updateWorkflow.generated.yml +++ b/packages/cli/src/public-api/v1/handlers/workflows/spec/paths/updateWorkflow.generated.yml @@ -141,6 +141,8 @@ requestBody: - value additionalProperties: false additionalProperties: false + extendsCredential: + type: string createdAt: type: string format: date-time