Documentation

Everything you need to ship.

Tutorials for the builders, guides for going live, answers to common questions, and the portal API reference.

Guides
How builds & pricing work
Designing your agent in the builder is free. When you're ready you book a quick call — we scope and quote the one-time build (Launch from $1,500, Growth from $3,500, or a custom Scale quote), then build, install, test, and launch it for you. After launch it runs on a month-to-month platform plan (Core, Growth, or Scale).
Writing good agent instructions
Brief the agent like a new employee. Say who it is (“a friendly receptionist for a dental office”), what it must always do (“offer to book before ending any conversation”), and what it must never do (“never quote prices for surgical work”). Concrete beats clever.
Feeding it knowledge
The sharper the source material, the sharper the answers. Give us your site URL, your real FAQs with the answers you actually want given, and any documents customers ask about. Vague inputs produce vague agents.
Going live: what happens after you submit
Every submission is reviewed personally within 24 hours. We confirm scope, collect any missing materials, then build and test. You track every stage from your dashboard, and nothing launches without your sign-off.
FAQ
Do I need to know how to code?
No. The Studio is plain-language steps; the Canvas is drag-and-drop. And you can always skip both and just tell us what you want built.
Will the agent sound like a robot?
You choose the tone — professional, friendly, direct, luxury concierge, casual — and tune how creative or focused it should be. Voice agents use natural, human-like speech.
What if it gives a wrong answer?
Guardrails define what your agent must never do, with your choice of enforcement: block, rephrase, or flag for review. Anything uncertain can hand off to a human.
Who owns what gets built?
You do. Systems, content, configuration — everything we deploy is yours, with no dependencies or ransoms.
How fast do you respond?
Every inquiry and every build submission gets a personal response within 24 hours, usually faster.
Integrations

Connect real business tools from Portal → Integrations. Every connection is real OAuth and real API calls — there's no simulated "Connected" state. Until the server has credentials configured for a provider, its card there honestly says so.

Google Calendar
Connect a real Google Calendar, then enable the “Calendar booking” capability on an agent. Mid-conversation, once a customer agrees on a time, the agent creates a real event — with a real Google Meet link attached — on the connected calendar via the create_calendar_event tool-call.
Zoom
Connect a real Zoom account, then enable the “Zoom scheduling” capability on an agent. The agent can schedule a real Zoom meeting mid-conversation via create_zoom_meeting and share the real join link. The same action is available outside chat via POST /api/v1/meetings for API-key customers, and every scheduled meeting is listed under the Zoom card in Portal → Integrations.
Meta (Facebook/Instagram)
Connect a real Facebook Page to sync its Lead Ads submissions straight into your CRM — idempotent by Meta's leadgen_id, so re-syncing never creates duplicates. Runs on a real-time webhook where Meta app review allows it, a manual “Sync now” button otherwise, and a scheduled daily fallback. Also publishes real text/link posts to the connected Page and returns the real post id.
API Reference — Client Portal

The portal speaks JSON to this app's own /api/** route handlers. Every request is authenticated with a bearer access token that refreshes automatically on expiry. Your account is created from the dashboard.

POST /api/auth/login
Content-Type: application/json

{ "email": "you@business.com", "password": "..." }
/api/auth/signup · /api/auth/login · /api/auth/logout · /api/auth/refresh
Account lifecycle. Signup takes orgName, email, password (8+ chars), and an optional name. Refresh exchanges a refresh token for a new session automatically — the front-end client handles this for you on any 401.
/api/auth/request-password-reset · /api/auth/reset-password
Real password reset. Requesting one always returns the same response, whether or not the email matches an account, and emails a one-time link that expires in an hour. Completing it signs out every other session on that account too.
/api/agents
Create and list your agents. Each agent stores its type, instructions, tone, and configuration — including, from the Canvas, its full workflow graph.
/api/agents/[id]/messages
Send and receive messages with a live agent, backed by a real OpenAI-powered chat runtime with tool-calling (including calendar booking when Google Calendar is connected).
/api/leads
No-account submissions from the Custom Development and Contact forms. Takes name, email, optional phone, a source, and an optional config object.
/api/billing/checkout · /api/billing/portal · /api/billing/webhook
Real Stripe-backed billing: create a checkout session, open the customer billing portal, and receive webhook events that keep your plan and usage limits in sync.
/api/v1/agents · API-key access

Programmatic access to your agents using an API key minted in your Client Portal (Account → API keys). Send the key as Authorization: Bearer whai_… or X-API-Key: whai_…. Revoked keys stop working immediately; every call updates the key's last-used timestamp.

curl https://west-hill-ai-v1.vercel.app/api/v1/agents \
  -H "Authorization: Bearer whai_YOUR_KEY"
/api/v1/agents/:id/chat · chat with your agent by API

Send a message to one of your ACTIVE agents and get its real AI reply — the same OpenAI pipeline, conversation persistence, and usage metering as the in-app chat. Pass back the returned conversationId to continue a thread.

curl -X POST https://west-hill-ai-v1.vercel.app/api/v1/agents/AGENT_ID/chat \
  -H "Authorization: Bearer whai_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "What are your hours?"}'
POST /api/v1/meetings
Same API-key auth as above — schedules a real Zoom meeting on your connected account. Takes topic, startIso, and durationMinutes, and returns the real joinUrl.
POST /api/v1/messages
Same API-key auth as above — sends a message to one of your agents outside the Portal session. Takes agentId, message, and an optional conversationId to continue an existing conversation (omit it to start a new one).
/api/v1/usage · your plan and usage by API

Your org's real plan, usage allotment, renewal date, and tokens used in the window (?days=1..90, default 30) — the same numbers your dashboard shows.

curl https://west-hill-ai-v1.vercel.app/api/v1/usage   -H "Authorization: Bearer whai_YOUR_KEY"
/api/v1/tracking-sites · pull your web analytics by API

List the websites you track with West Hills Web Analytics, then pull real stats for any of them: views 24h/7d/30d, a daily series, and top pages, referrers, and countries.

curl https://west-hill-ai-v1.vercel.app/api/v1/tracking-sites   -H "Authorization: Bearer whai_YOUR_KEY"

curl https://west-hill-ai-v1.vercel.app/api/v1/tracking-sites/SITE_ID/stats   -H "Authorization: Bearer whai_YOUR_KEY"
/api/v1/leads · pull your CRM leads by API

Lists your org's leads (synced ad-platform inquiries, agent-conversation leads), newest first. Filter with ?status=NEW|CONTACTED|QUALIFIED|CLOSED and page with ?page= / ?pageSize= (default 20, max 100).

curl https://west-hill-ai-v1.vercel.app/api/v1/leads?status=NEW   -H "Authorization: Bearer whai_YOUR_KEY"