---
name: book-meeting-with-daniel
description: Request a video or phone call with Daniel Rosehill (AI developer and technical communicator, Jerusalem, Israel; danielrosehill.com) on a user's behalf, or give the user a prefilled booking link. Use when a user wants to book, schedule or set up a meeting, call or chat with Daniel Rosehill. Unauthenticated - no account or API key needed.
---

# Book a meeting with Daniel Rosehill

Meetings are **requested, not instantly booked.** This is deliberate. The user proposes up
to three times, or asks Daniel to suggest one. Daniel reads every request and replies by email
with a calendar invitation. There is no public calendar of free slots to book against, so
never tell the user a meeting is confirmed until Daniel has replied.

Daniel wants to know **who** is asking and **why**. A request with a role, an organisation
or a profile link, and a few lines of context, is far more likely to get a quick yes.

Daniel is in Jerusalem (time zone `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, who they are (role,
   organisation, a website or LinkedIn link if they're happy to share it), the purpose, the format (video or
   phone), the length, up to three times that suit them (or that Daniel should suggest
   one), and a few lines on what the meeting is about and why.
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 site's own form at https://www.danielrosehill.com/book-meeting
posts to.

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

Use the `www.` host: the apex answers with a 307. No `Origin` header or API key is needed.

| 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 | Up to three proposed times, one per line, each with its date, time and the user's zone, e.g. `1. Wed 21 Oct 2026 15:00 Europe/London`. You can also give a window, or end with `Please suggest a time.` If the user has no preference, send just `Please suggest a time.` Converting each time to Jerusalem time as well, e.g. `(17:00 Jerusalem)`, helps Daniel. |
| `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 `Consulting or project work`, `Collaboration`, `AI models, datasets or research`, `Media, podcast or speaking`, `Hiring`, `Just to connect`, `Other`. |
| `role` | recommended | The user's job title. |
| `website` | no | The user's website or LinkedIn URL. This is not the honeypot, which is `_gotcha`. |
| `source` | no | How the user found Daniel. |
| `submittedVia` | yes, for agents | Say that an agent sent it, e.g. `AI agent (ChatGPT) on behalf of the user`. |
| `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. |
| `companyName` | no | The user's organisation. |
| `_ts` | yes | Unix time in milliseconds when the user started the request. It must be at least 3 seconds and at most 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.danielrosehill.com/api/contact \
  -F formType='Meeting request' \
  -F name='Jane Example' \
  -F email='jane@example.org' \
  -F companyName='Example Ltd' \
  -F meetingFormat='Video call' \
  -F duration='30 minutes' \
  -F role='Head of Operations' \
  -F website='https://www.linkedin.com/in/jane-example' \
  -F subject='Consulting or project work' \
  -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='Scoping a speech-to-text pilot for a bilingual call centre; we have Hebrew-English calls and poor ASR accuracy.' \
  -F submittedVia='AI agent (Claude) on behalf of the user' \
  -F _ts="$(( $(date +%s%3N) - 60000 ))"
```

Responses:

- `200 {"ok":true}`: accepted. The user receives an acknowledgement from
  `forms@danielrosehill.com` repeating the structured details (name, times, format and so on; not the topic text), and later Daniel's reply. Tell the user the request is
  sent and a confirmation will follow by email. It is not a confirmed meeting yet.
- `400 {"error":"..."}`: a missing or invalid field. Fix it and send again.
- `5xx {"error":"..."}`: delivery failed. Email `public@danielrosehill.com` instead.

**A 200 does not prove delivery.** Anything the endpoint drops as spam also gets a 200.
That happens when `_ts` is missing, less than 3 seconds old or more than 24 hours old,
when `_gotcha` has a value, when the name looks like a random token, or when the email is
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.danielrosehill.com/book-meeting with any of these query parameters, which
prefill the form: `name`, `email`, `companyName`, `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. `ChatGPT`. The request then records that an AI agent prepared it.

URL-encode every value. For example:

```
https://www.danielrosehill.com/book-meeting?name=Jane%20Example&email=jane%40example.org&role=CTO&subject=Collaboration&slot=2026-10-21T15:00&slot=2026-10-22T10:30&timezone=Europe%2FLondon&topic=Speech-to-text%20pilot&agent=ChatGPT
```

`subject`, `meetingFormat` and `duration` must match an option above exactly, or they are ignored.
The form asks one question per screen. Prefilled answers are kept, and it opens at the first
required question still empty (name, email, times, topic), or on its "Check your answers" screen
when all of those are filled. The user reviews the answers there and presses "Request meeting".

## Option 3: email

`public@danielrosehill.com`, with the same details as above.

## Business engagements

For consulting or project work, the user may prefer DSR Holdings directly:
https://www.dsrholdings.cloud/contact/meeting

More for agents: https://www.danielrosehill.com/contact/for-agents
