A node is one step of a flow. Each has its own request_body, shaped exactly like a POST /webhook/unblocker body.
Node shape
{
"label": "Product Detail",
"position": 2,
"request_body": {
"url": "https://shop.example.com/product/1",
"formats": [
{
"type": "unblocker",
"selectors": [
{ "property_name": "name", "selector": "h1", "attribute_type": "TEXT" },
{ "property_name": "price", "selector": ".price", "attribute_type": "TEXT" }
],
"options": { "wait_until": "domcontentloaded" }
}
]
}
}label— the display name of the node.position— execution order.request_body— the whole scrape request: selectors, mode, actions, options.
POST /flows/:id/nodes
Adds a single node.
curl -X POST https://api.jetscrape.com/flows/flow_abc123/nodes \
-H "Content-Type: application/json" \
-H "x-api-key: js_YOUR_API_KEY" \
-d '{
"label": "New Step",
"request_body": {
"url": "https://example.com/page2",
"formats": [{ "type": "unblocker", "selectors": [] }]
}
}'PUT /flows/:id/nodes
Replaces all nodes with the list you send. Use it to rebuild the order or rewrite the pipeline in one call.
curl -X PUT https://api.jetscrape.com/flows/flow_abc123/nodes \
-H "Content-Type: application/json" \
-H "x-api-key: js_YOUR_API_KEY" \
-d '{
"nodes": [
{
"label": "Step 1",
"request_body": {
"url": "https://example.com",
"formats": [{ "type": "unblocker", "selectors": [] }]
}
}
]
}'Nodes missing from the list are deleted. To change one field, use PATCH instead.
PATCH /flows/:id/nodes/:nodeId
curl -X PATCH https://api.jetscrape.com/flows/flow_abc123/nodes/node_xyz \
-H "Content-Type: application/json" \
-H "x-api-key: js_YOUR_API_KEY" \
-d '{
"label": "Updated Label",
"position": 2
}'DELETE /flows/:id/nodes/:nodeId
curl -X DELETE https://api.jetscrape.com/flows/flow_abc123/nodes/node_xyz \
-H "x-api-key: js_YOUR_API_KEY"Keep nodes small — one page type per node — and verify each with POST /flows/:id/nodes/:nodeId/run before running the whole flow. Numbering positions in steps of ten (10, 20, 30) leaves room to insert nodes later.