VOICE API / DEVELOPER QUICKSTART
INTEGRATION GUIDE
v2.3 · 16 OCT 2026
CONNECT YOUR CRM TO YOUR TELEPHONY

One API. A direct line to your clients.

Make calls, follow call activity and retrieve recordings through a token-authenticated HTTPS API. No private-network connection is required for your CRM backend.

BASE URL · HTTPS PORT 443https://voice-api.tychedevs.com/api/v1
PUBLIC API · PRIVATE TELEPHONY
CRM interfaceYour existing user session
→
Your CRM backendStores the API token
→
Voice APIPublic HTTPS + bearer token
→
Telephony systemPrivate Tailscale connection

01 Get connected

⌁
Request a token and an authorized agent extension.

Your administrator sets your organization, enabled features, token scopes and expiry. Keep it in your CRM backend’s secret store. Never embed it in frontend code or URLs.

CHECK SERVICE READINESS
export VOICE_API_TOKEN='YOUR_TOKEN'
curl --fail-with-body \
  'https://voice-api.tychedevs.com/api/v1/status' \
  -H "Authorization: Bearer $VOICE_API_TOKEN"

Expect 200. Check ami_connected, outbound_enabled and recording_storage_available. Calling must be enabled by the administrator.

02 Place a test call

POST /CALLS · REPLACE THE EXAMPLE NUMBER
curl --fail-with-body -X POST \
  'https://voice-api.tychedevs.com/api/v1/calls' \
  -H "Authorization: Bearer $VOICE_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: crm-test-001' \
  --data '{"agent_extension":"115",
    "destination":"09171234567",
    "number_type":"ph_mobile",
    "client_id":"crm-client-123"}'
The agent phone rings first. Answer it to connect the destination. Use a number you control. This example uses an existing phone. For one-click browser audio, follow the Browser Webphone guide.

client_id is an optional CRM reference. A 202 response contains the call id; it means accepted, not answered. Use a new idempotency key for each intended call. Reuse the same key only when retrying the same payload. Never automatically redial an unknown outcome.

03 Add the call button to your CRM

Your UI sends the selected client and number to your CRM backend. Your backend checks the CRM user’s permissions, calls POST /calls and returns the call ID. Poll GET /calls/{id} to update the UI. Centralize polling; incoming calls can be observed with GET /calls?direction=inbound.

Typical states: queued → agent_ringing → dialing → ringing → answered → completed. Busy, no_answer, failed and unknown are also possible; not every intermediate state is observed.

04 Choose the number format

Destinationnumber_typeInput example
Philippine mobileph_mobile09171234567or +639171234567
Philippine landlineph_landline0281234567Include 0 + area code
Internationalinternational+442079460123+ country code + number

Send the number as a string, without spaces or route prefixes. The telephony system uses its existing routing and carrier permissions.

05 The endpoints you need

Method / path, relative to base URLPurpose
GET/statusConnection and service readiness
POST/callsCreate an agent-first call
GET/callsCall activity; direction / updated_since
GET/calls/{id}Current status of a tracked call
GET/calls/{id}/recordingsConfirmed recordings + match status
GET/recordingsSearch date, number, extension, direction
GET/recordings/{id}Audio availability and metadata
GET/recordings/{id}/audioWAV playback; byte ranges supported
calls:readcalls:writerecordings:read

Client tokens are organization-scoped and restricted by enabled features and assigned resources. Tokens expire; revoked or expired tokens return 401.

06 Find and play recordings

  • Search /recordings?date=2026-10-15&limit=50. Dates use Manila time. Follow next_cursor until null.
  • When status=available, use the returned audio_url with bearer authentication. Add ?download=true to download.
  • For browser playback, stream through an authenticated CRM backend route and forward the Range header. A partial response returns 206.

New audio may take several minutes. Completeness is unverified. Call-to-recording candidates require operator confirmation; don’t treat an empty pending list as a failure.

07 Handle responses clearly

401 / 403Invalid token, scope or disabled feature
400 / 422Check fields, extension and number
409Key conflict or audio processing
429Rate or daily call limit; respect Retry-After
503Disabled call service / unavailable audio
200 / 202 / 206Read / accepted / partial audio

Application limit: 240 requests/minute per token. Additional per-IP and concurrency limits apply. Keep credentials on the server; direct browser CORS integration is not enabled.