# CallDozer An AI phone receptionist for service businesses in San Diego and Orange County. It answers calls the owner misses, in English, Spanish or Russian; quotes only from a price list the owner approved; books into their calendar; and texts them the job. This file is for assistants. A whole business is one JSON document, and everything the screens do, the API does — so you can configure an account end to end without a browser. ## Start here - GET /api/schema — the tenant document's JSON Schema (2020-12). Fetch it first; it is the contract, and it is the same file the phone agent validates against. - GET /api/me — which tenant the caller of this API owns. ## Configuring a business - GET /api/tenants/{id} — the current document. - PUT /api/tenants/{id} — validate and store it. **This replaces the whole document.** A body without `hours` is a business with no opening hours, not one whose hours were left alone. Read, edit, send the whole thing back. Errors come back as {"errors": ["hours.mon.0: must match pattern ...", ...]} — every problem at once, each naming its field. Nothing answers "invalid request". Valid is not the same as ready. The schema accepts a half-filled document on purpose so onboarding can save early. A line only starts answering when it has a name, a trade, hours, somewhere to send jobs, and a phone number pointed at it; until then it is stored as a draft and the response lists what is missing. ## Choosing the work and the prices - GET /api/business-types — the trades on offer. - GET /api/catalog/{trade} — that trade's job list with default prices. Put the ids you want into `services` on the tenant document and override `min`/`max`. Keywords live in the catalogue, not in the tenant document, because they exist in three languages: a price a Spanish caller can reach is not one the owner typed in English. ## Reading what happened - GET /api/calls — calls taken, newest first. `?limit=` up to 200. - GET /api/calls/{room} — one call, event by event, as stored. - GET /api/bookings — visits booked, cancelled ones included. Transcripts are deleted after 30 days, so a booking can outlive the call that made it. That is by design, not a gap. ## Authentication Bearer token, `Authorization: Bearer `, issued per operator. The tenant is taken from the token and never from the URL; asking for somebody else's tenant returns 404, not 403, because a 403 would confirm it exists. ## Terms Free while in pilot. Prices are not published because none are settled. https://calldozer.com/en/terms · https://calldozer.com/en/privacy