Campaigns
Get one contact's journey
Every touch for a single campaign contact, oldest first: each outbound attempt with its disposition and cost, plus any inbound call the contact made back. Use it to answer “what actually happened to this lead” without stitching sessions together yourself.
GET
/
campaigns
/
{id}
/
contacts
/
{contactId}
/
journey
Get one contact's journey
curl --request GET \
--url https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey', 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.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey",
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: Bearer <token>"
],
]);
$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://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"contact": {
"contact_id": "ct_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"name": "Asha Menon",
"phone": "+919876543210"
},
"events": [
{
"type": "outbound_attempt",
"occurred_at": "2026-08-20T09:04:11.000Z",
"session_id": "s1234567-abcd-1234-abcd-123456789012",
"data": {
"attempt_no": 1,
"disposition": "no_answer",
"answered_by": "not_answered",
"duration_seconds": 0,
"credits_used": 0
}
},
{
"type": "outbound_attempt",
"occurred_at": "2026-08-20T09:34:52.000Z",
"session_id": "s2345678-abcd-1234-abcd-123456789012",
"data": {
"attempt_no": 2,
"disposition": "completed",
"answered_by": "human",
"duration_seconds": 96,
"credits_used": 5.76
}
}
]
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}Authorizations
API key in format: rg_live_xxxx. Pass as a Bearer token in the Authorization header.
Path Parameters
Campaign ID.
Campaign contact ID, not the library contact ID.
⌘I
Get one contact's journey
curl --request GET \
--url https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey', 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.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey",
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: Bearer <token>"
],
]);
$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://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/campaigns/{id}/contacts/{contactId}/journey")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"contact": {
"contact_id": "ct_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"name": "Asha Menon",
"phone": "+919876543210"
},
"events": [
{
"type": "outbound_attempt",
"occurred_at": "2026-08-20T09:04:11.000Z",
"session_id": "s1234567-abcd-1234-abcd-123456789012",
"data": {
"attempt_no": 1,
"disposition": "no_answer",
"answered_by": "not_answered",
"duration_seconds": 0,
"credits_used": 0
}
},
{
"type": "outbound_attempt",
"occurred_at": "2026-08-20T09:34:52.000Z",
"session_id": "s2345678-abcd-1234-abcd-123456789012",
"data": {
"attempt_no": 2,
"disposition": "completed",
"answered_by": "human",
"duration_seconds": 96,
"credits_used": 5.76
}
}
]
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}