Add an automation
const url = 'https://api.threadkite.app/v1/flows';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"New lead follow-up","description":"example","inboxId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","recipeKey":"out_of_hours_reply","definition":{"version":1,"trigger":{"type":"event","events":["example"],"conditions":[]},"conditions":[],"steps":[{"id":"example","type":"wait","wait":{"kind":"duration","duration":{"amount":1,"unit":"minutes","working":false}}}],"exits":{"contactReplied":true,"teamReplied":false,"threadClosed":true,"events":[]},"reentry":{"kind":"once_per_thread"}},"publish":false}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.threadkite.app/v1/flows \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "New lead follow-up", "description": "example", "inboxId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "recipeKey": "out_of_hours_reply", "definition": { "version": 1, "trigger": { "type": "event", "events": [ "example" ], "conditions": [] }, "conditions": [], "steps": [ { "id": "example", "type": "wait", "wait": { "kind": "duration", "duration": { "amount": 1, "unit": "minutes", "working": false } } } ], "exits": { "contactReplied": true, "teamReplied": false, "threadClosed": true, "events": [] }, "reentry": { "kind": "once_per_thread" } }, "publish": false }'From a recipe (recipeKey, its steps unless you give a definition) or from scratch. Saved as a draft; publish: true switches it on straight away.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Required without a recipe; the recipe’s name otherwise
Example
New lead follow-upThe inbox it works in; every inbox when left out
Start from a ready-made automation (see /v1/flow-recipes)
The steps; the recipe’s when left out
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
Publish it and switch it on straight away (else it is saved as a draft)
Responses
Section titled “Responses”object
draft (never published), live (on) or paused
object
object
The events it starts on (any of them), for event triggers; empty otherwise
The published version number
There are unpublished changes
Contacts in it now (waiting or running)
Contacts who started it in the last 7 days
Your plan lets it be switched on (Free: only the out-of-hours reply, with only its wording changed)
A flow: a trigger, conditions checked when a contact would start, steps in order (with if/else branches), when to stop early (exits) and how often a contact can start it (reentry)
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
A flow: a trigger, conditions checked when a contact would start, steps in order (with if/else branches), when to stop early (exits) and how often a contact can start it (reentry)
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
How long. working counts only opening hours (minutes and hours), or days the location opens (days)
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
Example
{ "status": "draft", "recipeKey": "out_of_hours_reply", "inbox": { "name": "Sales" }, "trigger": { "type": "event", "events": [ "lead.created" ] }, "definition": { "version": 1, "trigger": { "type": "event", "conditions": [] }, "conditions": [], "steps": [ { "type": "wait", "wait": { "kind": "duration", "duration": { "unit": "minutes", "working": false } } } ], "exits": { "contactReplied": true, "teamReplied": false, "threadClosed": true, "events": [] }, "reentry": { "kind": "once_per_thread" } }, "draftDefinition": { "version": 1, "trigger": { "type": "event", "conditions": [] }, "conditions": [], "steps": [ { "type": "wait", "wait": { "kind": "duration", "duration": { "unit": "minutes", "working": false } } } ], "exits": { "contactReplied": true, "teamReplied": false, "threadClosed": true, "events": [] }, "reentry": { "kind": "once_per_thread" } }}object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Missing or invalid API key
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Automations are part of Pro; Free can switch on only the out-of-hours reply, changing only its wording (code upgrade_required, feature rules)
The organisation is on the Free plan (code upgrade_required)
object
Stable machine-readable reason
The feature that needs Pro
Where to upgrade or pay, in the web app
Example
{ "statusCode": 402, "code": "upgrade_required", "message": "Connections are part of Pro. Upgrade to connect texts, calls and more.", "feature": "extraSeats", "upgradePath": "/settings/billing"}The key does not have the scope (or the person the permission)
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Rate limit reached
object
Stable machine-readable reason
Seconds until another request will be accepted
Example
{ "statusCode": 429, "code": "rate_limited", "message": "Too many requests. Each key can make 120 requests a minute; try again in 12 seconds.", "retryAfter": 12}