Public booking API
Book a consultation with an AI agent.
Any agent that can make HTTP requests can check availability and book an authorized consultation. No signup or API key is needed for the public flow.
Interactive booking in chat
MCP Apps-compatible hosts can open a project form with Photo & Video, Web & App, and Marketing & Ops choices. Buyers share their project and contact details first, then choose a time in their timezone and review before confirming. The integration must be connected in the host; finding this page in web search does not automatically load a calendar.
https://werz.ai/api/agent/public/mcp
Use Streamable HTTP with no authentication. Tools: werz_check_availability, werz_open_booking_calendar and werz_confirm_booking. MCP confirmation requires a service selection; use FULL_SERVICE for multiple services and list them in the notes. The interface also records minimal progress events without contact details. Booking requests follow the same validation, rate limits and retry rules as the public API.
From availability to confirmation
1. Discover
Read /agent-booking.json or import the OpenAPI schema. The public endpoints require no API key, account, browser cookie, or admin access.
2. Find a time
GET /api/agent/public/availability. With no parameters it checks the next 14 days. Optional start and end dates use YYYY-MM-DD; ranges are limited to 30 days within the next 60 days. Choose a slot whose available flag is true.
3. Confirm with the buyer
Collect their name, email and real callback number with country code. Show the exact appointment in their local timezone and obtain permission to book it. The API's date and startTime must remain in America/Los_Angeles, which observes daylight saving time.
4. Book
Generate a fresh random UUID v4 and keep it private as idempotencyKey. POST JSON with userConfirmed: true, timezone: America/Los_Angeles, and source naming your agent. A successful request reserves a real 30-minute consultation and uses the normal confirmation and calendar workflow. It does not opt the buyer into SMS.
5. Report the result
Only report a confirmed booking when success is true and booking.status is CONFIRMED. Show the returned date, time, timezone, meeting link and any warning. Email acceptance is not proof of inbox delivery. Keep cancellation links and retry keys private.
Booking fields
- name, email, phone
- Required. Real buyer details. Phone should include +country code; US and German numbers are supported.
- date, startTime
- Required. An offered YYYY-MM-DD date and HH:MM time in America/Los_Angeles. Do not submit a German local time as a Pacific time.
- timezone
- Required: America/Los_Angeles.
- userConfirmed
- Required: true, only after the buyer authorizes this booking.
- idempotencyKey
- Required. A fresh random UUID v4 for a new booking intent. Reuse it on every retry.
- source
- Required. Your caller label, such as chatgpt, claude or a workflow name. This is self-reported attribution.
- company, notes
- Optional project context. Notes may contain up to 2,000 characters.
- service
- Optional: VIDEO_PRODUCTION, WEB_DEVELOPMENT, MARKETING or FULL_SERVICE.
- budget
- Optional: UNDER_5K, 5K_10K, 10K_25K, 25K_50K, 50K_PLUS or NOT_SURE.
- locale
- Optional: en or de, for confirmation language.
Example requests
The placeholders below are not valid bookings. Read live availability and use the buyer's confirmed details.
curl https://werz.ai/agent-booking.json
curl https://werz.ai/api/agent/public/availability
# Replace placeholders with buyer-approved details and an offered Pacific slot.
# Generate a fresh UUID v4 once; keep it unchanged on retries.
curl -X POST https://werz.ai/api/agent/public/booking \
-H 'Content-Type: application/json' \
-d '{
"name": "BUYER_NAME",
"email": "BUYER_EMAIL",
"phone": "BUYER_PHONE_WITH_COUNTRY_CODE",
"date": "OFFERED_YYYY-MM-DD",
"startTime": "OFFERED_HH:MM",
"timezone": "America/Los_Angeles",
"userConfirmed": true,
"idempotencyKey": "FRESH_PRIVATE_UUID_V4",
"source": "your-agent-name",
"service": "VIDEO_PRODUCTION",
"locale": "en"
}'Retries and errors
A used retry key returns its original reservation, including its actual slot, even when a later request names a different slot. It does not move the appointment. For changes, use the booking management link or contact WERZ.
- 400
- Read error/details and correct the fields. Do not invent buyer details or confirmation.
- 403 / 415
- Use a server-side HTTP client and Content-Type: application/json. The endpoint does not allow cross-site browser submissions.
- 409
- Read code. SLOT_TAKEN or DAILY_LIMIT_REACHED needs a different offered slot and renewed buyer confirmation. BOOKING_BUSY means retry the same intent after a short delay.
- 413
- Reduce the request body; the limit is 16 KiB.
- 429
- Wait for Retry-After seconds. Limits: 60 availability requests/minute/IP; 5 booking attempts/hour/IP and 5/hour/email. Retries count toward these limits.
- Timeout / 5xx
- The booking may already exist. Retry the same payload, email and idempotencyKey. Do not generate a new key just because the response was lost.
Existing keyed integrations
Existing keys with the bookings scope continue to use /api/agent/capabilities, /api/agent/booking/availability, /api/agent/booking and /api/agent/rate-limit. These routes require a bearer key. Internal management scopes remain separate from public consultation booking.
Manage existing integration keysKeyed integration contractFull API reference
The public OpenAPI contract contains the complete request and response schemas and can be imported directly into an HTTP-capable agent or API client.
Open the public OpenAPI contract