OpenPhn docs

Quickstart

Make your first call in five minutes.

This walks through sign-up, verification, getting an API key, and placing your first outbound call.

1. Sign up

Go to app.openphn.com/signup, accept the AUP, and create your account.

Verification gate

New accounts start at verification_status=pending_review. API calls return 403 until an admin approves you. Approval usually takes under a business day — email us at the address in your dashboard if it stalls.

2. Bring your Twilio credentials (outbound)

Outbound calls run on your Twilio subaccount. You supply the Account SID and auth token; OpenPhn verifies the credentials and picks an active number from your Twilio numbers list.

curl -X POST https://api.openphn.com/v1/providers/twilio/verify \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "auth_token":  "your-twilio-auth-token"
  }'

A successful response lists numbers on the subaccount. Pick one:

curl -X POST https://api.openphn.com/v1/providers/select-number \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "e164": "+14155551234" }'

Inbound numbers can also be provisioned directly by OpenPhn via a managed subaccount — see Numbers.

3. Get an API key

From the dashboard, go to Settings → API keys and create a key. Keys are sk_live_* (no test/sandbox mode today). The secret is shown once — copy it into your password manager immediately.

export OPENPHN_KEY="sk_live_..."

You can optionally scope a key to specific number_ids and/or a list of permission scopes (calls:create, webhooks:read, etc.). See Authentication.

4. Place your first call

curl -X POST https://api.openphn.com/v1/calls \
  -H "Authorization: Bearer $OPENPHN_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "to": "+14155551234",
    "objective": "Confirm the order #A-14421 ships today",
    "outcome_schema": {
      "will_ship_today": { "type": "boolean" },
      "tracking":        { "type": "string",   "optional": true },
      "eta":             { "type": "datetime", "optional": true }
    },
    "consent_type": "existing_business_relationship"
  }'

Response:

{
  "call_id": "cll_01HV...",
  "status": "queued"
}

OpenPhn dials the number, runs the objective, and populates the outcome at completion.

5. Read the result

Poll or register a webhook. To poll:

curl https://api.openphn.com/v1/calls/cll_01HV... \
  -H "Authorization: Bearer $OPENPHN_KEY"

Once status == "completed", the response includes outcome (typed JSON matching your outcome_schema), transcript, cost_total, and more.

To receive a signed POST when the call completes instead of polling, register a webhook — see Webhooks.

Next steps

  • Concepts — how calls, numbers, flows, and transfers fit together.
  • API reference — every endpoint, auth model, rate limits.
  • MCP quickstart — wire OpenPhn into Claude Desktop.

On this page