# Contacting Daniel Rosehill

No account or API key is needed. JSON version: https://agents.danielrosehill.com/contact.json

## Before you send anything

- Both actions email a real person. Show your user the exact content, get an explicit yes, and send once.
- Use the user's real name and the email they want the reply at. Never invent details or submit something the user did not ask for.
- Meetings are requested, not booked: the user proposes times and Daniel replies by email with a calendar invitation. Never tell the user a meeting is confirmed.
- Daniel does not have time to answer personal requests for technical help; say so before sending one.

## Send a message

`POST https://www.danielrosehill.com/api/contact` as multipart/form-data or application/x-www-form-urlencoded. Skill: https://agents.danielrosehill.com/.well-known/agent-skills/contact-daniel/SKILL.md

| Field | Required | Notes |
| --- | --- | --- |
| `name` | yes | The sender's real name. |
| `email` | yes | Where the reply and the acknowledgement go. |
| `contactType` | no | One of `Open Source`, `Business`, `Media`, `Just Saying Hi`. |
| `subject` | no | A short subject line. |
| `message` | no, but send one | Free text, up to 5,000 characters per field. |
| `_ts` | yes | Unix time in milliseconds when the user started the message. 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 message. |

Prefilled form for the user: https://www.danielrosehill.com/contact/form?name=&email=&contactType=&subject=&message=

## Request a meeting

Same endpoint with `formType=Meeting request`. Requested, not booked: Daniel (Asia/Jerusalem) replies by email with an invitation. Skill: https://agents.danielrosehill.com/.well-known/agent-skills/book-meeting-with-daniel/SKILL.md

| 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. |

Prefilled form: https://www.danielrosehill.com/book-meeting, parameters `name`, `email`, `companyName`, `role`, `website`, `phone`, `subject`, `meetingFormat`, `duration`, `timezone`, `topic`, `source`, and:
- `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.

## Responses

- 200 `{"ok":true}`: Accepted, and also what a spam drop returns. The sender gets an acknowledgement from forms@danielrosehill.com within minutes; if none arrives, fall back to email.
- 400 `{"error":"..."}`: Missing or invalid field (name and email are required; each field at most 5,000 characters). Fix and resend.
- 500 `{"error":"..."}`: Delivery failed (5xx). Email public@danielrosehill.com instead.

Silently dropped as spam, with a 200:
- _ts missing, less than 3 seconds or more than 24 hours before the POST (Unix milliseconds)
- any value in the _gotcha honeypot
- a name that is one run of 12 or more letters with 3 or more capitals after the first (a random token)
- a message with no spaces longer than 10 characters, or a random-token message
- a Gmail address with 3 or more dots before the @

## Other routes

- Email: public@danielrosehill.com
- MCP server: https://mcp.danielrosehill.com/mcp (streamable HTTP, no auth): `about_daniel`, `ask_about_daniel`, `get_resume`, `download_cv`, `search_projects`, `get_blog_posts`, `get_recommendations`, `send_message`, `request_meeting`
- Business (DSR Holdings): https://www.dsrholdings.cloud/contact/meeting
- linkedin: https://www.linkedin.com/in/danielrosehill
- github: https://github.com/danielrosehill
- vcard: https://www.danielrosehill.com/daniel-rosehill.vcf
- email and pgp: https://www.danielrosehill.com/contact/email
- contact page: https://www.danielrosehill.com/contact
