Skip to main content
This cookbook is for AI agents and developers who assemble a valid dual-graph payload and persist it with REST. One MCP is enough: https://docs.pingmee.co.il/mcp indexes these pages and the Workflows API. Board UI field catalogs live on Workflow Docs and are optional for this path.

Goal

Create a folder, save a workflow that has both a canvas graph (data) and an execution graph (parsedData + trigger), activate it, then trigger it. Bind WhatsApp / HTTP / Fireberry fields with Fixed, Expression, or Custom parameter objects.

Before you save (agents)

Do these before POST/PUT. Skipping them produces a graph that opens on the board but does not send from the right number, fails Meta’s 24-hour rule on starter/outbound, or drops media.
  1. Pick a phone / platform. GET phone numbers (GET https://business.pingmee.co.il/phone-numbers). If more than one number exists, ask the user which one to bind. Copy that item’s id into associatedToBusinessId and set platformType (whatsapp for those rows). Optional: set associatedToPlatformId to the same id. See Workflow document.
  2. Infer intent — the first WhatsApp message is not always a template. Decide from what the user asked for (table below). Do not force a Meta template on a reply bot. See Nodes and edges.
  3. No media upload via this API. There is no public file-upload endpoint for agents. GUI save uploads blob URLs to S3 (attachmentS3Id). Via REST, send text or template body/buttons only. Do not put blob/https upload URLs in templateInformation. If a catalog template requires an IMAGE / VIDEO / DOCUMENT header, skip it unless components[].attachmentS3Id is already known. See Hard rules.
  4. Wire both graphs. Copy every canvas edge into connections.out with matching node ids. Root output handle is "out"; sub-node output handle is "in". See How to wire a graph.

Infer starter vs reply

A workflowTrigger child reached from a pointer during an inbound run is still in-session — custom is OK. Template is required when that trigger starts the thread (POST /trigger, campaign-style, outside the 24-hour window).
1

Optional — create a folder

POST https://workflows.pingmee.co.il/folders/{folderId} with { "name": "Inbound" }. You supply folderId. Or reuse a folderId from list workflows (minimal).
2

Create the workflow

POST https://workflows.pingmee.co.il/workflows/{workflowId}?folderId={folderId} with at least name, associatedToBusinessId, and platformType. You may send the full graph in the same body. The server always stores isActive: false and sets associatedTo from the Cookie. Response includes created and lastModified.
3

PUT the graph if you did not send it on create

Send both data and parsedData plus trigger / triggerType. Echo lastModified from the last GET or create, or the API returns 409.
4

Activate

PUT /workflows/{workflowId} with { "isActive": true } only. No lastModified needed when you are not sending data or parsedData.
5

Trigger

POST /workflows//trigger. Optional body triggerData lands on the trigger node — read it with return $<triggerNodeId>.triggerData.<key>; (Variables). The child of a workflow pointer must already be active and start with workflowTrigger.
6

Optional — read analytics, then edit

After executions, GET the same document and read analytics (Expert AI). Interpret drop-off / buttons, then PUT a new graph. See Workflow analytics.
An AI that writes only data will not run. An AI that writes only parsedData will not open correctly on the board. Always send both graphs with matching IDs. See Canvas vs execution.

Document fields

Top-level Workflow keys and what the server overwrites

Dual graph

React Flow data vs execution parsedData + trigger

Nodes and edges

NodeType table, handles, required data keys

Examples

Sanitized dual-graph patterns, including triggerData + pointer

Analytics

GET analytics, interpret drop-off, PUT graph changes

Variables

Parameter slots: Fixed (tree pick), Expression (return $nodeId…), Custom ({ custom })
Last modified on September 4, 2026