Save a flow
tenantKeybearerAuthX-Tenant-Key<token>The public store key (pk_live_…). Required on every call.
AuthorizationBearer <token>A customer token from POST /v1/auth/login, or a merchant API key, on routes that need one.
X-Client-IP?stringOptional. IP address of the shopper (one IPv4/IPv6, no port, no list). Honoured only together with a valid X-Tenant-Secret; ignored otherwise. Used for rate limits and recorded with form submissions.
X-Tenant-Secret?stringOptional here. Server secret of the store: server-to-server only, never from a browser. Enables X-Client-IP.
application/json- body
handle*string^[a-z0-9\-]+$length <= 64name*stringlength <= 255is_enabled?booleantrigger*array<string>{event, filters}: an event the engine knows, filters an object.
1 <= itemsgraph*array<string>{nodes: [...]}: exactly one trigger node, next ids that exist, no cycles, and
each action node's config valid for its config.action (the same checks as the
flow editor). A send_email with recipient: order (service mail to the order
address) is only allowed when trigger.event starts with order.. Errors
come back in error.details keyed graph.<node id> or graph.<node id>.config.<key>.
1 <= itemsSuccess.
application/json- response
data*curl -X POST 'https://api.elaraone.app/api/v1/merchant/flows' \ -H 'X-Tenant-Key: pk_live_…' \ -H 'X-Tenant-Secret: your-server-secret' \ -H 'Content-Type: application/json' \ -d '{ "handle": "string", "name": "string", "trigger": [ "string" ], "graph": [ "string" ]}'{ "data": { "id": 0, "handle": "string", "name": "string", "trigger": { "property1": null, "property2": null }, "graph": { "property1": null, "property2": null }, "is_enabled": true, "version": 0, "created_at": "string", "updated_at": "string" }}