Front Desk
api

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.

Authentication
Mint an 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.

REST reference
The same endpoints the dashboard uses. Send Authorization: Bearer fdk_live_… (or ?api_key=) on any of them.
GET/api/linesList your phone lines
response
{ "lines": [ { "id": "…", "businessName": "Blue Fern Bistro",
  "e164": "+14155550134", "vertical": "restaurant", "status": "active", … } ] }
POST/api/linesCreate 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
}
response
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.

GET/api/lines/{id}Line detail
response
{ "line": { "id": "…", "status": "active", "suspendReason": null,
  "bookingRules": { … }, "businessHours": { … }, … } }
PATCH/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 }
response
{ "line": { … }, "warning": null }

Free. Every save rebuilds the per-line agent so the phone reflects the change on the next call.

DELETE/api/lines/{id}Cancel a line
response
{ "ok": true,
  "note": "Line cancelled. The number is held for 30 days, then released; no further rental is charged." }
GET/api/lines/{id}/callsCall log with outcomes
response
{ "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.

GET/api/lines/{id}/bookings?from&toThe booking book
response
{ "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.

GET/api/lines/{id}/messagesThe message inbox
response
{ "messages": [ { "id": "…", "callerE164": "+1303555…",
  "body": "For Marco — the walk-in cooler is fixed.", "handled": false } ] }
PATCH/api/bookings/{id}Booking status
{ "status": "cancelled" }   // confirmed | cancelled | no_show | completed
response
{ "ok": true, "status": "cancelled" }

Never deletes — the status trail is the audit log.

PATCH/api/messages/{id}Mark a message handled
{ "handled": true }
response
{ "ok": true }
MCP · for AI assistants and the Ounie AI Team
Streamable HTTP at /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_…
ToolWhat it does
list_linesList your phone lines with call/booking/message stats.
get_lineOne line's full configuration: greeting, hours, rules, transfer.
update_lineChange the greeting, hours, booking rules, or transfer number. The per-line agent rebuilds automatically. Free.
list_callsA line's recent calls with outcomes, duration, and credits.
get_callOne call in full: summary, transcript, recording URL, exact charge.
list_bookingsBookings in a window (default yesterday → +14 days).
set_booking_statusconfirmed · cancelled · no_show · completed.
list_messagesThe phone message inbox.
mark_message_handledMark a message handled (or unhandled).
get_credit_balanceSpendable Ounie credits + a top-up link.
whoamiThe authenticated key's owner + key name.
get_pricingPer-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.

safe by design

x402 · account-less compliance scrub
Annotate up to 500 phone numbers per call: E.164 normalization, state, IANA timezone, the all-party-recording consent flag, and whether the number is inside the compliance calling window right now. $0.002 per number (2,000 atomic USDC each), paid in USDC on Base.
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.

Billing
No subscription. Usage draws your Ounie credit wallet — 1 credit = 1¢.
answered minute15 cr
number rental300 cr / mo
booking captured5 cr
message taken2 cr
unanswered call0 cr

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 →
Compliance notes
  • 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.