Test your voice agent in one line of code
One HTTP call with an inline persona, scenario, and endpoint. Get back a transcript, eval scores, a pass/fail verdict, and a recording URL. Phone, LiveKit, and more. No pre-registration required.
Python (REST API)
import os
import time
import requests
base_url = "https://api.noveum.ai/api"
headers = {"Authorization": f"Bearer {os.environ['NOVEUM_API_KEY']}"}
config = {
"endpoint": {"type": "phone", "phoneNumber": "+14155551234", "phoneCountryCode": "+1"},
"persona": {"name": "Frustrated customer", "goal": "Cancel subscription"},
"scenario": {"name": "Cancellation", "description": "Caller insists on canceling"},
"mode": "voice",
"eval": True,
}
response = requests.post(f"{base_url}/v1/developer/calls", json=config, headers=headers, timeout=30)
response.raise_for_status()
call_id = response.json()["callId"]
while True:
result = requests.get(f"{base_url}/v1/developer/calls/{call_id}", headers=headers, timeout=30).json()
if result["status"] in ("completed", "failed", "cancelled"):
break
time.sleep(3)
print(result["status"], result.get("eval"))curl
curl -sS -X POST https://api.noveum.ai/api/v1/developer/calls \
-H "Authorization: Bearer $NOVEUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"endpoint": {"type":"livekit","livekitUrl":"...","livekitApiKey":"...",
"livekitApiSecret":"...","livekitAgentName":"booking-agent"},
"persona": {"name":"New customer","goal":"Book a table for 4"},
"scenario": {"name":"Booking","description":"Restaurant reservation"},
"eval": true
}'MCP (Claude / Cursor)
# In Claude / Cursor with the Noveum MCP server configured:
> Test my voice agent at +14155551234 - try to cancel a subscription.
# Claude reads noveum://developer-calls-playbook, runs the call,
# polls for results, and shows the transcript + eval score.Endpoint types
- Phone (any country)Available
- LiveKitAvailable
- Retell / Vapi / Pipecat / ElevenLabsComing soon
- WebSocketComing soon
Pricing
100 credits / minute × up to 10 minutes = 1,000 credits per call
You are charged for the call duration up to your configured maximum. Batch runs multiply by the number of calls.
How it works
- 1Describe the call
Pass an endpoint, a persona (who is calling and their goal), and a scenario.
- 2NovaSynth calls your agent
A synthetic caller runs a realistic conversation against your live agent.
- 3Get scored results
Get a transcript, eval score, pass/fail result, and recording URL by polling or awaiting the result.
FAQ
- What types of endpoints are supported?
- Use Phone or LiveKit for runnable calls today. Retell, Vapi, Pipecat, ElevenLabs Conversational, and raw WebSocket payloads may be accepted by the API schema, but they are not runnable until the corresponding worker support is released.
- How are evals generated?
- When evaluation is enabled, a completed call can return evaluation status, an available score and pass/fail result, a summary, per-scorer results, and an expiring recording URL. The configured scorers and their compatibility determine what runs.
- Can I use this in CI/CD?
- Yes. From a CI runner, call the Developer Calls API with an HTTP client, poll the call to a terminal status, and apply your own assertion or release policy to the returned pass/fail result. Tag calls with serviceVersion to compare releases. The Python tracing SDK does not ship a pytest plugin.