curl --request POST \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"number": "+14155550123"
}'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote"
payload = { "number": "+14155550123" }
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({number: '+14155550123'})
};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote', 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/tfu-live-agents/{id}/numbers/quote",
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([
'number' => '+14155550123'
]),
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/tfu-live-agents/{id}/numbers/quote"
payload := strings.NewReader("{\n \"number\": \"+14155550123\"\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/tfu-live-agents/{id}/numbers/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"number\": \"+14155550123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote")
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 \"number\": \"+14155550123\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"quote": {
"confirmation": "0b4c7f5e-1111-4a2b-9c3d-123456789abc",
"number": "+14155550123",
"monthlyPrice": 2,
"monthlyUSD": 2,
"firstChargeUSD": 2,
"currency": "USD",
"expiresAt": "2026-10-16T12:10:00.000Z",
"cardRequired": false,
"terms": {
"number": "+14155550123",
"nowUSD": 2,
"monthlyUSD": 2,
"currency": "USD",
"chargedTo": "agency_wallet",
"callUsage": "charged_separately",
"use": "calls_and_answering"
}
}
}{
"success": false,
"error": "invalid_request",
"code": "invalid_request",
"message": "Please check the details and try again."
}{
"success": false,
"error": "Unauthorized",
"message": "Please sign in to continue."
}{
"success": false,
"error": "InsufficientScope",
"message": "This access key does not allow this action. Please ask your account admin to change its permissions.",
"requiredScope": "agents:write"
}{
"success": false,
"error": "not_found",
"code": "not_found",
"message": "We couldn't find that. It may have been moved or deleted."
}{
"success": false,
"error": "quote_expired",
"code": "quote_expired",
"message": "No purchase was made. Please ask for a fresh price before confirming."
}{
"success": false,
"error": "invalid_request",
"code": "invalid_request",
"message": "Please check the details and try again."
}{
"success": false,
"error": "TooManyRequests",
"message": "That's a lot at once. Please wait a moment and try again."
}{
"success": false,
"error": "line_unverified",
"code": "line_unverified",
"message": "We couldn't finish this right now. Please try again in a moment."
}Quote a TFU Live number
Buying a number for this rep, step 2 of 3: price one number the search offered. The quote says what it costs now and each month, charged to the agency wallet (call usage is charged separately), whether a billing card must be added first (cardRequired), and the confirmation to buy it with, good for ten minutes. State the number and both prices to the user and get their clear yes before buying. Nothing is bought or charged. Machine credentials use the returned tfu_live: agent id.
Required scope: agents:write.
Required API key scope: agents:write.
curl --request POST \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"number": "+14155550123"
}'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote"
payload = { "number": "+14155550123" }
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({number: '+14155550123'})
};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote', 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/tfu-live-agents/{id}/numbers/quote",
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([
'number' => '+14155550123'
]),
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/tfu-live-agents/{id}/numbers/quote"
payload := strings.NewReader("{\n \"number\": \"+14155550123\"\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/tfu-live-agents/{id}/numbers/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"number\": \"+14155550123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/numbers/quote")
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 \"number\": \"+14155550123\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"quote": {
"confirmation": "0b4c7f5e-1111-4a2b-9c3d-123456789abc",
"number": "+14155550123",
"monthlyPrice": 2,
"monthlyUSD": 2,
"firstChargeUSD": 2,
"currency": "USD",
"expiresAt": "2026-10-16T12:10:00.000Z",
"cardRequired": false,
"terms": {
"number": "+14155550123",
"nowUSD": 2,
"monthlyUSD": 2,
"currency": "USD",
"chargedTo": "agency_wallet",
"callUsage": "charged_separately",
"use": "calls_and_answering"
}
}
}{
"success": false,
"error": "invalid_request",
"code": "invalid_request",
"message": "Please check the details and try again."
}{
"success": false,
"error": "Unauthorized",
"message": "Please sign in to continue."
}{
"success": false,
"error": "InsufficientScope",
"message": "This access key does not allow this action. Please ask your account admin to change its permissions.",
"requiredScope": "agents:write"
}{
"success": false,
"error": "not_found",
"code": "not_found",
"message": "We couldn't find that. It may have been moved or deleted."
}{
"success": false,
"error": "quote_expired",
"code": "quote_expired",
"message": "No purchase was made. Please ask for a fresh price before confirming."
}{
"success": false,
"error": "invalid_request",
"code": "invalid_request",
"message": "Please check the details and try again."
}{
"success": false,
"error": "TooManyRequests",
"message": "That's a lot at once. Please wait a moment and try again."
}{
"success": false,
"error": "line_unverified",
"code": "line_unverified",
"message": "We couldn't finish this right now. Please try again in a moment."
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Path Parameters
TFU Live agent id. Never use an ordinary provider agent id.
Query Parameters
Sub-account belonging to the authenticated agency and any narrower credential location binding.
When more than one campaign uses this rep, the one whose calling line to use.
^[a-zA-Z0-9_-]{1,100}$Body
{ number }: one of the candidates the search offered.
One of the candidates the search offered.
^\+[1-9]\d{7,14}$"+14155550123"
