diff --git a/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs b/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs
new file mode 100644
index 0000000000000..2a1a497182c07
--- /dev/null
+++ b/components/freshdesk/actions/assign-ticket-to-agent/assign-ticket-to-agent.mjs
@@ -0,0 +1,35 @@
+import freshdesk from "../../freshdesk.app.mjs";
+
+export default {
+ key: "freshdesk-assign-ticket-to-agent",
+ name: "Assign Ticket to Agent",
+ description: "Assign a Freshdesk ticket to a specific agent",
+ version: "0.0.1",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ responder_id: {
+ type: "integer",
+ label: "Agent ID",
+ description: "ID of the agent to assign this ticket to",
+ },
+ },
+ async run({ $ }) {
+ const response = await this.freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${this.ticketId}`,
+ data: {
+ responder_id: this.responder_id,
+ },
+ });
+ $.export("$summary", `Ticket ${this.ticketId} assigned to agent ${this.responder_id}`);
+ return response;
+ },
+};
\ No newline at end of file
diff --git a/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs b/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs
new file mode 100644
index 0000000000000..ec5012bb5ea06
--- /dev/null
+++ b/components/freshdesk/actions/assign-ticket-to-group/assign-ticket-to-group.mjs
@@ -0,0 +1,35 @@
+import freshdesk from "../../freshdesk.app.mjs";
+
+export default {
+ key: "freshdesk-assign-ticket-to-group",
+ name: "Assign Ticket to Group",
+ description: "Assign a Freshdesk ticket to a specific group",
+ version: "0.0.1",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ group_id: {
+ type: "integer",
+ label: "Group ID",
+ description: "ID of the group to assign this ticket to",
+ },
+ },
+ async run({ $ }) {
+ const response = await this.freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${this.ticketId}`,
+ data: {
+ group_id: this.group_id,
+ },
+ });
+ $.export("$summary", `Ticket ${this.ticketId} assigned to group ${this.group_id}`);
+ return response;
+ },
+};
\ No newline at end of file
diff --git a/components/freshdesk/actions/close-ticket/close-ticket.mjs b/components/freshdesk/actions/close-ticket/close-ticket.mjs
new file mode 100644
index 0000000000000..963260da7b973
--- /dev/null
+++ b/components/freshdesk/actions/close-ticket/close-ticket.mjs
@@ -0,0 +1,33 @@
+import freshdesk from "../../freshdesk.app.mjs";
+
+export default {
+ key: "freshdesk-close-ticket",
+ name: "Close Ticket",
+ description: "Set a Freshdesk ticket's status to 'Closed'. [See docs](https://developers.freshdesk.com/api/#update_a_ticket)",
+ version: "0.0.1",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ },
+ async run({ $ }) {
+ const CLOSED_STATUS = 5; // Freshdesk status code for 'Closed'
+
+ const response = await this.freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${this.ticketId}`,
+ data: {
+ status: CLOSED_STATUS,
+ },
+ });
+
+ $.export("$summary", `Ticket ${this.ticketId} closed successfully`);
+ return response;
+ },
+};
diff --git a/components/freshdesk/actions/freshdesk-update-ticket/create-group-id-test.mjs b/components/freshdesk/actions/freshdesk-update-ticket/create-group-id-test.mjs
new file mode 100644
index 0000000000000..8d3cd73de0300
--- /dev/null
+++ b/components/freshdesk/actions/freshdesk-update-ticket/create-group-id-test.mjs
@@ -0,0 +1,27 @@
+const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
+
+// 🔧 Replace these with your real values
+const API_KEY = "YfaK2hd0KP3og3KbqV";
+const DOMAIN = "falc1.freshdesk.com"; // e.g. support.freshdesk.com
+
+const createGroup = async () => {
+ const res = await fetch(`https://${DOMAIN}/api/v2/groups`, {
+ method: "POST",
+ headers: {
+ "Authorization": "Basic " + Buffer.from(`${API_KEY}:X`).toString("base64"),
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ name: "My Team",
+ }),
+ });
+
+ const data = await res.json();
+ if (!res.ok) {
+ console.error("❌ Group create error:", data);
+ return;
+ }
+ console.log("✅ Group created:", data);
+};
+
+createGroup();
\ No newline at end of file
diff --git a/components/freshdesk/actions/freshdesk-update-ticket/create-ticket.mjs b/components/freshdesk/actions/freshdesk-update-ticket/create-ticket.mjs
new file mode 100644
index 0000000000000..e59cdf66a5cfd
--- /dev/null
+++ b/components/freshdesk/actions/freshdesk-update-ticket/create-ticket.mjs
@@ -0,0 +1,43 @@
+import fetch from "node-fetch"; // if you're using Node 18+, native fetch is available
+
+// 🔧 Replace these with your real values
+const API_KEY = "YfaK2hd0KP3og3KbqV";
+const DOMAIN = "falc1.freshdesk.com"; // e.g. support.freshdesk.com
+
+// 🎟️ Ticket payload
+const payload = {
+ subject: "Test ticket for full update suite",
+ description: "This is a test ticket
With rich HTML content.",
+ type: "Question",
+ priority: 2, // Medium
+ status: 2, // Open
+ tags: ["api-test", "pipedream", "full-update"],
+ email: "info@falc1.com", //
+ // Uncomment and customize if you have these
+ group_id: 157001089898,
+ responder_id: 157005992678, //Agent ID
+ custom_fields: {
+ // Example: "cf_customer_type": "premium"
+ },
+};
+
+const createTicket = async () => {
+ const response = await fetch(`https://${DOMAIN}/api/v2/tickets`, {
+ method: "POST",
+ headers: {
+ "Authorization": "Basic " + Buffer.from(`${API_KEY}:X`).toString("base64"),
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(payload),
+ });
+
+ if (!response.ok) {
+ console.error("❌ Failed to create ticket", response.status, await response.text());
+ return;
+ }
+
+ const data = await response.json();
+ console.log("✅ Ticket created:", data);
+};
+
+createTicket();
\ No newline at end of file
diff --git a/components/freshdesk/actions/freshdesk-update-ticket/freshdesk-update-ticket.mjs b/components/freshdesk/actions/freshdesk-update-ticket/freshdesk-update-ticket.mjs
new file mode 100644
index 0000000000000..3eb2a2f143daa
--- /dev/null
+++ b/components/freshdesk/actions/freshdesk-update-ticket/freshdesk-update-ticket.mjs
@@ -0,0 +1,149 @@
+import freshdesk from "../../freshdesk.app.mjs";
+import { removeNullEntries } from "../../common/utils.mjs";
+
+export default {
+ key: "freshdesk-update-ticket-testpd",
+ name: "Update a Ticket",
+ description: "Update status, priority, subject, description, agent, group, tags, etc. [See docs](https://developers.freshdesk.com/api/#update_a_ticket)",
+ version: "0.0.5",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ ticketStatus: {
+ propDefinition: [
+ freshdesk,
+ "ticketStatus",
+ ],
+ optional: true,
+ },
+ ticketPriority: {
+ propDefinition: [
+ freshdesk,
+ "ticketPriority",
+ ],
+ optional: true,
+ },
+ subject: {
+ type: "string",
+ label: "Subject",
+ description: "Ticket subject",
+ optional: true,
+ },
+ description: {
+ type: "string",
+ label: "Description",
+ description: "Detailed ticket description (HTML allowed)",
+ optional: true,
+ },
+ type: {
+ type: "string",
+ label: "Type",
+ description: "Type of ticket (e.g. Question, Incident, etc.)",
+ optional: true,
+ },
+ group_id: {
+ type: "integer",
+ label: "Group ID",
+ description: "ID of the group to assign this ticket to",
+ optional: true,
+ },
+ responder_id: {
+ type: "integer",
+ label: "Agent ID",
+ description: "ID of the agent to assign this ticket to",
+ optional: true,
+ },
+ email: {
+ type: "string",
+ label: "Requester Email (replaces requester)",
+ description: "Updates the requester. If no contact with this email exists, a new one will be created and assigned to the ticket.",
+ optional: true,
+ },
+ phone: {
+ type: "string",
+ label: "Requester Phone (replaces requester)",
+ description: "If no contact with this phone number exists, a new one will be created. If used without email, 'name' is required.",
+ optional: true,
+ },
+ name: {
+ type: "string",
+ label: "Requester Name (required with phone if no email)",
+ description: "Used when creating a contact with phone but no email.",
+ optional: true,
+ },
+ type: {
+ type: "string",
+ label: "Type",
+ description: "Type of ticket (must match one of the allowed values)",
+ optional: true,
+ options: [
+ "Question",
+ "Incident",
+ "Problem",
+ "Feature Request",
+ "Refund",
+ ],
+ },
+ custom_fields: {
+ type: "object",
+ label: "Custom Fields",
+ description: "Custom fields as key-value pairs (make sure types match your config)",
+ optional: true,
+ },
+ },
+ async run({ $ }) {
+ const {
+ freshdesk,
+ ticketId,
+ ticketStatus,
+ ticketPriority,
+ subject,
+ description,
+ type,
+ group_id,
+ responder_id,
+ email,
+ phone,
+ name,
+ tags,
+ custom_fields,
+ } = this;
+
+ const data = removeNullEntries({
+ status: ticketStatus,
+ priority: ticketPriority,
+ subject,
+ description,
+ type,
+ group_id,
+ responder_id,
+ email,
+ phone,
+ name,
+ tags,
+ custom_fields,
+ });
+
+ if (!Object.keys(data).length) {
+ throw new Error("Please provide at least one field to update.");
+ }
+
+ const response = await freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${ticketId}`,
+ data,
+ });
+
+ $.export("$summary", `Ticket ${ticketId} updated successfully`);
+ return response;
+ },
+};
+
+
diff --git a/components/freshdesk/actions/freshdesk-update-ticket/get-group-id.mjs b/components/freshdesk/actions/freshdesk-update-ticket/get-group-id.mjs
new file mode 100644
index 0000000000000..e600f900dec3f
--- /dev/null
+++ b/components/freshdesk/actions/freshdesk-update-ticket/get-group-id.mjs
@@ -0,0 +1,28 @@
+const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
+
+// 🔧 Replace with your values
+const API_KEY = "your_api_key";
+const DOMAIN = "yourdomain.freshdesk.com";
+
+const getGroups = async () => {
+ const res = await fetch(`https://${DOMAIN}/api/v2/groups`, {
+ headers: {
+ "Authorization": "Basic " + Buffer.from(`${API_KEY}:X`).toString("base64"),
+ "Content-Type": "application/json",
+ },
+ });
+
+ const data = await res.json();
+
+ if (!res.ok) {
+ console.error("❌ Failed to fetch groups:", data);
+ return;
+ }
+
+ console.log("✅ Group List:");
+ data.forEach(group => {
+ console.log(`- ${group.name}: ${group.id}`);
+ });
+};
+
+getGroups();
\ No newline at end of file
diff --git a/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs b/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs
new file mode 100644
index 0000000000000..827204169613d
--- /dev/null
+++ b/components/freshdesk/actions/set-ticket-priority/set-ticket-priority.mjs
@@ -0,0 +1,36 @@
+import freshdesk from "../../freshdesk.app.mjs";
+
+export default {
+ key: "freshdesk-set-ticket-priority",
+ name: "Set Ticket Priority",
+ description: "Update the priority of a ticket in Freshdesk",
+ version: "0.0.1",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ ticketPriority: {
+ propDefinition: [
+ freshdesk,
+ "ticketPriority",
+ ],
+ },
+ },
+ async run({ $ }) {
+ const response = await this.freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${this.ticketId}`,
+ data: {
+ priority: this.ticketPriority,
+ },
+ });
+ $.export("$summary", `Ticket ${this.ticketId} priority updated to ${this.ticketPriority}`);
+ return response;
+ },
+};
\ No newline at end of file
diff --git a/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs b/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs
new file mode 100644
index 0000000000000..93b8fc8700240
--- /dev/null
+++ b/components/freshdesk/actions/set-ticket-status/set-ticket-status.mjs
@@ -0,0 +1,36 @@
+import freshdesk from "../../freshdesk.app.mjs";
+
+export default {
+ key: "freshdesk-set-ticket-status",
+ name: "Set Ticket Status",
+ description: "Update the status of a ticket in Freshdesk",
+ version: "0.0.1",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ ticketStatus: {
+ propDefinition: [
+ freshdesk,
+ "ticketStatus",
+ ],
+ },
+ },
+ async run({ $ }) {
+ const response = await this.freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${this.ticketId}`,
+ data: {
+ status: this.ticketStatus,
+ },
+ });
+ $.export("$summary", `Ticket ${this.ticketId} status updated to ${this.ticketStatus}`);
+ return response;
+ },
+};
\ No newline at end of file
diff --git a/components/freshdesk/actions/update-ticket/freshdesk-update-ticket.mjs b/components/freshdesk/actions/update-ticket/freshdesk-update-ticket.mjs
new file mode 100644
index 0000000000000..6ef224898e9c6
--- /dev/null
+++ b/components/freshdesk/actions/update-ticket/freshdesk-update-ticket.mjs
@@ -0,0 +1,149 @@
+import freshdesk from "../../freshdesk.app.mjs";
+import { removeNullEntries } from "../../common/utils.mjs";
+
+export default {
+ key: "freshdesk-update-ticket",
+ name: "Update a Ticket",
+ description: "Update status, priority, subject, description, agent, group, tags, etc. [See docs](https://developers.freshdesk.com/api/#update_a_ticket)",
+ version: "0.0.6",
+ type: "action",
+ props: {
+ freshdesk,
+ ticketId: {
+ propDefinition: [
+ freshdesk,
+ "ticketId",
+ ],
+ },
+ ticketStatus: {
+ propDefinition: [
+ freshdesk,
+ "ticketStatus",
+ ],
+ optional: true,
+ },
+ ticketPriority: {
+ propDefinition: [
+ freshdesk,
+ "ticketPriority",
+ ],
+ optional: true,
+ },
+ subject: {
+ type: "string",
+ label: "Subject",
+ description: "Ticket subject",
+ optional: true,
+ },
+ description: {
+ type: "string",
+ label: "Description",
+ description: "Detailed ticket description (HTML allowed)",
+ optional: true,
+ },
+ type: {
+ type: "string",
+ label: "Type",
+ description: "Type of ticket (e.g. Question, Incident, etc.)",
+ optional: true,
+ },
+ group_id: {
+ type: "integer",
+ label: "Group ID",
+ description: "ID of the group to assign this ticket to",
+ optional: true,
+ },
+ responder_id: {
+ type: "integer",
+ label: "Agent ID",
+ description: "ID of the agent to assign this ticket to",
+ optional: true,
+ },
+ email: {
+ type: "string",
+ label: "Requester Email (replaces requester)",
+ description: "Updates the requester. If no contact with this email exists, a new one will be created and assigned to the ticket.",
+ optional: true,
+ },
+ phone: {
+ type: "string",
+ label: "Requester Phone (replaces requester)",
+ description: "If no contact with this phone number exists, a new one will be created. If used without email, 'name' is required.",
+ optional: true,
+ },
+ name: {
+ type: "string",
+ label: "Requester Name (required with phone if no email)",
+ description: "Used when creating a contact with phone but no email.",
+ optional: true,
+ },
+ type: {
+ type: "string",
+ label: "Type",
+ description: "Type of ticket (must match one of the allowed values)",
+ optional: true,
+ options: [
+ "Question",
+ "Incident",
+ "Problem",
+ "Feature Request",
+ "Refund",
+ ],
+ },
+ custom_fields: {
+ type: "object",
+ label: "Custom Fields",
+ description: "Custom fields as key-value pairs (make sure types match your config)",
+ optional: true,
+ },
+ },
+ async run({ $ }) {
+ const {
+ freshdesk,
+ ticketId,
+ ticketStatus,
+ ticketPriority,
+ subject,
+ description,
+ type,
+ group_id,
+ responder_id,
+ email,
+ phone,
+ name,
+ tags,
+ custom_fields,
+ } = this;
+
+ const data = removeNullEntries({
+ status: ticketStatus,
+ priority: ticketPriority,
+ subject,
+ description,
+ type,
+ group_id,
+ responder_id,
+ email,
+ phone,
+ name,
+ tags,
+ custom_fields,
+ });
+
+ if (!Object.keys(data).length) {
+ throw new Error("Please provide at least one field to update.");
+ }
+
+ const response = await freshdesk._makeRequest({
+ $,
+ method: "PUT",
+ url: `/tickets/${ticketId}`,
+ data,
+ });
+
+ $.export("$summary", `Ticket ${ticketId} updated successfully`);
+ return response;
+ },
+};
+
+