Three on-ramps. One credit wallet.
Ounie accounts hit the REST endpoints with a bearer key. AI assistants — including the Ounie AI Team — connect over MCP and get a native tool surface. Account-less agents can pay in USDC via x402 for the lead compliance scrub only. Account usage draws your shared Ounie credits (1 credit = 1¢), and the money is server-enforced — an agent can never overdraw.
fdk_live_… key on Dashboard → API keys. It's shown once; we store only a hash.Authorization: Bearer fdk_live_… # If your client can't set headers, the key can ride the URL: https://frontdesk.ounie.com/api/lines?api_key=fdk_live_…
Already have an Ounie developer key? Turn on “Use across Ounie apps” on ounie.com and your ounie_live_… master key works here too — same header, same URL form, same wallet, every Ounie app.
Authorization: Bearer fdk_live_… (or ?api_key=) on any of them./api/lines— List your phone lines{ "lines": [ { "id": "…", "businessName": "Blue Fern Bistro",
"e164": "+14155550134", "vertical": "restaurant", "status": "active", … } ] }/api/lines— Create a line (buys a phone number){
"businessName": "Blue Fern Bistro",
"brainId": "…", // the Ounie brain that grounds every answer
"vertical": "restaurant", // general | restaurant | clinic | salon | services
"timezone": "America/Los_Angeles",
"areaCode": 415, // optional number preference
"greetingMd": "Ask about the patio!", // optional, ≤500 chars
"businessHours": { "days": { "mon": { "open": "11:00", "close": "22:00" }, "sun": null } },
"transferE164": "+14155550100", // optional human transfer target
"maxCallMinutes": 10, // optional 1–20; drives the per-call deposit
"bookingRules": {
"slot_minutes": 30, "capacity_per_slot": 4,
"min_lead_minutes": 60, "max_days_ahead": 30,
"blackout": ["2026-12-25"]
},
"recordingEnabled": true // forced off for clinics
}201 { "line": { "id": "…", "e164": "+14155550134", "status": "active",
"rentalPeriod": "2026-07", … },
"charged": 300 }
// short on credits → 402, no number bought:
{ "error": "insufficient_credits",
"required_credits": 300,
"balance_credits": 120,
"buy_credits_url": "https://ounie.com/dashboard/settings" }Creating a line provisions a real phone number and charges the first month's rental (300 credits) immediately. Agents CAN call this — but it's a recurring 300 cr/month commitment, so don't let one make it silently.
/api/lines/{id}— Line detail{ "line": { "id": "…", "status": "active", "suspendReason": null,
"bookingRules": { … }, "businessHours": { … }, … } }/api/lines/{id}— Update settings (rebuilds the agent){ "greetingMd": "The patio is open through October.",
"businessHours": { "days": { "mon": { "open": "11:00", "close": "22:00" } } },
"bookingRules": { "capacity_per_slot": 6 },
"transferE164": "+14155550100", // null removes the transfer
"blocklist": ["+14155550999"],
"maxCallMinutes": 8 }{ "line": { … }, "warning": null }Free. Every save rebuilds the per-line agent so the phone reflects the change on the next call.
/api/lines/{id}— Cancel a line{ "ok": true,
"note": "Line cancelled. The number is held for 30 days, then released; no further rental is charged." }/api/lines/{id}/calls— Call log with outcomes{ "calls": [ { "id": "…", "callerE164": "+1720555…",
"status": "analyzed", "outcome": "booked",
"connectedSeconds": 187, "summaryMd": "…", "transcript": "…",
"recordingUrl": "…", "creditsReserved": 165, "creditsSpent": 53 } ] }Reading calls, transcripts, and recordings is free forever.
/api/lines/{id}/bookings?from&to— The booking book{ "bookings": [ { "id": "…", "status": "confirmed",
"partySize": 4, "startsAt": "2026-07-17T19:00:00-07:00",
"callerE164": "+1720555…", "note": "window seat if possible" } ] }from/to are ISO date-times; defaults to yesterday → +14 days.
/api/lines/{id}/messages— The message inbox{ "messages": [ { "id": "…", "callerE164": "+1303555…",
"body": "For Marco — the walk-in cooler is fixed.", "handled": false } ] }/api/bookings/{id}— Booking status{ "status": "cancelled" } // confirmed | cancelled | no_show | completed{ "ok": true, "status": "cancelled" }Never deletes — the status trail is the audit log.
/api/messages/{id}— Mark a message handled{ "handled": true }{ "ok": true }/api/mcp. Auth with an fdk_live_… key or the Ounie master key ounie_live_….// Claude / Cursor / the AI SDK
{
"mcpServers": {
"front-desk": {
"url": "https://frontdesk.ounie.com/api/mcp",
"headers": { "Authorization": "Bearer fdk_live_…" }
}
}
}
// Ounie AI Team (manual MCP entries can't set headers) —
// the key rides the URL instead:
https://frontdesk.ounie.com/api/mcp?api_key=ounie_live_…| Tool | What it does |
|---|---|
| list_lines | List your phone lines with call/booking/message stats. |
| get_line | One line's full configuration: greeting, hours, rules, transfer. |
| update_line | Change the greeting, hours, booking rules, or transfer number. The per-line agent rebuilds automatically. Free. |
| list_calls | A line's recent calls with outcomes, duration, and credits. |
| get_call | One call in full: summary, transcript, recording URL, exact charge. |
| list_bookings | Bookings in a window (default yesterday → +14 days). |
| set_booking_status | confirmed · cancelled · no_show · completed. |
| list_messages | The phone message inbox. |
| mark_message_handled | Mark a message handled (or unhandled). |
| get_credit_balance | Spendable Ounie credits + a top-up link. |
| whoami | The authenticated key's owner + key name. |
| get_pricing | Per-action pricing + the x402 endpoint. Public — no auth required. |
Requests that would overdraw are refused with insufficient_credits and a top-up link — they never partially run.
POST https://frontdesk.ounie.com/api/x402/scrub
{ "numbers": ["+14155550123", "+13035550188"] }
# → 402 { x402Version, accepts: [ { maxAmountRequired, payTo, asset, … } ] }
# sign the quote and retry with the header:
# X-Payment: <signed payload>
# → 200
{ "ok": true, "payment": { … },
"results": [ {
"phone": "+14155550123",
"state": "CA",
"timezone": "America/Los_Angeles",
"all_party_consent": true,
"dialable_now": false
} ] }Honest scope note: x402 covers the scrub utility only. Answering (or placing) calls is never anonymous — Front Desk lines always belong to an Ounie account, so there is an accountable owner behind every number we answer.
| answered minute | 15 cr | billed in 6-second increments |
| number rental | 300 cr / mo | per line, once per month |
| booking captured | 5 cr | flat, per booking |
| message taken | 2 cr | flat, per message |
| unanswered call | 0 cr | no answer, no charge |
Every answered call reserves a deposit first — 15 × max_call_minutes + 15 event headroom — then settles the actual talk time plus bookings and messages at hang-up and refunds the remainder pool-exact. In your Ounie credit ledger, calls settle as frontdesk_call and the number rental as frontdesk_rental.
Rental lifecycle: if the monthly rental can't be reserved you get a 3-day grace (and an email); then the line suspends — callers hear a brief unavailable message, never a dead number, and are never billed. Topping up resumes the line automatically. Cancelled or unpaid lines keep their number on a 30-day hold before release, because losing a phone number is catastrophic.
Buy credits on ounie.com →- The AI disclosure is fixed. Every call opens with the agent identifying itself as an AI assistant. It is not a setting and no greeting can remove it.
- Recording preambles where required. In all-party-consent states a recording notice plays before any recording starts. Owners can turn recording off entirely.
- Clinics: no PHI, no recordings. Lines with the clinic vertical have recording forced off, and the agent never takes medical details — scheduling and callback messages only. Front Desk is not a HIPAA-compliant service and doesn't pretend to be.
- Emergencies go to 911. If a caller describes an emergency, the agent tells them to hang up and dial 911 — it never tries to help with one.
- Caller privacy.Caller phone numbers, transcripts, and messages are visible only to the line's owner — never public, never shared across accounts. See the privacy policy.