Get Followup
curl --request GET \
--url https://getbill.io/external-api/v1/followups/{id} \
--header 'Authorization: <authorization>'import requests
url = "https://getbill.io/external-api/v1/followups/{id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://getbill.io/external-api/v1/followups/{id}', 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://getbill.io/external-api/v1/followups/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://getbill.io/external-api/v1/followups/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://getbill.io/external-api/v1/followups/{id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://getbill.io/external-api/v1/followups/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"error": false,
"message": "Success",
"data": {
"id": "abc123def456",
"debt_id": "xyz789ghi012",
"status": "deal_found",
"type": "call",
"call_date": "2024-01-22T10:30:00+00:00",
"scheduled_at": "2024-01-22T10:00:00+00:00",
"summary": "Successfully contacted debtor, agreed to payment plan",
"notes": "Customer was cooperative and agreed to pay €500 monthly starting February 1st. Will send payment schedule by email.",
"call_id": "call_789456",
"audio_url": "https://s3.amazonaws.com/bucket/recordings/call_789456.mp3?X-Amz-Signature=...",
"pdf_url": null,
"duration_ms": 180000,
"disconnection_reason": "completed_successfully",
"direction": "outbound",
"phone_number_used": "+33800123456",
"is_retry": false,
"processed_at": "2024-01-22T10:35:00+00:00",
"triggered_payment": true,
"email_opened": false,
"email_open_count": 0,
"email_first_opened_at": null,
"email_clicked": false,
"email_click_count": 0,
"media_urls_expire_at": "2024-01-22T11:35:00+00:00"
}
}
Followups API
Get Followup
Retrieve detailed information about a specific followup
GET
/
external-api
/
v1
/
followups
/
{id}
Get Followup
curl --request GET \
--url https://getbill.io/external-api/v1/followups/{id} \
--header 'Authorization: <authorization>'import requests
url = "https://getbill.io/external-api/v1/followups/{id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://getbill.io/external-api/v1/followups/{id}', 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://getbill.io/external-api/v1/followups/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://getbill.io/external-api/v1/followups/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://getbill.io/external-api/v1/followups/{id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://getbill.io/external-api/v1/followups/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"error": false,
"message": "Success",
"data": {
"id": "abc123def456",
"debt_id": "xyz789ghi012",
"status": "deal_found",
"type": "call",
"call_date": "2024-01-22T10:30:00+00:00",
"scheduled_at": "2024-01-22T10:00:00+00:00",
"summary": "Successfully contacted debtor, agreed to payment plan",
"notes": "Customer was cooperative and agreed to pay €500 monthly starting February 1st. Will send payment schedule by email.",
"call_id": "call_789456",
"audio_url": "https://s3.amazonaws.com/bucket/recordings/call_789456.mp3?X-Amz-Signature=...",
"pdf_url": null,
"duration_ms": 180000,
"disconnection_reason": "completed_successfully",
"direction": "outbound",
"phone_number_used": "+33800123456",
"is_retry": false,
"processed_at": "2024-01-22T10:35:00+00:00",
"triggered_payment": true,
"email_opened": false,
"email_open_count": 0,
"email_first_opened_at": null,
"email_clicked": false,
"email_click_count": 0,
"media_urls_expire_at": "2024-01-22T11:35:00+00:00"
}
}
Overview
This endpoint returns comprehensive information about a single followup activity, including all details about the communication attempt, results, and related metadata.Authentication
Requires a valid OAuth 2.0 access token with thefollowups:read scope.
Request
string
required
Bearer token for authentication
string
required
The encrypted ID of the followup to retrieve
Example Request
curl -X GET "/external-api/v1/followups/followup_abc123" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const followupId = 'followup_abc123';
const response = await fetch(`/external-api/v1/followups/${followupId}`, {
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const followup = await response.json();
Response
boolean
Always
false for successful requestsstring
Success message
object
Complete followup information
Show followup object
Show followup object
string
Encrypted followup identifier
string
Encrypted debt identifier this followup belongs to
string
Current status. See Enums Reference for all available values (on_hold, scheduled, in_progress, sent, delivered, read, deal_found, no_answer, deal_not_found, bad_behavior, failed, cancelled)
string
Type of followup:
call, email, sms, whatsapp, voicemail, manual_call, physical, postmailstring
When the followup was executed (ISO 8601 format)
string
When the followup was scheduled (ISO 8601 format)
string
Brief summary of the followup results
string
Detailed notes about the followup
string
External call ID from the provider
string
Phone number used for the call
string
Pre-signed URL to the call recording (expires after 1 hour)
string
Pre-signed URL to any associated PDF document (expires after 1 hour)
integer
Duration in milliseconds (for calls)
string
Reason for call disconnection
string
Call direction (inbound/outbound)
boolean
Whether this is a retry attempt
string
Processing timestamp (ISO 8601 format)
boolean
Whether this followup directly triggered a successful payment.
true if the payment link sent via this followup resulted in a paid transaction.boolean
Whether the email was opened (for email followups)
integer
Number of times the email was opened
string
Timestamp of first email open (ISO 8601 format)
boolean
Whether a link in the email was clicked
integer
Number of times links in the email were clicked
string
When the pre-signed media URLs expire (ISO 8601 format). Only present if
audio_url or pdf_url are provided.Success Response
{
"error": false,
"message": "Success",
"data": {
"id": "abc123def456",
"debt_id": "xyz789ghi012",
"status": "deal_found",
"type": "call",
"call_date": "2024-01-22T10:30:00+00:00",
"scheduled_at": "2024-01-22T10:00:00+00:00",
"summary": "Successfully contacted debtor, agreed to payment plan",
"notes": "Customer was cooperative and agreed to pay €500 monthly starting February 1st. Will send payment schedule by email.",
"call_id": "call_789456",
"audio_url": "https://s3.amazonaws.com/bucket/recordings/call_789456.mp3?X-Amz-Signature=...",
"pdf_url": null,
"duration_ms": 180000,
"disconnection_reason": "completed_successfully",
"direction": "outbound",
"phone_number_used": "+33800123456",
"is_retry": false,
"processed_at": "2024-01-22T10:35:00+00:00",
"triggered_payment": true,
"email_opened": false,
"email_open_count": 0,
"email_first_opened_at": null,
"email_clicked": false,
"email_click_count": 0,
"media_urls_expire_at": "2024-01-22T11:35:00+00:00"
}
}
Error Responses
{
"error": true,
"message": "Access denied to this followup",
"code": 403
}
{
"error": true,
"message": "Followup not found or invalid ID",
"code": 404
}