Back to docs
API · v1

REST API reference

Base URL: https://www.proon.ai/api/v1

Every endpoint requires bearer-token authentication. Responses are JSON. Lists are cursor-paginated.

Quick start: verify your key

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"]
}
GET/me

Returns the organization tied to the API key. Use this to verify the key is valid + your scopes.

Example request

curl https://www.proon.ai/api/v1/me -H "Authorization: Bearer prn_live_xxxx..."

Example response

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"]
}
GET/agents

Lists every AI agent in your organization. Most orgs have one.

Example request

curl https://www.proon.ai/api/v1/agents -H "Authorization: Bearer prn_live_xxxx..."

Example response

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"
    }
  ]
}
GET/calls

Paginated call history, newest first. Cursor pagination via starting_after.

Query parameters

  • 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`).

Example request

curl 'https://www.proon.ai/api/v1/calls?limit=10&outcome=voicemail' \
  -H "Authorization: Bearer prn_live_xxxx..."

Example response

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
}
GET/voicemails

Paginated voicemails, newest first. Filter to unread with ?reviewed=false.

Query parameters

  • 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.

Example request

curl 'https://www.proon.ai/api/v1/voicemails?reviewed=false' \
  -H "Authorization: Bearer prn_live_xxxx..."

Example response

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
}

Pagination

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

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." }

Versioning

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.