API integration guide
Examples of Tadeus API usage
A step-by-step walkthrough for building, deploying, and reading back automated voice campaigns programmatically. Every call hits the Integration API at tadeus.net/api/integration/v1.
Quick setup
Install the two dependencies these examples use, then keep your key id and secret in a local .env file. You generate both in your Tadeus dashboard under API access.
pip install requests python-dotenvCampaign setup
Authenticate every request
The Integration API is keyed, not session-based. Send your key id and secret as headers on every call. Load them from the environment so they never end up in source control.
import os
import requests
from dotenv import load_dotenv
load_dotenv()
BASE_URL = "https://tadeus.net/api/integration/v1"
HEADERS = {
"X-API-KEY-ID": os.environ["TADEUS_API_KEY_ID"],
"X-API-SECRET": os.environ["TADEUS_API_SECRET"],
"Content-Type": "application/json",
}
# Quick check: read your organisation
org = requests.get(f"{BASE_URL}/organisation/", headers=HEADERS)
print(org.status_code, org.json())Create a template
A template defines how the agent interviews and what structured output you expect back. You reuse one template across many campaigns.
template = requests.post(
f"{BASE_URL}/templates/",
headers=HEADERS,
json={
"name": "Benefits enrolment check-in",
"interview_prompt": (
"Interview an employee just after open enrolment. "
"Confirm which plan they chose and whether anything "
"was unclear. Ask one follow-up when an answer is vague."
),
"output_schema": {
"plan_chosen": "string",
"confusion_points": "string[]",
"needs_followup": "boolean",
},
"status": "published",
},
).json()
template_uuid = template["uuid"]
print(template_uuid){
"uuid": "8d1f6c2a-9b40-4e11-bb7a-2f1c0e9a77d3",
"name": "Benefits enrolment check-in",
"version": 1,
"status": "published",
"created_at": "2026-01-12T09:30:00Z"
}Create a campaign
A campaign points at a template and controls access. Set access_type to invite_only for a named workforce, or open for a public link. max_sessions is a safety cap.
campaign = requests.post(
f"{BASE_URL}/campaigns/",
headers=HEADERS,
json={
"name": "Q1 enrolment readiness",
"template_uuid": template_uuid,
"type": "survey",
"access_type": "invite_only",
"max_sessions": 5000,
},
).json()
campaign_uuid = campaign["uuid"]{
"uuid": "c4a7e0b1-2d33-4f88-9c10-7b6e5a4d3f21",
"name": "Q1 enrolment readiness",
"type": "survey",
"access_type": "invite_only",
"active": true,
"created_at": "2026-01-12T09:31:14Z"
}Invitations & sessions
Invite a participant
For an invite-only campaign, add a participant by email. Each invite creates a session that participant can complete in their own language, on their own time.
requests.post(
f"{BASE_URL}/campaigns/{campaign_uuid}/invite/",
headers=HEADERS,
json={"email": "[email protected]", "name": "Alex Doe"},
)Bulk invite participants
Send a whole cohort in one call. Tadeus interviews everyone in parallel, so a 5,000-person rollout does not become 5,000 scheduled calls.
roster = [
{"email": "[email protected]"},
{"email": "[email protected]"},
{"email": "[email protected]"},
]
requests.post(
f"{BASE_URL}/campaigns/{campaign_uuid}/bulk-invite/",
headers=HEADERS,
json={"participants": roster},
)Create an anonymous session
Need responses with no participant attached? Create a session directly and set email_capture_mode to none. People feel safely unwatched, so they speak more freely.
session = requests.post(
f"{BASE_URL}/sessions/",
headers=HEADERS,
json={
"campaign_uuid": campaign_uuid,
"email_capture_mode": "none",
"attempts_allowed": 1,
},
).json()
session_uuid = session["uuid"]{
"uuid": "f02b9d51-7a6e-4c0b-8d2f-1e9c4a6b8021",
"campaign_uuid": "c4a7e0b1-2d33-4f88-9c10-7b6e5a4d3f21",
"status": "not_started",
"email_capture_mode": "none",
"attempts_allowed": 1,
"created_at": "2026-01-12T09:33:02Z"
}List sessions
Track progress by polling sessions for a campaign. Filter by status to find the ones that have completed and are ready to read.
sessions = requests.get(
f"{BASE_URL}/sessions/",
headers=HEADERS,
params={"campaign_uuid": campaign_uuid, "status": "completed"},
).json()
print(sessions["count"], "completed sessions")Collecting results
Read structured results
Every completed session returns a structured result: a summary plus comprehension signals (confidence, relevance, sentiment, engagement) and your template's output_json. No audio to listen back to.
results = requests.get(
f"{BASE_URL}/results/",
headers=HEADERS,
params={"campaign_uuid": campaign_uuid},
).json()
for r in results["results"]:
print(r["short_summary"], r["confidence"], r["sentiment"]){
"count": 1,
"next": null,
"results": [
{
"id": 4821,
"session_uuid": "f02b9d51-7a6e-4c0b-8d2f-1e9c4a6b8021",
"campaign_uuid": "c4a7e0b1-2d33-4f88-9c10-7b6e5a4d3f21",
"short_summary": "Chose the high-deductible plan; found the dependant section confusing.",
"output_json": {
"plan_chosen": "high_deductible",
"confusion_points": ["dependant section"],
"needs_followup": true
},
"confidence": 0.94,
"relevance": 0.91,
"sentiment": 0.2,
"engagement": 0.86,
"validated": true,
"created_at": "2026-01-12T10:04:55Z"
}
]
}Pull a transcript
When you need the raw exchange, read the transcript text directly. Tadeus stores the transcript, never the audio.
transcript = requests.get(
f"{BASE_URL}/transcripts/{transcript_uuid}/",
headers=HEADERS,
).json()
print(transcript["text"])Generate cross-session insights
Roll every result in a campaign into one synthesis. Kick off the job, then read the insight back, or export it as Markdown or PDF for the steering committee.
# Kick off synthesis across the whole campaign
requests.post(
f"{BASE_URL}/campaigns/{campaign_uuid}/generate-insights/",
headers=HEADERS,
)
# Read the insight back
insights = requests.get(
f"{BASE_URL}/insights/",
headers=HEADERS,
params={"campaign_uuid": campaign_uuid},
).json()
insight_uuid = insights["results"][0]["uuid"]
# Export it as Markdown
md = requests.get(
f"{BASE_URL}/insights/{insight_uuid}/md/",
headers=HEADERS,
)
print(md.text)Full endpoint reference, request schemas, and response models live in the API documentation.
Build it into your platform. Start with a key.
Spin up a free Tadeus account, generate an API key, and run your first campaign end to end in an afternoon.
Or book a demo for your team