Developers and coding agents

Build an AI receptionist for your client

Configure a small business’s AI receptionist with Claude Code, Codex or another coding agent: owner-approved knowledge, services and one inbox, with website chat, voice and SMS checked separately.

Start with the receptionist

Give your client an AI receptionist that knows their actual services, prices, hours and handoff rules. Latchbell provides the business knowledge, appointment and request tools, and shared inbox. You can configure it over MCP or REST while building the client’s website.

Website chat, voice and SMS have separate setup requirements. Publishing knowledge or finishing setup does not activate all three. Check receptionist_readiness before promising a channel is ready, then verify its real customer experience with the owner.

Read this guide as Markdown · Owner setup skill and OAuth helper · Live front desk OpenAPI · MCP endpoint · Pricing

1. Connect the owner’s business

Give your coding agent https://stagingagents.latchbell.com/business.md. It contains the complete setup sequence and explains the single-file Node helper used below. Download the helper into your working directory; no npm package or shared API key is needed.

For MCP, connect https://stagingagents.latchbell.com/mcp using your client’s OAuth flow and read tools/list. For REST, inspect the live front desk OpenAPI before calling an operation, then use the helper. Confirm that receptionist_readiness is available; if it is absent, use the documented reads and ask Latchbell to check channel configuration. The business owner signs in and consents in Latchbell’s browser window. A new owner creates their business there; never ask them to paste a code, password or token into the coding agent.

curl -fsS --output latchbell.mjs 'https://stagingagents.latchbell.com/developers/latchbell.mjs'
curl -fsS --output latchbell-openapi.json 'https://stagingagents.latchbell.com/openapi.json?tag=front-desk'
export LATCHBELL_CLIENT_NAME='Codex'
# Or export LATCHBELL_CLIENT_NAME='Claude Code'; keep it set for later calls.
node latchbell.mjs signin new
# Existing business: node latchbell.mjs signin
node latchbell.mjs GET my_business
node latchbell.mjs GET front_desk
# Confirm receptionist_readiness exists in the live spec before calling it.
node latchbell.mjs GET receptionist_readiness

The helper keeps OAuth credentials locally with restricted file permissions. Keep them out of source control, generated sites, screenshots and logs. Use the exact business returned by my_business; do not configure a different client’s account.

2. Configure a salon starter

The following fictional salon is a setup fixture for a dedicated test business. It is not a real business’s price list. For a client, replace every fact with owner-provided information and review changes with them before saving. These commands change setup; they do not place a test call or send a customer message.

node latchbell.mjs POST add_receptionist_source '{"title":"Fictional salon fixture","note":"Juniper Demo Salon is fictional. A haircut is $65 for 45 minutes, payable at the visit. Open Tuesday through Saturday, 9am to 5pm in the business time zone. Appointment requests need owner confirmation. Ask the owner about color treatments, cancellations and anything not listed; do not invent a policy."}'
node latchbell.mjs POST update_booking_setup '{"settings":{"enabled":true,"services":[{"id":"haircut","name":"Haircut","duration":45,"priceCents":6500,"payment":"later"}],"hours":{"2":[[540,1020]],"3":[[540,1020]],"4":[[540,1020]],"5":[[540,1020]],"6":[[540,1020]]},"leadMinutes":120,"bufferMinutes":15}}'
node latchbell.mjs POST update_front_desk '{"settings":{"kind":"beauty","bookingMode":"request","greeting":"Thanks for contacting Juniper Demo Salon. How can we help?","handoff":"Ask the owner about unlisted services, policy exceptions or any request for a person."}}'
node latchbell.mjs GET receptionist

To teach a real receptionist, use add_receptionist_source for the owner’s website or notes, or the helper’s FILE command for their menu photos and PDFs. Reading and rebuilding happen in the background. Wait until still_reading is false and no source is queued, then compare the draft against the originals. Correct misread prices and unresolved questions before publishing.

The example uses bookingMode: request, so the receptionist asks the owner to confirm. For direct appointments, review the fixed prices, durations, business time zone, hours and availability first, then change to bookingMode: confirm only at the owner’s request. Customers must approve the service, price and a live time before book_appointment; only a confirmed result is a booking. For staff and multi-service selection menus, follow service_setup and the live OpenAPI instead of assuming this single-service fixture covers them.

3. Review, publish and check each channel

Show the actual draft to the owner. Only after their approval, publish knowledge with update_receptionist and finish front desk setup with update_front_desk. Read readiness again afterwards. Setting complete: true is not a phone activation or a channel test.

# Run only after the owner approves the reviewed draft and setup.
node latchbell.mjs POST update_receptionist '{"publish":true}'
node latchbell.mjs POST update_front_desk '{"complete":true}'
node latchbell.mjs GET receptionist_readiness
node latchbell.mjs GET receptionist_service
ChannelSetup and verification
Website chatThe hosted business page and private conversations feed the inbox. Automatic AI answers require an operator-provisioned Expert Desk for this business; this is not a self-serve activation API. Ask Latchbell to provision it, confirm readiness, and verify an owner-approved test conversation. Without it, requests can wait for the owner.
VoicePhone answering requires an active paid plan and a separately connected, routed line. Read actual rates and state from receptionist_service. The owner completes Stripe checkout and approves number setup or forwarding. An active subscription alone does not prove calls work; verify an incoming call after readiness checks. The current phone gateway supports configured single-service appointments and messages; do not assume it handles catalog orders or reservations.
SMSText messaging currently uses a separately paired relay for the business’s existing phone. The owner pairs it at https://stagingagents.latchbell.com/app/link and keeps it running. The owner or an authorized connected assistant must watch inquiries and answer them with message_customer; website AI chat does not automatically answer SMS. Do not assume every paid voice line can send or receive texts: a text allowance is not hosted SMS activation. Check relay readiness, then verify receipt and reply on an owner-approved test number.

Read channels.website_chat, channels.voice and channels.sms separately. Each provides next actions identifying whether the owner, assistant or Latchbell operator must act. verification.basis: saved_configuration and live_verified: false mean the report has not performed a live test. Never buy a number, activate a paid plan, place a call or send a text merely to exercise this guide. Agree on the channel, cost, destination and test with the owner first; a successful channel test establishes the actual experience.

4. Verify the handoff to the inbox

Start with read-only calls: check business_info for the exact business id or slug returned by the owner’s account, and receptionist_readiness for the owner’s setup. The following is an example contact_business request body, not a command to send it. Use only an authorized test business and an agreed test; sending it creates a real conversation and can notify or invoke the business’s connected services.

{
  "business": "REPLACE_WITH_AUTHORIZED_TEST_BUSINESS_ID",
  "customer_name": "Demo Customer",
  "message": "TEST: Please ask the owner about a haircut on Saturday afternoon.",
  "request_type": "appointment"
}

A successful request returns a private conversation and reply_token. Keep the token private; use inquiry_status to check replies and follow_up_business for the same conversation. Check the owner’s inquiries and inbox to confirm the handoff. A request is not a confirmed appointment, order, inventory hold or payment. Replying with message_customer can contact a real customer; do it only when authorized.

For the owner’s acceptance check, verify a known-price question, an unknown-policy question that reaches the owner, and a request appearing in the inbox. Test chat, voice and SMS independently for the channels the client has chosen. This guide performs no external test messages by default.

Use the supported integration surface