Move leads to another step
Move waiting leads to a different step of their schedule. The next call time is recomputed from the target step’s slot in each lead’s own timezone, and any actions still pending on the old step are cleared. Only leads in a waiting status, or stopped by TFU Live for a person, are moved: one that is mid-dial, pinned to a callback, on an appointment-reminder schedule, or whose schedule has no such step is listed in skipped with a reason rather than failing the request. Customer roles: agency_admin, project_user.
Required API key scope: power_dialer:write.
POST
/
api
/
power-dialer
/
move
cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/power-dialer/move \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"queueIds": [
"queue_123",
"queue_456"
],
"targetStep": 2
}'import requests
url = "https://api.teamfollowup.ai/api/power-dialer/move"
payload = {
"queueIds": ["queue_123", "queue_456"],
"targetStep": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({queueIds: ['queue_123', 'queue_456'], targetStep: 2})
};
fetch('https://api.teamfollowup.ai/api/power-dialer/move', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/power-dialer/move",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'queueIds' => [
'queue_123',
'queue_456'
],
'targetStep' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/power-dialer/move"
payload := strings.NewReader("{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.teamfollowup.ai/api/power-dialer/move")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/power-dialer/move")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"count": 1,
"modifiedCount": 1,
"updated": 1,
"skipped": [
{
"queueId": "queue_456",
"reason": "callback-pinned"
}
]
}
}{
"success": false,
"error": "ValidationFailed",
"message": "Some details need fixing. Please check the highlighted fields.",
"errors": [
{
"field": "queueIds",
"code": "FieldRequired",
"message": "Please fill this in."
}
]
}{
"success": false,
"error": "Unauthorized",
"message": "Please sign in to continue."
}{
"success": false,
"error": "Forbidden",
"message": "You don't have access to this. Ask your account admin if you need it."
}{
"success": false,
"error": "TooManyRequests",
"message": "That's a lot at once. Please wait a moment and try again."
}{
"success": false,
"error": "Internal",
"message": "Something went wrong on our side. Please try again in a moment.",
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}Authorizations
Body
application/json
Leads to move, and where to.
⌘I
cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/power-dialer/move \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"queueIds": [
"queue_123",
"queue_456"
],
"targetStep": 2
}'import requests
url = "https://api.teamfollowup.ai/api/power-dialer/move"
payload = {
"queueIds": ["queue_123", "queue_456"],
"targetStep": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({queueIds: ['queue_123', 'queue_456'], targetStep: 2})
};
fetch('https://api.teamfollowup.ai/api/power-dialer/move', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/power-dialer/move",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'queueIds' => [
'queue_123',
'queue_456'
],
'targetStep' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/power-dialer/move"
payload := strings.NewReader("{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.teamfollowup.ai/api/power-dialer/move")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/power-dialer/move")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"queueIds\": [\n \"queue_123\",\n \"queue_456\"\n ],\n \"targetStep\": 2\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"count": 1,
"modifiedCount": 1,
"updated": 1,
"skipped": [
{
"queueId": "queue_456",
"reason": "callback-pinned"
}
]
}
}{
"success": false,
"error": "ValidationFailed",
"message": "Some details need fixing. Please check the highlighted fields.",
"errors": [
{
"field": "queueIds",
"code": "FieldRequired",
"message": "Please fill this in."
}
]
}{
"success": false,
"error": "Unauthorized",
"message": "Please sign in to continue."
}{
"success": false,
"error": "Forbidden",
"message": "You don't have access to this. Ask your account admin if you need it."
}{
"success": false,
"error": "TooManyRequests",
"message": "That's a lot at once. Please wait a moment and try again."
}{
"success": false,
"error": "Internal",
"message": "Something went wrong on our side. Please try again in a moment.",
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}