curl --request POST \
--url https://workflows.pingmee.co.il/workflows/{workflowId} \
--header 'Content-Type: application/json' \
--header 'Cookie: <api-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"associatedToBusinessId": "<string>",
"associatedToPlatformId": "<string>",
"platformType": "<string>",
"triggerType": "<string>",
"variables": {},
"data": {
"nodes": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"position": {
"x": 123,
"y": 123
},
"parentId": "<string>",
"draggable": true,
"selected": true,
"data": {}
}
],
"edges": [
{
"id": "<string>",
"source": "<string>",
"target": "<string>",
"sourceHandle": "<string>",
"targetHandle": "<string>",
"type": "<string>"
}
]
},
"parsedData": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"data": {},
"connections": {},
"parentId": "<string>",
"title": "<string>",
"subNodes": "<array>"
}
],
"settings": {},
"notes": "<string>"
}
'import requests
url = "https://workflows.pingmee.co.il/workflows/{workflowId}"
payload = {
"name": "<string>",
"associatedToBusinessId": "<string>",
"associatedToPlatformId": "<string>",
"platformType": "<string>",
"triggerType": "<string>",
"variables": {},
"data": {
"nodes": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"position": {
"x": 123,
"y": 123
},
"parentId": "<string>",
"draggable": True,
"selected": True,
"data": {}
}
],
"edges": [
{
"id": "<string>",
"source": "<string>",
"target": "<string>",
"sourceHandle": "<string>",
"targetHandle": "<string>",
"type": "<string>"
}
]
},
"parsedData": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"data": {},
"connections": {},
"parentId": "<string>",
"title": "<string>",
"subNodes": "<array>"
}
],
"settings": {},
"notes": "<string>"
}
headers = {
"Cookie": "<api-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Cookie: '<api-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
associatedToBusinessId: '<string>',
associatedToPlatformId: '<string>',
platformType: '<string>',
triggerType: '<string>',
variables: {},
data: {
nodes: [
{
id: '<string>',
type: '<string>',
category: '<string>',
position: {x: 123, y: 123},
parentId: '<string>',
draggable: true,
selected: true,
data: {}
}
],
edges: [
{
id: '<string>',
source: '<string>',
target: '<string>',
sourceHandle: '<string>',
targetHandle: '<string>',
type: '<string>'
}
]
},
parsedData: [
{
id: '<string>',
type: '<string>',
category: '<string>',
data: {},
connections: {},
parentId: '<string>',
title: '<string>',
subNodes: '<array>'
}
],
settings: {},
notes: '<string>'
})
};
fetch('https://workflows.pingmee.co.il/workflows/{workflowId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://workflows.pingmee.co.il/workflows/{workflowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'associatedToBusinessId' => '<string>',
'associatedToPlatformId' => '<string>',
'platformType' => '<string>',
'triggerType' => '<string>',
'variables' => [
],
'data' => [
'nodes' => [
[
'id' => '<string>',
'type' => '<string>',
'category' => '<string>',
'position' => [
'x' => 123,
'y' => 123
],
'parentId' => '<string>',
'draggable' => true,
'selected' => true,
'data' => [
]
]
],
'edges' => [
[
'id' => '<string>',
'source' => '<string>',
'target' => '<string>',
'sourceHandle' => '<string>',
'targetHandle' => '<string>',
'type' => '<string>'
]
]
],
'parsedData' => [
[
'id' => '<string>',
'type' => '<string>',
'category' => '<string>',
'data' => [
],
'connections' => [
],
'parentId' => '<string>',
'title' => '<string>',
'subNodes' => '<array>'
]
],
'settings' => [
],
'notes' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Cookie: <api-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://workflows.pingmee.co.il/workflows/{workflowId}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Cookie", "<api-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://workflows.pingmee.co.il/workflows/{workflowId}")
.header("Cookie", "<api-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://workflows.pingmee.co.il/workflows/{workflowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Cookie"] = '<api-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Workflow 'wf_welcome' created.",
"created": 123,
"lastModified": 123
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Create Workflow
Create a workflow. Client supplies workflowId in the path (URL-encode it). Required query: folderId. Body requires name. Before saving, GET /phone-numbers, ask the user which number to bind, and set associatedToBusinessId to that row’s id plus platformType. Infer intent: if the bot opens a WhatsApp conversation (starter/outbound, workflowTrigger, POST /trigger), GET /templates and use an APPROVED template on the first WhatsApp node; inbound reply bots (pingmeeTrigger) use messageType: custom and should not fetch templates unless the user named one. Graph fields (data, parsedData, trigger, triggerType, variables) are optional — you can send a full document. The server overwrites id, associatedTo (from the Cookie), folderId, isActive (always false), created, lastModified, executionCount, lastExecution, and analytics. Returns { message, created, lastModified }.
Before building data / parsedData, read /build-workflows/overview and the related Build workflows cookbook pages. Recommended save sequence: optional POST /folders/{id} → POST this endpoint (name + phone ids + optional graph) → PUT { isActive: true }. Graph PUTs must echo lastModified.
curl --request POST \
--url https://workflows.pingmee.co.il/workflows/{workflowId} \
--header 'Content-Type: application/json' \
--header 'Cookie: <api-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"associatedToBusinessId": "<string>",
"associatedToPlatformId": "<string>",
"platformType": "<string>",
"triggerType": "<string>",
"variables": {},
"data": {
"nodes": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"position": {
"x": 123,
"y": 123
},
"parentId": "<string>",
"draggable": true,
"selected": true,
"data": {}
}
],
"edges": [
{
"id": "<string>",
"source": "<string>",
"target": "<string>",
"sourceHandle": "<string>",
"targetHandle": "<string>",
"type": "<string>"
}
]
},
"parsedData": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"data": {},
"connections": {},
"parentId": "<string>",
"title": "<string>",
"subNodes": "<array>"
}
],
"settings": {},
"notes": "<string>"
}
'import requests
url = "https://workflows.pingmee.co.il/workflows/{workflowId}"
payload = {
"name": "<string>",
"associatedToBusinessId": "<string>",
"associatedToPlatformId": "<string>",
"platformType": "<string>",
"triggerType": "<string>",
"variables": {},
"data": {
"nodes": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"position": {
"x": 123,
"y": 123
},
"parentId": "<string>",
"draggable": True,
"selected": True,
"data": {}
}
],
"edges": [
{
"id": "<string>",
"source": "<string>",
"target": "<string>",
"sourceHandle": "<string>",
"targetHandle": "<string>",
"type": "<string>"
}
]
},
"parsedData": [
{
"id": "<string>",
"type": "<string>",
"category": "<string>",
"data": {},
"connections": {},
"parentId": "<string>",
"title": "<string>",
"subNodes": "<array>"
}
],
"settings": {},
"notes": "<string>"
}
headers = {
"Cookie": "<api-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Cookie: '<api-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
associatedToBusinessId: '<string>',
associatedToPlatformId: '<string>',
platformType: '<string>',
triggerType: '<string>',
variables: {},
data: {
nodes: [
{
id: '<string>',
type: '<string>',
category: '<string>',
position: {x: 123, y: 123},
parentId: '<string>',
draggable: true,
selected: true,
data: {}
}
],
edges: [
{
id: '<string>',
source: '<string>',
target: '<string>',
sourceHandle: '<string>',
targetHandle: '<string>',
type: '<string>'
}
]
},
parsedData: [
{
id: '<string>',
type: '<string>',
category: '<string>',
data: {},
connections: {},
parentId: '<string>',
title: '<string>',
subNodes: '<array>'
}
],
settings: {},
notes: '<string>'
})
};
fetch('https://workflows.pingmee.co.il/workflows/{workflowId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://workflows.pingmee.co.il/workflows/{workflowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'associatedToBusinessId' => '<string>',
'associatedToPlatformId' => '<string>',
'platformType' => '<string>',
'triggerType' => '<string>',
'variables' => [
],
'data' => [
'nodes' => [
[
'id' => '<string>',
'type' => '<string>',
'category' => '<string>',
'position' => [
'x' => 123,
'y' => 123
],
'parentId' => '<string>',
'draggable' => true,
'selected' => true,
'data' => [
]
]
],
'edges' => [
[
'id' => '<string>',
'source' => '<string>',
'target' => '<string>',
'sourceHandle' => '<string>',
'targetHandle' => '<string>',
'type' => '<string>'
]
]
],
'parsedData' => [
[
'id' => '<string>',
'type' => '<string>',
'category' => '<string>',
'data' => [
],
'connections' => [
],
'parentId' => '<string>',
'title' => '<string>',
'subNodes' => '<array>'
]
],
'settings' => [
],
'notes' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Cookie: <api-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://workflows.pingmee.co.il/workflows/{workflowId}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Cookie", "<api-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://workflows.pingmee.co.il/workflows/{workflowId}")
.header("Cookie", "<api-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://workflows.pingmee.co.il/workflows/{workflowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Cookie"] = '<api-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"associatedToBusinessId\": \"<string>\",\n \"associatedToPlatformId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"triggerType\": \"<string>\",\n \"variables\": {},\n \"data\": {\n \"nodes\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"position\": {\n \"x\": 123,\n \"y\": 123\n },\n \"parentId\": \"<string>\",\n \"draggable\": true,\n \"selected\": true,\n \"data\": {}\n }\n ],\n \"edges\": [\n {\n \"id\": \"<string>\",\n \"source\": \"<string>\",\n \"target\": \"<string>\",\n \"sourceHandle\": \"<string>\",\n \"targetHandle\": \"<string>\",\n \"type\": \"<string>\"\n }\n ]\n },\n \"parsedData\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"category\": \"<string>\",\n \"data\": {},\n \"connections\": {},\n \"parentId\": \"<string>\",\n \"title\": \"<string>\",\n \"subNodes\": \"<array>\"\n }\n ],\n \"settings\": {},\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Workflow 'wf_welcome' created.",
"created": 123,
"lastModified": 123
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}workflowId in the path (URL-encode it). folderId is a required query parameter — create a folder first or reuse one from List workflows.
The body needs at least name. Also send associatedToBusinessId (phone-number id from GET phone numbers) and platformType. You can also send a full graph (data, parsedData, trigger, triggerType, variables). The server always stores isActive: false and sets associatedTo from the Cookie.
Returns { message, created, lastModified }. Keep lastModified for later graph PUTs.
data or parsedData, read Build workflows. Fetch phones, ask the user which number to bind, then infer intent: a WhatsApp template only if this bot opens the conversation; inbound reply bots use messageType: "custom". An AI that only writes data will not run; one that only writes parsedData will not open correctly on the board.Recommended save sequence
- Optional: Create folder —
POST /folders/{id}with{ "name": "..." } POST /workflows/{workflowId}?folderId=...withnameand optional graph- Update workflow —
PUT{ "isActive": true }(no graph required)
lastModified from this create response (or a later GET), or the API returns 409.Authorizations
Personal access token from Pingmee Settings → Developer Tools
Business API key from Pingmee Settings → Developer Tools
Path Parameters
Client-supplied workflow identifier. Must be URL-encoded when used in the path.
Query Parameters
Folder to place the workflow in. Create a folder with POST /folders/{id} or reuse folderId from the minimal list.
Body
At least name. Optionally include the full dual graph (data, parsedData, trigger, triggerType, variables) and other Workflow fields. isActive in the body is ignored — the server always stores false.
Workflow name.
WhatsApp phone-number id from GET /phone-numbers (row id, not associatedBusinessId / WABA). Required for WhatsApp send. Ask the user if more than one number exists.
Optional alias of the same phone-number / page id as associatedToBusinessId.
whatsapp, facebookMessenger, instagram, or web. Set on create together with associatedToBusinessId.
Usually trigger.data.eventType. Trigger is not inside parsedData.
Execution node used in parsedData, trigger, and subNodes. Branching is which sub-node's connections.out — there are no handle ids here. Node data is a loose object; read /build-workflows/overview before building it.
Show child attributes
Show child attributes
Workflow-level variable map. Usually {} unless set.
React Flow canvas (workflow.data from toObject()). Required for the editor. Always send together with parsedData + trigger when saving a graph. Node form payloads are not fully specified here — read /build-workflows/overview before building data.
Show child attributes
Show child attributes
Execution graph: parent nodes only. Sub-nodes hang off parent.subNodes[].
Show child attributes
Show child attributes
Was this page helpful?