Skip to content

Try an automation with a contact

POST
/v1/flows/{id}/test
curl --request POST \
--url https://api.threadkite.app/v1/flows/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/test \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "threadId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "contactId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "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" } } }'

What would happen to this thread’s contact, and when, if they started now and nothing else happened (no replies; awaited events never come). Uses the draft if there is one. Nothing is sent or changed.

id
required
string format: uuid
Media typeapplication/json
object
threadId

Try it with this thread (and its contact)

string format: uuid
contactId

Or with this contact (their latest thread)

string format: uuid
definition

Try these steps (else the draft, else the live version)

object
version
number
default: 1
Allowed values: 1
trigger
required
One of:
object
type
required
string
Allowed values: event
events
required
Array<string>
>= 1 items <= 10 items
conditions
Array
default: <= 20 items
Any of:
Any of:
object
type
required
string
Allowed values: field
field
required
string
/^(event|contact|consent|thread|time|company)\.[A-Za-z0-9_.]{1,100}$/
op
required
string
Allowed values: equals not_equals in not_in contains not_contains is_set is_not_set greater_than less_than is_true is_false in_last_days in_next_days more_than_days_ago
value
Any of:
string
<= 500 characters
conditions
Array
default: <= 20 items
Any of:
Any of:
object
type
required
string
Allowed values: field
field
required
string
/^(event|contact|consent|thread|time|company)\.[A-Za-z0-9_.]{1,100}$/
op
required
string
Allowed values: equals not_equals in not_in contains not_contains is_set is_not_set greater_than less_than is_true is_false in_last_days in_next_days more_than_days_ago
value
Any of:
string
<= 500 characters
steps
required
Array
<= 100 items
Any of:
object
id
required
string
/^[A-Za-z0-9_-]{1,40}$/
type
required
string
Allowed values: wait
wait
required
One of:
object
kind
required
string
Allowed values: duration
duration
required

How long. working counts only opening hours (minutes and hours), or days the location opens (days)

object
amount
required
integer
>= 1 <= 100000
unit
required
string
Allowed values: minutes hours days weeks
working
boolean
exits
object
contactReplied
boolean
default: true
teamReplied
boolean
threadClosed
boolean
default: true
events
Array<string>
default: <= 20 items
reentry
object
kind
required
string
Allowed values: once once_per_thread once_per_thread_per_day every_n_days always
days
integer
>= 1 <= 3650
Media typeapplication/json
object
wouldStart
required

They match the trigger’s and the flow’s conditions

boolean
reason
required

Why they would not start

string
nullable
status
required

Where they would end up

string
Allowed values: waiting running finished exited failed
exitReason
required
string
nullable
Allowed values: contact_replied team_replied thread_closed event opted_out erased no_contact wait_timeout step_missing removed
steps
required
Array<object>
object
at
required

When it would happen

string format: date-time
stepId
required
string
nullable
stepType
required
string
outcome
required
string
Allowed values: started waiting resumed timed_out then else deferred skipped done failed finished exited
detail
required

As in a run’s log: a channel, a reason, a time

string
nullable
preview
required

The words that would be sent, with merge fields filled in

string
nullable

Example

{
"status": "waiting",
"exitReason": "contact_replied",
"steps": [
{
"stepType": "send",
"outcome": "started",
"detail": "Email"
}
]
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Missing or invalid API key

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

The organisation is on the Free plan (code upgrade_required)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
feature
required

The feature that needs Pro

string
nullable
Allowed values: extraSeats connections aiAssistant aiReplies rules fullReports api inboxes bulkMessages videoMessages
upgradePath
required

Where to upgrade or pay, in the web app

string

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)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Rate limit reached

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
retryAfter
required

Seconds until another request will be accepted

number

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
}