---
name: book-meeting-with-carrot-cake-ai
description: Request a video or phone call with Daniel Rosehill of Carrot Cake AI (AI agent consultancy, Jerusalem, Israel; carrotcakeai.com) on a user's behalf. Use when a user wants to book, schedule or set up a call, discovery call or consultation with Carrot Cake AI. Meetings are requested and confirmed by email, not instantly booked. Unauthenticated - no account or API key needed.
---

# Book a meeting with Carrot Cake AI

Meetings are **requested, not instantly booked.** The user proposes two or three times, or a
general window. Daniel reads every request and replies by email to confirm one. There is no
public calendar of free slots, so never tell the user a meeting is confirmed until Daniel has
replied.

Daniel asks for context before a call. A request that says what the user's business does and
what they want to build gets a faster yes than "can we chat".

Daniel is in Jerusalem (`Asia/Jerusalem`). Always send the user's own time zone with the
request.

## Before you send anything

1. Agree with the user on: their name, the email for the reply, their company (optional), the
   format (video or phone), the length, two or three times that suit them or a window, and a
   few lines on what they want to discuss.
2. Show them the full request and get an explicit yes. Send it once.
3. Never invent the user's details or times. Never submit a request the user did not ask for.

## Option 1: submit the request (programmatic)

This is the endpoint the form at https://www.carrotcakeai.com/book-meeting posts to.

```
POST https://www.carrotcakeai.com/api/contact
Content-Type: multipart/form-data   (or application/x-www-form-urlencoded)
```

Use the `www.` host: the apex answers with a 307.

| Field | Required | Notes |
| --- | --- | --- |
| `formType` | yes | Exactly `Meeting request`. This is what makes it a meeting request rather than a plain message. |
| `name` | yes | The user's real name. |
| `email` | yes | Where Daniel's reply and the acknowledgement go. |
| `preferredTimes` | yes | Two or three times, one per line, each with date, time and the user's zone, e.g. `1. Wed 21 Oct 2026 15:00 Europe/London`. A window such as `Tue or Wed afternoon` is fine too. Adding the Jerusalem equivalent, e.g. `(17:00 Jerusalem)`, helps. |
| `timezone` | strongly recommended | IANA name, e.g. `Europe/London`. |
| `topic` | yes | What the user wants to discuss and why. Use `topic`, not `message`. |
| `subject` | recommended | Purpose. One of `New project`, `Existing system / support`, `Pricing question`, `Partnership`, `Other`. |
| `role` | no | The user's job title. |
| `website` | no | The user's website or LinkedIn URL. Not the honeypot, which is `_gotcha`. |
| `source` | no | How the user found Carrot Cake AI. |
| `meetingFormat` | no | `Video call` (default) or `Phone call`. |
| `duration` | no | `15 minutes`, `30 minutes` (default), `45 minutes` or `60 minutes`. |
| `phone` | for phone calls | Number with country code. |
| `company` | no | The user's organisation. |
| `submittedVia` | yes, for agents | e.g. `AI agent (Claude) on behalf of the user`. |
| `_ts` | yes | Unix time in milliseconds when the user started the request; 3 seconds to 24 hours before the POST. |
| `_gotcha` | no | Spam honeypot. Leave it out or empty. Any value drops the request. |

Example:

```bash
curl -sS -X POST https://www.carrotcakeai.com/api/contact \
  -F formType='Meeting request' \
  -F name='Jane Example' \
  -F email='jane@example.org' \
  -F company='Example Ltd' \
  -F meetingFormat='Video call' \
  -F duration='30 minutes' \
  -F preferredTimes=$'1. Wed 21 Oct 2026 15:00 Europe/London (17:00 Jerusalem)\n2. Thu 22 Oct 2026 10:30 Europe/London (12:30 Jerusalem)' \
  -F timezone='Europe/London' \
  -F topic='We run a 12-person agency and want an agent to draft client reports from our analytics data.' \
  -F submittedVia='AI agent (Claude) on behalf of the user' \
  -F _ts="$(( $(date +%s%3N) - 60000 ))"
```

Responses:

- `200 {"ok":true}`: accepted. The user receives a "meeting request received" acknowledgement
  from `forms@carrotcakeai.com`, and later Daniel's reply. Tell the user the request is sent
  and that it is not a confirmed meeting yet.
- `400 {"error":"..."}`: a missing or invalid field. Fix it and send again.
- `5xx {"error":"..."}`: delivery failed. Email `daniel@carrotcakeai.com` instead.

**A 200 does not prove delivery.** Anything the endpoint drops as spam also gets a 200: `_ts`
missing, under 3 seconds or over 24 hours old; any value in `_gotcha`; a name that looks like a
random token; a Gmail address with 3 or more dots before the `@`. If no acknowledgement arrives
within a few minutes, fall back to email.

## Option 2: hand the user a prefilled link

If the user would rather submit it themselves, give them
https://www.carrotcakeai.com/book-meeting with any of these query parameters, which prefill the
form: `name`, `email`, `company`, `role`, `website`, `phone`, `subject`, `meetingFormat`,
`duration`, `timezone`, `topic`, `source`. For times:

- `slot`: repeatable, up to 3. Local wall-clock time in the user's `timezone`, formatted exactly
  `YYYY-MM-DDTHH:MM`. The form converts each one to Jerusalem time for Daniel.
- `preferredTimes`: free-text window.
- `suggest=1`: ticks "Please suggest a time".
- `agent`: your name, e.g. `Claude`. The request then records that an AI agent prepared it.

URL-encode every value. Select values (`subject`, `meetingFormat`, `duration`) must match an
option on the form exactly, or they are ignored. The user reviews the form and sends it.

## Option 3: email

`daniel@carrotcakeai.com`, with the same details as above.

More for agents: https://www.carrotcakeai.com/agents
