Base URL: https://www.proon.ai/api/v1
Every endpoint requires bearer-token authentication. Responses are JSON. Lists are cursor-paginated.
Send a GET to /me with your bearer token to verify the key works and see your organization.
curl https://www.proon.ai/api/v1/me \
-H "Authorization: Bearer prn_live_xxxxxxxxxxxx..."json{
"object": "organization",
"id": "1f95...",
"name": "Joe's Pizzeria",
"industry": "restaurant",
"subscription_tier": "growth",
"subscription_status": "active",
"created_at": "2026-04-12T18:03:11Z",
"api_scopes": ["read"]
}/meReturns the organization tied to the API key. Use this to verify the key is valid + your scopes.
curl https://www.proon.ai/api/v1/me -H "Authorization: Bearer prn_live_xxxx..."json{
"object": "organization",
"id": "1f95...",
"name": "Joe's Pizzeria",
"industry": "restaurant",
"subscription_tier": "growth",
"subscription_status": "active",
"created_at": "2026-04-12T18:03:11Z",
"api_scopes": ["read"]
}/agentsLists every AI agent in your organization. Most orgs have one.
curl https://www.proon.ai/api/v1/agents -H "Authorization: Bearer prn_live_xxxx..."json{
"object": "list",
"data": [
{
"object": "agent",
"id": "ag_8a0c...",
"name": "Aria",
"persona_id": "aria",
"voice_id": "11labs-Adrian",
"phone_number": "+14155550123",
"status": "active",
"greeting_style": "casual_friendly",
"created_at": "2026-04-12T18:03:11Z",
"updated_at": "2026-05-23T11:22:45Z"
}
]
}/callsPaginated call history, newest first. Cursor pagination via starting_after.
limitItems per page (default 25, max 100).starting_afterCursor: the `id` of the last call from the previous page.outcomeFilter to a specific outcome (e.g. `voicemail`, `transferred`, `completed`).curl 'https://www.proon.ai/api/v1/calls?limit=10&outcome=voicemail' \
-H "Authorization: Bearer prn_live_xxxx..."json{
"object": "list",
"data": [
{
"object": "call",
"id": "call_7f3a...",
"agent_id": "ag_8a0c...",
"phone": "+14155550100",
"duration_sec": 87,
"outcome": "voicemail",
"transcript": "Caller: Hi I'd like to...",
"recording_url": "https://...mp3",
"transferred": false,
"transfer_to": null,
"transfer_succeeded": null,
"detected_language": "en",
"created_at": "2026-05-30T18:03:11Z"
}
],
"has_more": true
}/voicemailsPaginated voicemails, newest first. Filter to unread with ?reviewed=false.
limitItems per page (default 25, max 100).starting_afterCursor: the `id` of the last voicemail from the previous page.reviewed`true` for already-reviewed, `false` for unread.curl 'https://www.proon.ai/api/v1/voicemails?reviewed=false' \
-H "Authorization: Bearer prn_live_xxxx..."json{
"object": "list",
"data": [
{
"object": "voicemail",
"id": "vm_2f1c...",
"call_id": "call_7f3a...",
"phone": "+14155550100",
"customer_name": "Sarah",
"message_text": "Hi, I'm calling about catering for...",
"reason": "after_hours",
"reviewed": false,
"callback_made": false,
"notes": null,
"created_at": "2026-05-30T18:03:11Z"
}
],
"has_more": false
}List endpoints use cursor pagination (not offset). To fetch the next page, take the id of the last item in your current results and pass it as starting_after:
curl 'https://www.proon.ai/api/v1/calls?limit=50' -H "Authorization: Bearer prn_live_xxxx..."
# response includes the last call's id, e.g. "call_7f3a..."
curl 'https://www.proon.ai/api/v1/calls?limit=50&starting_after=call_7f3a...' -H "Authorization: Bearer prn_live_xxxx..."Stop when has_more is false.
Errors return JSON with error (code) and message (human description):
json// 401 Unauthorized
{ "error": "unauthorized", "message": "Provide a valid API key..." }
// 400 invalid_cursor
{ "error": "invalid_cursor", "message": "No call with id \"call_xyz\" in your org." }
// 404 not_found
{ "error": "not_found", "message": "Voicemail not found" }
// 500 server_error
{ "error": "server_error", "message": "Something went wrong on our end." }We version the API in the URL path (/api/v1/...). Breaking changes ship as /api/v2/...with at least 90 days of notice via a per-key email. Adding fields to a response is not a breaking change. Clients should ignore unknown fields.